ng-kinintel 0.0.397 → 20.0.2

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 (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-kinintel.mjs","sources":["../../../projects/ng-kinintel/src/lib/kinintel-config.ts","../../../projects/ng-kinintel/src/lib/services/project.service.ts","../../../projects/ng-kinintel/src/lib/services/tag.service.ts","../../../projects/ng-kinintel/src/lib/services/dashboard.service.ts","../../../projects/ng-kinintel/src/lib/services/dataset.service.ts","../../../projects/ng-kinintel/src/lib/services/feed.service.ts","../../../projects/ng-kinintel/src/lib/services/datasource.service.ts","../../../projects/ng-kinintel/src/lib/services/external.service.ts","../../../projects/ng-kinintel/src/lib/services/data-processor.service.ts","../../../projects/ng-kinintel/src/lib/services/data-search.service.ts","../../../projects/ng-kinintel/src/lib/components/data-picker/data-picker.component.ts","../../../projects/ng-kinintel/src/lib/components/data-picker/data-picker.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/create-dataset/create-dataset.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/create-dataset/create-dataset.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.html","../../../projects/ng-kinintel/src/lib/services/alert.service.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.html","../../../projects/ng-kinintel/src/lib/components/data-explorer/change-source-warning/change-source-warning.component.ts","../../../projects/ng-kinintel/src/lib/components/data-explorer/change-source-warning/change-source-warning.component.html","../../../projects/ng-kinintel/src/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.ts","../../../projects/ng-kinintel/src/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/share-query/share-query.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/share-query/share-query.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-editor.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-editor.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/dataset-editor-popup.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/configure-item.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/configure-item/configure-item.component.html","../../../projects/ng-kinintel/src/lib/components/data-explorer/export-data/export-data.component.ts","../../../projects/ng-kinintel/src/lib/components/data-explorer/export-data/export-data.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/item-component/item-component.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/item-component/item-component.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.html","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-editor.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-editor.component.html","../../../projects/ng-kinintel/src/lib/components/task-time-periods/task-time-periods.component.ts","../../../projects/ng-kinintel/src/lib/components/task-time-periods/task-time-periods.component.html","../../../projects/ng-kinintel/src/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.ts","../../../projects/ng-kinintel/src/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.html","../../../projects/ng-kinintel/src/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.ts","../../../projects/ng-kinintel/src/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.html","../../../projects/ng-kinintel/src/lib/components/query-caching/edit-query-cache/edit-query-cache.component.ts","../../../projects/ng-kinintel/src/lib/components/query-caching/edit-query-cache/edit-query-cache.component.html","../../../projects/ng-kinintel/src/lib/components/query-caching/query-cache-view/query-cache-view.component.ts","../../../projects/ng-kinintel/src/lib/components/query-caching/query-cache-view/query-cache-view.component.html","../../../projects/ng-kinintel/src/lib/components/data-explorer/data-explorer.component.ts","../../../projects/ng-kinintel/src/lib/components/data-explorer/data-explorer.component.html","../../../projects/ng-kinintel/src/lib/components/metadata/metadata.component.ts","../../../projects/ng-kinintel/src/lib/components/metadata/metadata.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/datasource.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/datasource.component.html","../../../projects/ng-kinintel/src/lib/components/project-picker/project-picker.component.ts","../../../projects/ng-kinintel/src/lib/components/project-picker/project-picker.component.html","../../../projects/ng-kinintel/src/lib/components/tag-picker/tag-picker.component.ts","../../../projects/ng-kinintel/src/lib/components/tag-picker/tag-picker.component.html","../../../projects/ng-kinintel/src/lib/components/dashboards/dashboards.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboards/dashboards.component.html","../../../projects/ng-kinintel/src/lib/services/notification.service.ts","../../../projects/ng-kinintel/src/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.ts","../../../projects/ng-kinintel/src/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.html","../../../projects/ng-kinintel/src/lib/components/notification-groups/notification-groups.component.ts","../../../projects/ng-kinintel/src/lib/components/notification-groups/notification-groups.component.html","../../../projects/ng-kinintel/src/lib/components/alert-groups/alert-groups.component.ts","../../../projects/ng-kinintel/src/lib/components/alert-groups/alert-groups.component.html","../../../projects/ng-kinintel/src/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.ts","../../../projects/ng-kinintel/src/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.html","../../../projects/ng-kinintel/src/lib/components/snapshots/snapshots.component.ts","../../../projects/ng-kinintel/src/lib/components/snapshots/snapshots.component.html","../../../projects/ng-kinintel/src/lib/components/dashboards/view-dashboard/view-dashboard.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboards/view-dashboard/view-dashboard.component.html","../../../projects/ng-kinintel/src/lib/components/feeds/feed/feed.component.ts","../../../projects/ng-kinintel/src/lib/components/feeds/feed/feed.component.html","../../../projects/ng-kinintel/src/lib/components/feeds/feeds.component.ts","../../../projects/ng-kinintel/src/lib/components/feeds/feeds.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/import-data/import-data.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/import-data/import-data.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/api-access/api-access.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/api-access/api-access.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/create-datasource.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/create-datasource.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/document-datasource/document-datasource.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/document-datasource/document-datasource.component.html","../../../projects/ng-kinintel/src/lib/components/project-settings/project-link-selection/project-link-selection.component.ts","../../../projects/ng-kinintel/src/lib/components/project-settings/project-link-selection/project-link-selection.component.html","../../../projects/ng-kinintel/src/lib/components/project-settings/project-settings.component.ts","../../../projects/ng-kinintel/src/lib/components/project-settings/project-settings.component.html","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.ts","../../../projects/ng-kinintel/src/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.html","../../../projects/ng-kinintel/src/lib/components/marketplace/marketplace.component.ts","../../../projects/ng-kinintel/src/lib/components/marketplace/marketplace.component.html","../../../projects/ng-kinintel/src/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.ts","../../../projects/ng-kinintel/src/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.html","../../../projects/ng-kinintel/src/lib/components/shared-with-me/shared-with-me.component.ts","../../../projects/ng-kinintel/src/lib/components/shared-with-me/shared-with-me.component.html","../../../projects/ng-kinintel/src/lib/components/query-caching/query-caching.component.ts","../../../projects/ng-kinintel/src/lib/components/query-caching/query-caching.component.html","../../../projects/ng-kinintel/src/lib/components/data-sharing-invite/data-sharing-invite.component.ts","../../../projects/ng-kinintel/src/lib/components/data-sharing-invite/data-sharing-invite.component.html","../../../projects/ng-kinintel/src/lib/components/export-project/export-project.component.ts","../../../projects/ng-kinintel/src/lib/components/export-project/export-project.component.html","../../../projects/ng-kinintel/src/lib/guards/dashboard-changes.guard.ts","../../../projects/ng-kinintel/src/lib/objects/action-event.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.ts","../../../projects/ng-kinintel/src/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.html","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/available-columns/available-columns.component.ts","../../../projects/ng-kinintel/src/lib/components/dataset/dataset-editor/available-columns/available-columns.component.html","../../../projects/ng-kinintel/src/lib/components/job-tasks/job-tasks.component.ts","../../../projects/ng-kinintel/src/lib/components/job-tasks/job-tasks.component.html","../../../projects/ng-kinintel/src/lib/components/data-search/data-search.component.ts","../../../projects/ng-kinintel/src/lib/components/data-search/data-search.component.html","../../../projects/ng-kinintel/src/lib/ng-kinintel.module.ts","../../../projects/ng-kinintel/src/public-api.ts","../../../projects/ng-kinintel/src/ng-kinintel.ts"],"sourcesContent":["export interface KinintelModuleConfig {\n backendURL: string;\n guestURL?: string;\n externalURL?: string;\n tagLabel?: string;\n tagMenuLabel?: string;\n dataSearchTypeMapping?: any;\n}\n\nimport { InjectionToken } from '@angular/core';\n\nexport const KININTEL_CONFIG = new InjectionToken<KinintelModuleConfig>('KinintelModuleConfig');\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {BehaviorSubject} from 'rxjs';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport {AuthenticationService} from 'ng-kiniauth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ProjectService {\n\n public activeProject = new BehaviorSubject(null);\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private authService: AuthenticationService) {\n\n const activeProject = localStorage.getItem('activeProject');\n if (activeProject) {\n this.setActiveProject(JSON.parse(activeProject));\n }\n }\n\n public getProjects(filterString = '', limit= 10, offset= 0, accountId?) {\n const params: any = {filterString, limit: limit.toString(), offset: offset.toString()};\n if (accountId) {\n params.accountId = accountId;\n }\n return this.http.get(this.config.backendURL + '/project', {params});\n }\n\n public getProject(key) {\n return this.http.get(this.config.backendURL + '/project/' + key).toPromise();\n }\n\n public createProject(name, description, accountId?) {\n let url = `${this.config.backendURL}/project`;\n if (accountId) {\n url = url + '?accountId=' + accountId;\n }\n return this.http.post(url, {name, description}).toPromise();\n }\n\n public updateProject(name: string, description: string, key: string) {\n return this.http.put(this.config.backendURL + '/project/' + key, {\n name, description\n }).toPromise();\n }\n\n public removeProject(key, accountId?) {\n let url = this.config.backendURL + '/project/' + key;\n if (accountId) {\n url = url + '?accountId=' + accountId;\n }\n return this.http.delete(url).toPromise();\n }\n\n public async updateProjectSettings(projectKey, settings) {\n await this.http.put(this.config.backendURL + '/project/' + projectKey + '/settings', settings)\n .toPromise();\n const project = await this.getProject(projectKey);\n this.setActiveProject(project);\n return project;\n }\n\n public setActiveProject(project) {\n this.activeProject.next(project);\n localStorage.setItem('activeProject', JSON.stringify(project));\n }\n\n public resetActiveProject() {\n this.activeProject.next(null);\n localStorage.removeItem('activeProject');\n }\n\n public isActiveProjectAdmin() {\n const session = this.authService.sessionData.getValue();\n if (session && session.privileges) {\n const projectKey = this.activeProject.getValue() ? this.activeProject.getValue().projectKey : null;\n const privileges = session.privileges.PROJECT;\n\n if (privileges['*']) {\n return true;\n }\n\n return privileges[projectKey] ? privileges[projectKey].indexOf('*') > -1 : false;\n }\n return false;\n }\n\n public doesActiveProjectHavePrivilege(privilegeKey: string) {\n const session: any = this.authService.sessionData.getValue();\n if (session && session.privileges) {\n const projectKey = this.activeProject.getValue() ? this.activeProject.getValue().projectKey : null;\n const privileges = session.privileges.PROJECT;\n\n const scope = (privileges['*'] || privileges[projectKey]) || [];\n\n return scope.indexOf('*') > -1 || scope.indexOf(privilegeKey) > -1;\n }\n return false;\n }\n\n public canAccountManageProjects() {\n const session: any = this.authService.sessionData.getValue();\n if (session && session.privileges) {\n const privileges = session.privileges.ACCOUNT;\n\n const scope = (privileges['*'] || privileges[session.account.accountId]) || [];\n\n return scope.indexOf('*') > -1 || scope.indexOf('projectmanager') > -1;\n }\n return false;\n }\n\n public setDataItemPagingValue(limit, offset, page, itemName?) {\n const projectKey = this.activeProject.getValue() ? this.activeProject.getValue().projectKey : '';\n itemName = itemName || window.location.pathname + projectKey;\n sessionStorage.setItem(itemName + 'Limit', String(limit));\n sessionStorage.setItem(itemName + 'Offset', String(offset));\n sessionStorage.setItem(itemName + 'Page', String(page));\n }\n\n public getDataItemPagingValues(itemName?) {\n const projectKey = this.activeProject.getValue() ? this.activeProject.getValue().projectKey : '';\n itemName = itemName || window.location.pathname + projectKey;\n const values: any = {};\n\n const limitValue = sessionStorage.getItem(itemName + 'Limit');\n if (limitValue) {\n values.limit = Number(limitValue);\n }\n\n const offsetValue = sessionStorage.getItem(itemName + 'Offset');\n if (offsetValue) {\n values.offset = Number(offsetValue);\n }\n\n const pageValue = sessionStorage.getItem(itemName + 'Page');\n if (pageValue) {\n values.page = Number(pageValue);\n }\n\n return values;\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from './project.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TagService {\n\n public activeTag = new BehaviorSubject(null);\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private projectService: ProjectService) {\n\n const activeTag = localStorage.getItem('activeTag');\n if (activeTag) {\n this.setActiveTag(JSON.parse(activeTag));\n }\n }\n\n public getTags(filterString = '') {\n const activeProject = this.projectService.activeProject.getValue();\n return this.http.get(this.config.backendURL + '/metadata/tag', {\n params: {\n filterString,\n projectKey: activeProject ? activeProject.projectKey : ''\n }\n });\n }\n\n public saveTag(tag, description) {\n const activeProject = this.projectService.activeProject.getValue();\n const key = activeProject ? activeProject.projectKey : '';\n return this.http.post(this.config.backendURL + '/metadata/tag?projectKey=' + key, {\n tag, description\n }).toPromise();\n }\n\n public removeTag(key) {\n const activeProject = this.projectService.activeProject.getValue();\n const projectKey = activeProject ? activeProject.projectKey : '';\n return this.http.delete(this.config.backendURL + '/metadata/tag?projectKey=' + key, {\n params: {\n key, projectKey\n }\n }).toPromise();\n }\n\n public setActiveTag(tag) {\n localStorage.setItem('activeTag', JSON.stringify(tag));\n this.activeTag.next(tag);\n }\n\n public resetActiveTag() {\n localStorage.removeItem('activeTag');\n this.activeTag.next(null);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {TagService} from './tag.service';\nimport {ProjectService} from './project.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport {BehaviorSubject} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardService {\n\n public dashboardItems = new BehaviorSubject({});\n public dirtyDashboard = new BehaviorSubject(false);\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private tagService: TagService,\n private projectService: ProjectService) {\n }\n\n public getDashboard(id) {\n return this.http.get(`${this.config.backendURL}/dashboard/${id}`).toPromise();\n }\n\n public copyDashboard(id) {\n return this.http.get(`${this.config.backendURL}/dashboard/copy/${id}`).toPromise();\n }\n\n public extendDashboard(id) {\n return this.http.get(`${this.config.backendURL}/dashboard/extend/${id}`).toPromise();\n }\n\n public getDashboards(filterString = '', limit = '10', offset = '0', accountId: any = '', categories = [], tags?) {\n tags = tags || (this.tagService.activeTag.getValue() ? this.tagService.activeTag.getValue().key : 'NONE');\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n const suffix = this.config.backendURL.indexOf('/account') && accountId === null ? '/shared/all' : '';\n return this.http.get(this.config.backendURL + '/dashboard' + suffix, {\n params: {\n filterString, limit, offset, tags, projectKey, accountId, categories: categories.join(',')\n }\n });\n }\n\n public saveDashboard(dashboardSummary, accountId = null) {\n const tags = this.tagService.activeTag.getValue() || null;\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n if (tags) {\n dashboardSummary.tags = [tags];\n }\n\n const url = this.config.backendURL + '/dashboard?projectKey=' + projectKey + '&accountId=' + accountId;\n\n return this.http.post(url, dashboardSummary).toPromise();\n }\n\n public updateMetadata(dashboardSearchResult) {\n return this.http.patch(this.config.backendURL + '/dashboard', dashboardSearchResult).toPromise();\n }\n\n public getDashboardCategories(shared?) {\n const tag = this.tagService.activeTag.getValue() || null;\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n let tags = '';\n\n if (tag) {\n tags = tag.key;\n }\n const url = shared ? '/dashboard/shared/inUseCategories' : '/dashboard/inUseCategories';\n return this.http.get(this.config.backendURL + url, {\n params: {projectKey, tags}\n }).toPromise();\n }\n\n public removeDashboard(id) {\n return this.http.delete(this.config.backendURL + '/dashboard/' + id).toPromise();\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {TagService} from './tag.service';\nimport {ProjectService} from './project.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {map, switchMap} from 'rxjs/operators';\nimport {interval} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatasetService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private tagService: TagService,\n private projectService: ProjectService) {\n }\n\n public getDatasets(filterString = '', limit = '10', offset = '0', accountId = '', type = '', categories = [], tags?) {\n tags = tags || (this.tagService.activeTag.getValue() ? this.tagService.activeTag.getValue().key : 'NONE');\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n const suffix = this.config.backendURL.indexOf('/account') && accountId === null ? '/shared/all' : '';\n return this.http.get(this.config.backendURL + '/dataset' + suffix, {\n params: {\n filterString, limit, offset, tags, projectKey, accountId, type, categories: categories.join(',')\n }\n });\n }\n\n\n /**\n * Get account shared datasets\n *\n * @param filterString\n * @param limit\n * @param offset\n */\n public getAccountSharedDatasets(filterString = '', limit = 10, offset = 0) {\n\n return this.http.get(this.config.backendURL + '/dataset/shared', {\n params: {\n filterString, limit, offset\n }\n });\n }\n\n\n public getDataset(id) {\n return this.http.get(`${this.config.backendURL}/dataset/${id}`).toPromise()\n .then((dataset: any) => {\n if (dataset.readOnly) {\n dataset.id = dataset.title = null;\n return dataset;\n }\n return dataset;\n });\n }\n\n public getExtendedDataset(id) {\n return this.http.get(`${this.config.backendURL}/dataset/extended/${id}`).toPromise();\n }\n\n public saveDataset(datasetInstanceSummary, accountId = null): Promise<number> {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : null;\n const activeTag = this.tagService.activeTag.getValue() || null;\n if (activeTag) {\n datasetInstanceSummary.tags = [activeTag];\n }\n return this.http.post(this.config.backendURL + '/dataset/' + (projectKey ? '?projectKey=' + projectKey + '&' : '?') + 'accountId=' + accountId,\n datasetInstanceSummary).toPromise().then((id: number) => {\n return id;\n });\n }\n\n public removeDataset(id) {\n return this.http.delete(this.config.backendURL + '/dataset/' + id).toPromise();\n }\n\n public getEvaluatedParameters(datasetInstanceSummary) {\n return this.http.post(this.config.backendURL + '/dataset/parameters', datasetInstanceSummary)\n .toPromise().catch(err => []);\n }\n\n public evaluateDataset(datasetInstanceSummary, offset = '0', limit = '25') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.post(this.config.backendURL + `/dataset/evaluate?limit=${limit}&offset=${offset}&projectKey=${projectKey}`,\n datasetInstanceSummary).toPromise();\n }\n\n public evaluateDatasetWithTracking(datasetInstanceSummary, offset = '0', limit = '25', trackingKey = '') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.post(this.config.backendURL + `/dataset/evaluate?limit=${limit}&offset=${offset}&trackingKey=${trackingKey}&projectKey=${projectKey}`,\n datasetInstanceSummary);\n }\n\n public getDataTrackingResults(trackingKey) {\n return interval(2000)\n .pipe(\n switchMap(() =>\n this.http.get(this.config.backendURL + `/dataset/results/${trackingKey}`).pipe(\n map(result => {\n return result;\n }))\n )\n );\n }\n\n public exportDataset(exportDataset) {\n return this.http.post(this.config.backendURL + `/dataset/export`, exportDataset,\n {responseType: 'blob'})\n .toPromise();\n }\n\n\n /**\n * Set shared access for a dataset instance for the logged in account\n *\n * @param datasetInstanceId\n * @param shared\n */\n public async setSharedAccessForDatasetInstanceForLoggedInAccount(datasetInstanceId, shared) {\n return this.http.post(this.config.backendURL + `/dataset/shareWithCurrentAccount/${datasetInstanceId}/${shared}`, {}).toPromise();\n }\n\n\n public async getSharedAccessGroupsForDatasetInstance(datasetInstanceId) {\n return this.http.get(this.config.backendURL + `/dataset/sharedAccessGroups/${datasetInstanceId}`).toPromise();\n }\n\n public async revokeAccessToGroupForDatasetInstance(datasetInstanceId, accessGroup) {\n return this.http.delete(this.config.backendURL + `/dataset/sharedAccessGroups/${datasetInstanceId}`,\n {body: JSON.stringify(accessGroup)}).toPromise();\n }\n\n\n public async getInvitedAccessGroupsForDatasetInstance(datasetInstanceId) {\n return this.http.get(this.config.backendURL + `/dataset/invitedAccessGroups/${datasetInstanceId}`).toPromise();\n }\n\n\n public async inviteAccountToShareDatasetInstance(datasetInstanceId, accountExternalIdentifier, expiryDate = null) {\n let path = `/dataset/invitedAccessGroups/${datasetInstanceId}/${accountExternalIdentifier}`;\n if (expiryDate) path += '?expiryDate=' + expiryDate;\n return this.http.get(this.config.backendURL + path).toPromise();\n }\n\n\n public async cancelInvitationForAccessGroupForDatasetInstance(datasetInstanceId, accessGroup) {\n return this.http.delete(this.config.backendURL + `/dataset/invitedAccessGroups/${datasetInstanceId}`,\n {body: JSON.stringify(accessGroup)}).toPromise();\n }\n\n\n // Get a sharable item for an invitation\n public async getSharableItemForInvitation(invitationCode) {\n return this.http.get(this.config.guestURL + `/sharing/${invitationCode}`).toPromise();\n }\n\n\n // Accept a sharing invitation using an invitation code.\n public async acceptSharingInvitation(invitationCode) {\n this.http.post(this.config.guestURL + `/sharing/${invitationCode}`, {}).toPromise();\n }\n\n // Accept a sharing invitation using an invitation code.\n public async cancelSharingInvitation(invitationCode) {\n this.http.delete(this.config.guestURL + `/sharing/${invitationCode}`).toPromise();\n }\n\n\n public listSnapshotProfiles(filterString = '', limit = '10', offset = '0', tags?) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n const activeTag = tags || (this.tagService.activeTag.getValue() ? this.tagService.activeTag.getValue().key : '');\n\n return this.http.get(this.config.backendURL + '/dataset/snapshotprofile', {\n params: _.omitBy({filterString, limit, offset, tags: activeTag, projectKey}, _.isNil)\n });\n }\n\n public getSnapshotProfile(id: number) {\n return this.http.get(this.config.backendURL + '/dataset/snapshotprofile/' + id)\n .toPromise();\n }\n\n public getSnapshotProfilesForDataset(datasetInstanceId: number) {\n return this.http.get(this.config.backendURL + '/dataset/snapshotprofile/dataset/' + datasetInstanceId)\n .toPromise();\n }\n\n public saveSnapshotProfile(snapshotProfileSummary, datasetInstanceId) {\n return this.http.post(this.config.backendURL + '/dataset/snapshotprofile/' + datasetInstanceId,\n snapshotProfileSummary)\n .toPromise();\n }\n\n public removeSnapshotProfile(snapshotProfileId, datasetInstanceId) {\n return this.http.delete(this.config.backendURL + '/dataset/snapshotprofile/' + datasetInstanceId,\n {params: {snapshotProfileId}})\n .toPromise();\n }\n\n public triggerSnapshot(snapshotProfileId, datasetInstanceId) {\n return this.http.patch(this.config.backendURL + '/dataset/snapshotprofile/' + datasetInstanceId,\n snapshotProfileId)\n .toPromise();\n }\n\n public updateMetadata(dashboardSearchResult) {\n return this.http.patch(this.config.backendURL + '/dataset', dashboardSearchResult).toPromise();\n }\n\n public getDatasetCategories(shared?) {\n const tag = this.tagService.activeTag.getValue() || null;\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n let tags = '';\n\n if (tag) {\n tags = tag.key;\n }\n const url = shared ? '/dataset/shared/inUseCategories' : '/dataset/inUseCategories';\n return this.http.get(this.config.backendURL + url, {\n params: {projectKey, tags}\n }).toPromise();\n }\n\n public getWhiteListedSQLFunctions() {\n return this.http.get(this.config.backendURL + '/dataset/whitelistedsqlfunctions')\n .toPromise();\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {TagService} from './tag.service';\nimport {ProjectService} from './project.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeedService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private tagService: TagService,\n private projectService: ProjectService) {\n }\n\n public getFeed(id) {\n return this.http.get(this.config.backendURL + '/feed/' + id).toPromise();\n }\n\n public listFeeds(filterString = '', limit = '10', offset = '0') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : null;\n\n return this.http.get(this.config.backendURL + '/feed', {\n params: _.omitBy({filterString, limit, offset, projectKey}, _.isNil)\n });\n }\n\n public isFeedURLAvailable(feedUrl, currentItemId = null) {\n return this.http.get(this.config.backendURL + '/feed/available', {\n params: _.omitBy({feedUrl, currentItemId}, _.isNil)\n }).toPromise();\n }\n\n public saveFeed(feed) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.post(this.config.backendURL + '/feed?projectKey=' + projectKey, feed)\n .toPromise();\n }\n\n public deleteFeed(id) {\n return this.http.delete(this.config.backendURL + '/feed/' + id).toPromise();\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport {ProjectService} from '../services/project.service';\nimport {interval, of} from 'rxjs';\nimport {catchError, map, switchMap} from 'rxjs/operators';\n\nexport interface DatasourceUpdate {\n title: string;\n instanceImportKey?: string;\n fields: any[];\n adds: any[];\n updates: any[];\n deletes: any[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatasourceService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n public createCustomDatasource(datasourceUpdate: DatasourceUpdate): Promise<any> {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.post(this.config.backendURL + '/datasource/custom?projectKey=' + projectKey, datasourceUpdate)\n .toPromise();\n }\n\n public updateCustomDatasource(datasourceInstanceKey, datasourceUpdate: DatasourceUpdate | any) {\n return this.http.put(this.config.backendURL + '/datasource/custom/' + datasourceInstanceKey, datasourceUpdate)\n .toPromise();\n }\n\n public getDatasources(filterString = '', limit = '10', offset = '0', noProject = false, projectKey = '') {\n const project = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.get(this.config.backendURL + '/datasource?projectKey=' + (noProject ? '' : projectKey || project), {\n params: {\n filterString, limit, offset\n }\n });\n }\n\n public getDatasource(key) {\n return this.http.get(this.config.backendURL + '/datasource/' + key).toPromise();\n }\n\n public deleteDatasource(key) {\n return this.http.delete(this.config.backendURL + '/datasource/' + key).toPromise();\n }\n\n public deleteFromDatasource(datasourceInstanceKey: string, filter: any = []) {\n return this.http.delete(this.config.backendURL + '/datasource/custom/' + datasourceInstanceKey, {\n body: filter\n }).toPromise();\n }\n\n public getEvaluatedParameters(evaluatedDatasource) {\n return this.http.get(this.config.backendURL + '/datasource/parameters/' +\n (evaluatedDatasource.key || evaluatedDatasource.datasourceInstanceKey)).toPromise();\n }\n\n public evaluateDatasource(evaluatedDatasource) {\n return this.http.post(this.config.backendURL + '/datasource/evaluate', evaluatedDatasource).toPromise();\n }\n\n public exportData(evaluatedDatasource) {\n return this.http.post(this.config.backendURL + '/datasource/parameters/' +\n (evaluatedDatasource.key || evaluatedDatasource.datasourceInstanceKey),\n {transformationInstances: evaluatedDatasource.transformationInstances}).toPromise();\n }\n\n public createDocumentDatasource(config) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.post(this.config.backendURL + '/datasource/document?projectKey=' + projectKey,\n config)\n .toPromise();\n }\n\n public updateDatasourceInstance(key, config) {\n return this.http.put(this.config.backendURL + '/datasource/' + key, config).toPromise();\n }\n\n public updateCustomDatasourceInstance(key, config) {\n return this.http.patch(this.config.backendURL + '/datasource/custom/' + key, config).toPromise();\n }\n\n public uploadDatasourceDocuments(key, uploadedFiles, trackingKey) {\n const HttpUploadOptions = {\n headers: new HttpHeaders({ 'Content-Type': 'file' })\n };\n return this.http.post(this.config.backendURL + '/datasource/document/upload/' + key + '?trackingKey=' + trackingKey,\n uploadedFiles, HttpUploadOptions).toPromise();\n }\n\n public getDataTrackingResults(trackingKey) {\n return interval(2000)\n .pipe(\n switchMap(() =>\n this.http.get(this.config.backendURL + `/datasource/document/upload/tracking`, {\n params: {trackingKey}\n }).pipe(\n map(result => {\n return result;\n }),\n catchError(err => {\n return of(null);\n }))\n )\n );\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ExternalService {\n\n constructor(private http: HttpClient,\n @Inject(KININTEL_CONFIG) private config: KinintelModuleConfig) {\n }\n\n public getDashboard(id, params) {\n const url = `${this.config.externalURL}/externalDashboard/${id}`;\n\n return this.http.get(url, {params}).toPromise();\n }\n\n public evaluateDataset(dashboardId, datasetInstanceKey, parameterValues: any = {}, offset = '0', limit = '25', queryParams: any) {\n queryParams.limit = limit;\n queryParams.offset = offset;\n\n return this.http.post(`${this.config.externalURL}/externalDashboard/evaluateDashboardDataset/${dashboardId}/${datasetInstanceKey}`,\n parameterValues, {params: queryParams}).toPromise();\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from '../services/project.service';\nimport * as lodash from 'lodash';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nconst _ = lodash.default;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataProcessorService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n\n public filterProcessorsByType(type: string = '', searchTerm = '', limit = '10', offset = '0', tags?) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.get(this.config.backendURL + '/dataprocessor/type/' + type, {\n params: _.omitBy({searchTerm, projectKey, limit, offset}, _.isNil)\n });\n }\n\n public getProcessor(key: string) {\n return this.http.get(this.config.backendURL + '/dataprocessor/' + key)\n .toPromise();\n }\n\n public filterProcessorsByRelatedItem(type: string = '', relatedType = '', itemId: number, promise = true): any {\n const request = this.http.get(this.config.backendURL + '/dataprocessor/relatedobject/' + type + '/' + relatedType + '/' + itemId);\n return promise ? request.toPromise() : request;\n }\n\n public saveProcessor(processorSummary, autoStart = false) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n let url = this.config.backendURL + '/dataprocessor?projectKey=' + projectKey;\n\n if (autoStart) {\n url += '&autoStart=true';\n }\n\n return this.http.post(url, processorSummary).toPromise();\n }\n\n public removeProcessor(processorKey) {\n return this.http.delete(this.config.backendURL + '/dataprocessor',\n {body: JSON.stringify(processorKey)})\n .toPromise();\n }\n\n public triggerProcessor(processorKey) {\n return this.http.patch(this.config.backendURL + '/dataprocessor/' + processorKey, null)\n .toPromise();\n }\n\n\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from './project.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataSearchService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n public searchForDataItems(filters: {}, limit = 100, offset = 0) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.post(this.config.backendURL + '/datasearch', filters, {\n params: {offset, limit, projectKey}\n });\n }\n\n public getMatchingDataItemTypesForSearchTerm(searchTerm = '') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.get(this.config.backendURL + '/datasearch/types', {\n params: {searchTerm, projectKey}\n }).toPromise();\n }\n}\n","import {Component, EventEmitter, Inject, Input, OnInit, Output} from '@angular/core';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport * as lodash from 'lodash';\nimport {DataSearchService} from '../../services/data-search.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-data-picker',\n templateUrl: './data-picker.component.html',\n styleUrls: ['./data-picker.component.sass'],\n standalone: false\n})\nexport class DataPickerComponent implements OnInit {\n\n @Input() admin: boolean;\n @Input() typeMapping: any;\n\n @Output() selected = new EventEmitter();\n\n public Object = Object;\n public _ = _;\n public searchText = new BehaviorSubject('');\n public data: any = [];\n public page = 1;\n public limit = 100;\n public offset = 0;\n public endOfResults = false;\n public reload = new Subject();\n public types: any = [];\n public selectedType = new BehaviorSubject(null);\n\n\n constructor(private dataSearchService: DataSearchService,\n @Inject(KININTEL_CONFIG) private config: KinintelModuleConfig) {\n }\n\n ngOnInit(): void {\n this.typeMapping = this.config.dataSearchTypeMapping ? _.orderBy(this.config.dataSearchTypeMapping, 'order') : null;\n\n merge(this.searchText, this.reload, this.selectedType)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe(async (datasets: any) => {\n this.types = await this.dataSearchService.getMatchingDataItemTypesForSearchTerm(this.searchText.getValue() || '');\n this.endOfResults = datasets.length < this.limit;\n this.data = datasets;\n });\n }\n\n public select(action) {\n this.selected.next(action);\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n private getDatasets() {\n return this.dataSearchService.searchForDataItems(\n {search: this.searchText.getValue() || '', type: this.selectedType.getValue() || null},\n this.limit,\n this.offset\n ).pipe(map((datasets: any) => {\n return datasets;\n })\n );\n }\n\n}\n","<div class=\"flex flex-col h-full\">\n\n <div class=\"relative bg-white flex items-center focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" class=\"block w-full rounded-none pl-10 border-r-0 border-l-0\"\n placeholder=\"Search for available data items\"\n (keyup)=\"searchText.next($event.target.value)\">\n\n </div>\n\n <div class=\"flex w-full overflow-hidden flex-grow\">\n <div class=\"w-64 border-r\">\n <div class=\"menu-items\">\n <a (click)=\"selectedType.next(null)\" class=\"menu-item\"\n [class]=\"{active: selectedType.getValue() === null}\">\n <span class=\"material-symbols-outlined\">clear_all</span>\n <span>Show All</span>\n </a>\n\n @for (mapping of typeMapping; track mapping) {\n @for (type of types; track type) {\n @if (mapping.key === type.memberValue) {\n <a (click)=\"selectedType.next(type.memberValue)\"\n class=\"menu-item\"\n [class]=\"{active: selectedType.getValue() === type.memberValue}\">\n <div class=\"flex items-center justify-between w-full pr-2\">\n <div class=\"flex items-center\">\n <span class=\"material-symbols-outlined {{mapping.class}}\">{{ mapping.icon }}</span>\n <span>{{ mapping.label }}</span>\n </div>\n <div class=\"bg-primary rounded-full px-1.5 py-0 text-white text-xs\">\n {{type.expressionValue}}\n </div>\n </div>\n </a>\n }\n }\n }\n\n </div>\n </div>\n <div class=\"flex flex-col justify-between w-full overflow-y-scroll\">\n <table class=\"w-full border-collapse table-fixed\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 w-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Name\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (dataItem of data; track dataItem) {\n <tr>\n <td class=\"whitespace-normal border-b border-gray-200 py-2 pl-4 text-sm font-medium text-gray-900\">\n @if (_.find(typeMapping, {key: dataItem.type})) {\n <span class=\"material-symbols-outlined text-gray-300 {{_.find(typeMapping, {key: dataItem.type}).class}}\">{{_.find(typeMapping, {key: dataItem.type}).icon}}</span>\n }\n </td>\n <td class=\"whitespace-normal border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"flex h-10 justify-center flex-col\">\n <div>{{ dataItem.title || dataItem.fullTitle }}</div>\n @if (dataItem.description) {\n <div\n class=\"text-gray-400 font-thin w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap\">\n {{ dataItem.description }}\n </div>\n }\n </div>\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n @for (action of dataItem.actionItems; track action) {\n <button mat-button color=\"primary\" (click)=\"select(action)\">\n {{ action.title }}\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n </div>\n\n </div>\n <div class=\"bg-gray-100 py-2 px-4 flex align-center justify-between\">\n <div class=\"text-xs text-gray-400\">\n Showing {{ data.length ? (offset + 1) : 0 }}\n - {{ (page * limit) - (limit - data.length) }}\n </div>\n <div class=\"flex items-center justify-center\">\n <select [value]=\"limit\"\n (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-2\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\"\n [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport {DatasetService} from '../../../services/dataset.service';\n\n@Component({\n selector: 'ki-create-dataset',\n templateUrl: './create-dataset.component.html',\n styleUrls: ['./create-dataset.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class CreateDatasetComponent implements OnInit {\n\n public admin: boolean;\n\n constructor(public dialogRef: MatDialogRef<CreateDatasetComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasourceService: DatasourceService,\n private datasetService: DatasetService) {\n }\n\n ngOnInit(): void {\n this.admin = !!this.data.admin;\n }\n\n public async select(action) {\n let selectedSource;\n\n if (action.datasourceKey) {\n selectedSource = {\n datasetInstanceId: null,\n datasourceInstanceKey: action.datasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n };\n } else if (action.datasetId) {\n selectedSource = await this.datasetService.getExtendedDataset(action.datasetId);\n }\n\n this.dialogRef.close(selectedSource);\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Select Data Source</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n\n <ki-data-picker [admin]=\"admin\" (selected)=\"select($event)\"></ki-data-picker>\n\n </div>\n\n <div class=\"dialog-footer\">\n\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n </div>\n\n</div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef,\n MatDialog\n} from '@angular/material/dialog';\nimport {CreateDatasetComponent} from '../../../../dataset/create-dataset/create-dataset.component';\nimport {DatasetService} from '../../../../../services/dataset.service';\n\n@Component({\n selector: 'ki-dataset-add-parameter',\n templateUrl: './dataset-add-parameter.component.html',\n styleUrls: ['./dataset-add-parameter.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetAddParameterComponent implements OnInit {\n\n public parameter: any = {type: 'text', multiple: false, defaultValue: null, settings: {}};\n public sourceColumns: string[] = [];\n\n public readonly _ = _;\n\n private updateName = true;\n\n constructor(public dialogRef: MatDialogRef<DatasetAddParameterComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dialog: MatDialog,\n private datasetService: DatasetService) {\n }\n\n ngOnInit(): void {\n if (this.data && this.data.parameter) {\n this.parameter = this.data.parameter;\n this.updateName = !this.parameter.name;\n\n if (this.parameter.settings && this.parameter.settings.datasetInstance) {\n this.evaluateDataset(this.parameter.settings.datasetInstance);\n }\n }\n }\n\n public setName() {\n if (this.updateName) {\n this.parameter.name = _.camelCase(this.parameter.title);\n }\n }\n\n public selectDatasource() {\n if (!this.parameter.settings || Array.isArray(this.parameter.settings)) {\n this.parameter.settings = {};\n }\n\n const dialogRef = this.dialog.open(CreateDatasetComponent, {\n width: '1200px',\n height: '800px',\n data: {}\n });\n dialogRef.afterClosed().subscribe(async res => {\n if (res) {\n this.evaluateDataset(res);\n }\n });\n }\n\n public multipleStatusUpdated() {\n if (this.parameter.multiple) {\n this.parameter.value = Array.isArray(this.parameter.value) ? this.parameter.value : (this.parameter.value ? [this.parameter.value] : []);\n } else {\n this.parameter.value = Array.isArray(this.parameter.value) && this.parameter.value.length ? this.parameter.value[0] : '';\n }\n }\n\n private async evaluateDataset(datasetInstance: any) {\n const data: any = await this.datasetService.evaluateDataset(datasetInstance, '0', '1');\n this.parameter.settings.datasetInstance = datasetInstance;\n this.sourceColumns = _.map(data.columns, 'name');\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>New Parameter</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-4\">\n\n <div class=\"border-t bg-blue-50 p-4 -mt-4 -mx-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Parameters allow you to create a dynamic field that can be used within your queries. Once\n created you can access the value of your parameter in Filters etc using\n the {{'{{' + 'parameterName' + '\\}\\}'}}\n value.\n </p>\n\n </div>\n </div>\n </div>\n\n <div class=\"space-y-6 pt-4\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Parameter Information</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Enter the following details to setup your parameter.</p>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Enter the title for this parameter <span class=\"text-red-600\">*</span></label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" [(ngModel)]=\"parameter.title\" (ngModelChange)=\"setName()\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Name for this parameter\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" [(ngModel)]=\"parameter.name\" disabled\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n\n @if (parameter.name && parameter.name !== _.camelCase(parameter.title)) {\n <div class=\"border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n <b>Note:</b> Changing the parameter title will not change the parameter name.<br>To access\n this parameter value please continue to use <b>{{'{{' + parameter.name + '\\}\\}'}}</b>\n </p>\n </div>\n </div>\n </div>\n }\n\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Enter the field type for this parameter\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"parameter.type\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n <option value=\"text\">Text</option>\n <option value=\"numeric\">Numeric</option>\n <option value=\"date\">Date</option>\n <option value=\"datetime\">Datetime</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"list\">List</option>\n </select>\n </div>\n </div>\n\n @if (parameter.type === 'list') {\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Select Datasource\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0 flex items-center\">\n <button mat-flat-button color=\"primary\" (click)=\"selectDatasource()\">\n Select Datasource\n </button>\n @if (parameter.settings && parameter.settings.datasetInstance) {\n <div\n class=\"text-gray-500 ml-4\">\n {{parameter.settings.datasetInstance.title}}\n </div>\n }\n </div>\n </div>\n @if (sourceColumns.length) {\n <div class=\"flex items-center justify-between\">\n <div class=\"mr-2 flex-1\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Label column\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"parameter.settings.labelColumn\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n @for (column of sourceColumns; track column) {\n <option [value]=\"column\">\n {{_.startCase(column)}}\n </option>\n }\n </select>\n </div>\n </div>\n <div class=\"ml-2 flex-1\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Value column\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"parameter.settings.valueColumn\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n @for (column of sourceColumns; track column) {\n <option [value]=\"column\">\n {{_.startCase(column)}}\n </option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n }\n\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Should the parameter be locked for editing in 'view' mode\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-slide-toggle [(ngModel)]=\"parameter.locked\">Locked</mat-slide-toggle>\n </div>\n </div>\n\n @if (parameter.type !== 'date' && parameter.type !== 'datetime' && parameter.type !== 'boolean') {\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Is this parameter multiple\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-slide-toggle [(ngModel)]=\"parameter.multiple\" (change)=\"multipleStatusUpdated()\">Multiple</mat-slide-toggle>\n </div>\n </div>\n }\n @if (parameter.type !== 'list') {\n <div class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Enter a default value for this parameter\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" [(ngModel)]=\"parameter.defaultValue\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n }\n\n\n </div>\n </div>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" [mat-dialog-close]=\"parameter\"\n [disabled]=\"!parameter.title\">Update Parameter\n </button>\n </div>\n\n </div>\n\n\n","import {Component, Input, OnInit, Output, EventEmitter} from '@angular/core';\n\n@Component({\n selector: 'ki-dataset-parameter-type',\n templateUrl: './dataset-parameter-type.component.html',\n styleUrls: ['./dataset-parameter-type.component.sass'],\n standalone: false\n})\nexport class DatasetParameterTypeComponent implements OnInit {\n\n @Input() parameter: any;\n\n @Output() parameterChange = new EventEmitter();\n @Output() triggerApply = new EventEmitter();\n\n constructor() {\n }\n\n ngOnInit(): void {\n if (this.parameter.type === 'join' && !this.parameter.value) {\n this.parameter.value = '';\n }\n }\n\n public valueChanged() {\n this.parameterChange.emit(this.parameter);\n }\n\n public applyChanges() {\n this.triggerApply.emit(this.parameter);\n }\n\n}\n","<div class=\"parameter\">\n @if (parameter.type !== 'boolean') {\n <p>{{parameter.title}}<span>*</span></p>\n }\n\n @if (parameter.type === 'text') {\n <input type=\"text\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter.type === 'numeric') {\n <input type=\"text\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter.type === 'date' || parameter.type === 'datetime') {\n <input type=\"date\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter.type === 'boolean') {\n <mat-slide-toggle [(ngModel)]=\"parameter.value\" (ngModelChange)=\"valueChanged()\"\n required>{{parameter.title}}</mat-slide-toggle>\n }\n\n @if (parameter.type === 'join') {\n <mat-button-toggle-group class=\"mt-2 mb-2\" [(ngModel)]=\"parameter.selectedType\"\n (ngModelChange)=\"parameter.value = ''\">\n @for (joinType of parameter.values; track joinType) {\n @if (joinType.values.length) {\n <mat-button-toggle [value]=\"joinType.label\">\n {{joinType.label}}\n </mat-button-toggle>\n }\n }\n </mat-button-toggle-group>\n <div class=\"align-center\">\n @for (joinType of parameter.values; track joinType) {\n @if (parameter.selectedType === joinType.label) {\n <mat-select [(value)]=\"parameter.value\" class=\"mr-4\">\n <mat-option value=\"\">-- Select {{joinType.label}} --</mat-option>\n @for (field of joinType.values; track field) {\n <mat-option\n [value]=\"field.name\">{{field.title}}</mat-option>\n }\n </mat-select>\n }\n }\n </div>\n }\n\n @if (parameter.type === 'global') {\n <mat-button-toggle-group class=\"mt-2 mb-2\" [(ngModel)]=\"parameter.selectedValue\">\n <mat-button-toggle value=\"global\">Use Global Parameter</mat-button-toggle>\n <mat-button-toggle value=\"custom\">Use Custom Value</mat-button-toggle>\n </mat-button-toggle-group>\n @if (parameter.selectedValue === 'global') {\n <mat-select [(ngModel)]=\"parameter.value\" class=\"mr-4\" (change)=\"applyChanges()\">\n <mat-option value=\"\">-- Select Value --</mat-option>\n @for (field of parameter.values; track field) {\n <mat-option\n [value]=\"'{{'+field.name+'}}'\">{{field.title}} ({{field.value}})</mat-option>\n }\n </mat-select>\n }\n @if (parameter.selectedValue === 'custom') {\n @if (parameter._prevType === 'text') {\n <input type=\"text\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter._prevType === 'numeric') {\n <input type=\"number\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter._prevType === 'date' || parameter.type === 'datetime') {\n <input type=\"date\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (change)=\"valueChanged()\" (keyup.enter)=\"applyChanges()\" required autofocus>\n }\n @if (parameter._prevType === 'boolean') {\n <mat-slide-toggle [(ngModel)]=\"parameter.value\" (ngModelChange)=\"valueChanged()\"\n required>{{parameter.title}}</mat-slide-toggle>\n }\n }\n }\n</div>\n","import {Component, Input, OnInit, Output, EventEmitter} from '@angular/core';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {MatDialog} from '@angular/material/dialog';\nimport {DatasetAddParameterComponent} from './dataset-add-parameter/dataset-add-parameter.component';\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-dataset-parameter-values',\n templateUrl: './dataset-parameter-values.component.html',\n styleUrls: ['./dataset-parameter-values.component.sass'],\n standalone: false\n})\nexport class DatasetParameterValuesComponent implements OnInit {\n\n @Input() parameterValues: any = [];\n @Input() focusParameters = false;\n @Input() evaluatedDatasource: any;\n @Input() showNewOnOpen: boolean;\n @Input() hideNew = false;\n @Input() update: Subject<any>;\n\n @Output() changed = new EventEmitter();\n @Output() evaluatedDatasourceChange = new EventEmitter();\n\n public _ = _;\n\n constructor(private dialog: MatDialog) {\n }\n\n ngOnInit(): void {\n if (this.showNewOnOpen && !this.parameterValues.length) {\n this.addParameter();\n }\n\n if (this.update) {\n this.update.subscribe(() => {\n this.parameterChange();\n });\n }\n }\n\n public parameterChange(data?) {\n if (!_.every(this.parameterValues, 'value')) {\n this.focusParameters = true;\n } else {\n this.focusParameters = false;\n this.changed.emit(this.parameterValues);\n }\n }\n\n public addParameter() {\n const dialogRef = this.dialog.open(DatasetAddParameterComponent, {\n width: '600px',\n height: '600px'\n });\n dialogRef.afterClosed().subscribe(parameter => {\n if (parameter) {\n this.parameterValues.push(parameter);\n this.evaluatedDatasource.parameters.push(parameter);\n }\n });\n }\n\n}\n","<div class=\"parameter-values\">\n <div class=\"pv-title\">\n Required parameters\n @if (focusParameters) {\n <small>Please complete the required parameters for this datasource.</small>\n }\n </div>\n\n <div class=\"parameters\">\n @for (parameter of parameterValues; track parameter) {\n <ki-dataset-parameter-type [parameter]=\"parameter\" (triggerApply)=\"parameterChange()\">\n </ki-dataset-parameter-type>\n }\n\n <div class=\"flex align-center justify-between mt-4\">\n @if (!hideNew) {\n <button mat-stroked-button color=\"primary\" (click)=\"addParameter()\">\n <mat-icon>add</mat-icon>\n Add Parameters\n </button>\n }\n @if (!update) {\n <button mat-flat-button color=\"primary\" (click)=\"parameterChange()\"\n [disabled]=\"!_.every(parameterValues, 'value')\">Apply Parameters</button>\n }\n </div>\n </div>\n</div>\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-source-selector-dialog',\n templateUrl: './source-selector-dialog.component.html',\n styleUrls: ['./source-selector-dialog.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class SourceSelectorDialogComponent implements OnInit {\n\n public Object = Object;\n public datasources: any = [];\n public datasets: any = [];\n public sharedDatasets: any = [];\n public snapshots: any = [];\n public dashboardDatasetInstance: any;\n public requiredParameters: any = [];\n public updateParams = new Subject();\n public dashboard: any;\n public admin: boolean;\n\n constructor(public dialogRef: MatDialogRef<SourceSelectorDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasetService: DatasetService,\n private datasourceService: DatasourceService) {\n }\n\n ngOnInit(): void {\n this.dashboardDatasetInstance = this.data.dashboardDatasetInstance;\n this.dashboard = this.data.dashboard;\n this.admin = this.data.admin;\n }\n\n public setEvaluatedParameters(parameterValues, evaluate?) {\n this.requiredParameters = parameterValues;\n if (!this.dashboardDatasetInstance.parameterValues || Array.isArray(this.dashboardDatasetInstance.parameterValues)) {\n this.dashboardDatasetInstance.parameterValues = {};\n }\n parameterValues.forEach(param => {\n this.dashboardDatasetInstance.parameterValues[param.name] = param.value;\n });\n }\n\n public async select(action, stepper?) {\n if (action.datasourceKey) {\n this.dashboardDatasetInstance = {\n datasetInstanceId: null,\n datasourceInstanceKey: action.datasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n };\n } else if (action.datasetId) {\n this.dashboardDatasetInstance = await this.datasetService.getExtendedDataset(action.datasetId);\n }\n\n if (this.data.dashboardItemInstanceKey) {\n this.dashboardDatasetInstance.instanceKey = this.data.dashboardItemInstanceKey;\n }\n\n return this.datasetService.getEvaluatedParameters(this.dashboardDatasetInstance).then((requiredParams: any) => {\n this.createParameterStructure(requiredParams, stepper);\n return requiredParams;\n });\n }\n\n public setParameters() {\n this.updateParams.next(Date.now());\n this.dialogRef.close(this.dashboardDatasetInstance);\n }\n\n private createParameterStructure(requiredParameters, stepper?) {\n this.requiredParameters = requiredParameters;\n const availableGlobalParamValues = [];\n if (this.dashboard.layoutSettings.parameters) {\n _.forEach(this.dashboard.layoutSettings.parameters, parameter => {\n availableGlobalParamValues.push({\n name: parameter.name,\n title: parameter.title,\n value: parameter.value\n });\n });\n }\n\n if (availableGlobalParamValues.length) {\n this.requiredParameters.map(requiredParameter => {\n requiredParameter._prevType = requiredParameter.type;\n requiredParameter.type = 'global';\n requiredParameter.values = availableGlobalParamValues;\n requiredParameter.selectedValue = 'global';\n requiredParameter.value = '';\n return requiredParameter;\n });\n }\n\n if (this.requiredParameters.length) {\n setTimeout(() => {\n stepper.next();\n }, 0);\n } else {\n this.dialogRef.close(this.dashboardDatasetInstance);\n }\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Select Data Source</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n <mat-horizontal-stepper #stepper>\n\n <mat-step label=\"Select your data source\">\n\n <ki-data-picker class=\"block\" style=\"height: 620px\" [admin]=\"admin\" (selected)=\"select($event, stepper)\"></ki-data-picker>\n\n </mat-step>\n\n @if (requiredParameters.length) {\n <mat-step label=\"Parameters required\">\n <div class=\"parameter-values mt-4\">\n <ki-dataset-parameter-values [parameterValues]=\"requiredParameters\" [(evaluatedDatasource)]=\"dashboardDatasetInstance\"\n [update]=\"updateParams\"\n (changed)=\"setEvaluatedParameters($event, true)\"></ki-dataset-parameter-values>\n </div>\n </mat-step>\n }\n\n </mat-horizontal-stepper>\n\n\n\n </div>\n\n <div class=\"dialog-footer\">\n\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n @if (stepper.selectedIndex === 1) {\n <button mat-flat-button color=\"primary\"\n (click)=\"setParameters()\">\n Apply Parameters\n </button>\n }\n </div>\n\n</div>\n\n\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from './project.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlertService {\n\n constructor(@Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n public getAlertGroup(id) {\n return this.http.get(`${this.config.backendURL}/alert/group/${id}`)\n .toPromise();\n }\n\n public getAlertGroups(filterString = '', limit = '10', offset = '0', accountId = '') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.get(this.config.backendURL + '/alert/group', {\n params: {\n filterString, limit, offset, projectKey, accountId\n }\n });\n }\n\n public saveAlertGroup(alertGroup) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n return this.http.post(`${this.config.backendURL}/alert/group?projectKey=${projectKey}`, alertGroup)\n .toPromise();\n }\n\n public deleteAlertGroup(id) {\n return this.http.delete(`${this.config.backendURL}/alert/group/${id}`)\n .toPromise();\n }\n\n public processAlertsForDashboardDatasetInstance(dashboardDataSetInstance, index = null) {\n let url = this.config.backendURL + '/alert/dashboardDataSetInstance';\n if (index !== null) {\n url = url + '?alertIndex=' + index;\n }\n return this.http.post(url, dashboardDataSetInstance).toPromise();\n }\n}\n","import {Component, Input, OnInit} from '@angular/core';\n\n@Component({\n selector: 'ki-dataset-filter-inclusion',\n templateUrl: './dataset-filter-inclusion.component.html',\n styleUrls: ['./dataset-filter-inclusion.component.sass'],\n standalone: false\n})\nexport class DatasetFilterInclusionComponent implements OnInit {\n\n @Input() filter: any;\n @Input() parameterValues: any;\n @Input() dependsString = 'Depends';\n\n constructor() {\n }\n\n ngOnInit() {\n }\n\n}\n","@if (parameterValues && parameterValues.length) {\n <div class=\"m-2\">\n <mat-checkbox #depends [checked]=\"filter.inclusionCriteria && filter.inclusionCriteria !== 'Always'\"\n (change)=\"filter.inclusionCriteria = depends.checked ? 'ParameterPresent' : 'Always'\">\n <span class=\"font-normal\">{{ dependsString }}</span>\n </mat-checkbox>\n </div>\n @if (filter.inclusionCriteria && filter.inclusionCriteria !== 'Always') {\n <select\n class=\"mr-1 py-2\" [(ngModel)]=\"filter.inclusionCriteria\">\n <option value=\"ParameterPresent\">Parameter Is Set</option>\n <option value=\"ParameterNotPresent\">Parameter Is Not Set</option>\n <option value=\"ParameterValue\">Parameter Has Value</option>\n </select>\n }\n @if (filter.inclusionCriteria == 'ParameterPresent' || filter.inclusionCriteria == 'ParameterNotPresent') {\n <select class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\" (change)=\"filter.inclusionData = filter._inclusionParam\">\n @for (param of parameterValues; track param) {\n <option [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n }\n </select>\n }\n @if (filter.inclusionCriteria == 'ParameterValue') {\n <select class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\">\n @for (param of parameterValues; track param) {\n <option [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n }\n </select>\n }\n @if (filter.inclusionCriteria == 'ParameterValue') {\n <input\n placeholder=\"Enter value\"\n class=\"py-2\" [(ngModel)]=\"filter._inclusionParamValue\"\n (change)=\"filter.inclusionData = filter._inclusionParam + '=' + filter._inclusionParamValue\"/>\n}\n\n}\n","import {Component, Input, OnInit, Output, EventEmitter} from '@angular/core';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {MatDialog} from '@angular/material/dialog';\nimport {Subject} from 'rxjs';\nimport {MatChipEditedEvent, MatChipInputEvent} from '@angular/material/chips';\nimport {COMMA, ENTER} from '@angular/cdk/keycodes';\n\n@Component({\n selector: 'ki-dataset-filter',\n templateUrl: './dataset-filter.component.html',\n styleUrls: ['./dataset-filter.component.sass'],\n standalone: false\n})\nexport class DatasetFilterComponent implements OnInit {\n\n public static readonly filterTypes = [\n {label: '(==) Equal To', value: 'eq', string: '=='},\n {label: '(!=) Not Equal To', value: 'neq', string: '!='},\n {label: 'Contains', value: 'contains', string: 'contains'},\n {label: 'Starts with', value: 'startswith', string: 'starts with'},\n {label: 'Ends with', value: 'endswith', string: 'ends with'},\n {label: 'Similar to', value: 'similarto', string: 'similar to'},\n {label: '(>) Greater Than', value: 'gt', string: '>'},\n {label: '(>=) Greater Than Or Equal To', value: 'gte', string: '>='},\n {label: '(<) Less Than', value: 'lt', string: '<'},\n {label: '(<=) Less Than Or Equal To', value: 'lte', string: '<='},\n {label: 'Between', value: 'between', string: 'between'},\n {label: 'Is Null', value: 'null', string: 'is null'},\n {label: 'Not Null', value: 'notnull', string: 'not null'},\n {label: 'Like', value: 'like', string: 'like'},\n {label: 'Not Like', value: 'notlike', string: 'not like'},\n {label: 'Bitwise AND', value: 'bitwiseand', string: 'bitwise and'},\n {label: 'Bitwise OR', value: 'bitwiseor', string: 'bitwise or'},\n {label: 'Is One Of', value: 'in', string: 'in'},\n {label: 'Is Not One Of', value: 'notin', string: 'not in'}\n ];\n\n @Input() filter: any;\n @Input() filterIndex: any;\n @Input() filterJunction: any;\n @Input() filterFields: any = [];\n @Input() joinFilterFields: any;\n @Input() joinFieldsName: string;\n @Input() openSide: Subject<boolean>;\n @Input() parameterValues: any;\n\n @Output() filtersRemoved = new EventEmitter();\n\n public customValue = false;\n public customLhs = false;\n public _ = _;\n public COMMA = COMMA;\n public ENTER = ENTER;\n\n constructor(private dialog: MatDialog) {\n }\n\n public static getFilterType(filterType) {\n return _.find(DatasetFilterComponent.filterTypes, {value: filterType}) || null;\n }\n\n ngOnInit(): void {\n\n this.customLhs = String(this.filter.lhsExpression).length &&\n !_.find(this.filterFields, field => {\n return `[[${field.name}]]` === this.filter.lhsExpression;\n });\n\n this.customValue = this.filter.rhsExpression.length && String(this.filter.rhsExpression[0]).length &&\n !_.find(this.joinFilterFields, field => {\n return `[[${field.name}]]` === this.filter.rhsExpression[0];\n });\n\n // Handle legacy string scenarios.\n if (_.isString(this.filter.rhsExpression)) {\n this.filter.rhsExpression = [this.filter.rhsExpression];\n }\n\n\n if (String(this.filter.rhsExpression[0]).includes('AGO') && !String(this.filter.rhsExpression[0]).includes('AGO}}')) {\n this.filter._expType = 'period';\n const periodValues = this.filter.rhsExpression[0].split('_');\n this.filter._periodValue = periodValues[0];\n this.filter._period = periodValues[1];\n }\n\n // If parameter value, make temporary members for binding\n if (this.filter.inclusionCriteria && this.filter.inclusionCriteria !== 'Always') {\n const splitData = this.filter.inclusionData.split('=');\n this.filter._inclusionParam = splitData[0];\n this.filter._inclusionParamValue = splitData.length > 1 ? splitData[1] : '';\n }\n\n }\n\n public viewColumns(columns) {\n this.openSide.next(true);\n }\n\n public updateCustom(custom) {\n if (!custom) {\n this.openSide.next(false);\n }\n }\n\n\n updateFilterType(filter: any) {\n if (filter.filterType !== 'similarto' && filter.filterType !== 'between'\n && filter.filterType !== 'like' && filter.filterType !== 'notlike' && filter.filterType !== 'in' && filter.filterType !== 'notin') {\n if (filter.rhsExpression && filter.rhsExpression.length > 1) {\n filter.rhsExpression = filter.rhsExpression.slice(0, 1);\n }\n }\n if (filter.filterType === 'similarto') {\n if (!filter.rhsExpression[1]) {\n filter.rhsExpression[1] = 1;\n }\n }\n if (filter.filterType === 'like' || filter.filterType === 'notlike') {\n if (!filter.rhsExpression[1]) {\n filter.rhsExpression[1] = 'likewildcard';\n }\n }\n }\n\n public updateExpressionType(filter, type, value?, fieldIndex = 0) {\n filter[fieldIndex === 0 ? '_expType' : '_otherExpType'] = type;\n if (type === 'period') {\n filter.rhsExpression[fieldIndex] = `${filter._periodValue || 1}_${filter._period || 'DAYS'}_AGO`;\n } else {\n if (filter.filterType == 'in' || filter.filterType == 'notin'){\n filter.rhsExpression.push(value);\n } else {\n filter.rhsExpression[fieldIndex] = value;\n }\n }\n }\n\n public updatePeriodValue(value, period, filter, fieldIndex = 0) {\n filter.rhsExpression[fieldIndex] = `${value}_${period}_AGO`;\n }\n\n\n /**\n * Add an in value\n *\n * @param event\n */\n public addInValue(event: MatChipInputEvent) {\n const value = (event.value || '').trim();\n\n // Add our fruit\n if (value) {\n this.filter.rhsExpression.push(value);\n }\n\n // Clear the input value\n event.chipInput!.clear();\n }\n\n /**\n * Remove an in value\n *\n * @param inValue\n */\n public removeInValue(inValue: string) {\n\n const index = this.filter.rhsExpression.indexOf(inValue);\n\n if (index >= 0) {\n this.filter.rhsExpression.splice(index, 1);\n }\n }\n\n /**\n * Edit an in value\n *\n * @param inValue\n * @param event\n */\n public editInValue(inValue: string, event: MatChipEditedEvent) {\n const value = event.value.trim();\n\n // Remove fruit if it no longer has a name\n if (!value) {\n this.removeInValue(inValue);\n return;\n }\n\n // Edit existing fruit\n const index = this.filter.rhsExpression.indexOf(inValue);\n if (index >= 0) {\n this.filter.rhsExpression[index].name = value;\n }\n\n }\n\n\n public removeFilter() {\n this.filterJunction.filters.splice(this.filterIndex, 1);\n if (!this.filterJunction.filters.length &&\n !this.filterJunction.filterJunctions.length) {\n\n this.filtersRemoved.emit(this.filterJunction);\n }\n }\n\n public getFilterTypes() {\n return DatasetFilterComponent.filterTypes;\n }\n\n\n protected readonly Object = Object;\n}\n","@if (!joinFilterFields) {\n <div class=\"w-full mr-4\">\n <div>\n @if (!customLhs) {\n <mat-select [(value)]=\"filter.lhsExpression\" class=\"p-2 mr-4\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n @for (field of filterFields; track field) {\n <mat-option [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n }\n </mat-select>\n }\n @if (customLhs) {\n <input type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n }\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n @if (customLhs && openSide) {\n <a (click)=\"viewColumns(filterFields)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n }\n </div>\n </div>\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"p-2 mr-4\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n @for (filterType of getFilterTypes(); track filterType) {\n <mat-option [value]=\"filterType.value\">\n {{ filterType.label }}\n </mat-option>\n }\n </mat-select>\n <div class=\"w-full flex items-start\">\n <div class=\"relative w-full\">\n @if (filter.filterType === 'in' || filter.filterType === 'notin') {\n <mat-chip-grid\n class=\"bg-white pl-2 py-0.5 rounded border border-gray-200\" #chipGrid aria-label=\"Enter values\">\n @for (inValue of filter.rhsExpression; track inValue) {\n <mat-chip-row\n class=\"bg-white my-0\"\n (removed)=\"removeInValue(inValue)\"\n [editable]=\"true\"\n (edited)=\"editInValue(inValue, $event)\"\n [aria-description]=\"'press enter to edit ' + inValue\">\n {{inValue}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + inValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n <input placeholder=\"Value\" class=\"ml-0 border-0 pl-2 py-1.5 self-center\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"[ENTER, COMMA]\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addInValue($event)\"/>\n </mat-chip-grid>\n }\n @if (!filter._expType && filter.filterType !== 'in' && filter.filterType !== 'notin') {\n <input type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\" name=\"filterValue\"\n placeholder=\"Value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n }\n @if (filter._expType === 'date-picker') {\n <input type=\"date\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n }\n @if (filter._expType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._period || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div class=\"font-medium\">Ago</div>\n </div>\n }\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n @if (filter.filterType !== 'in' && filter.filterType !== 'notin') {\n <button mat-menu-item (click)=\"updateExpressionType(filter, null, [])\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n }\n @if (filter.filterType !== 'in' && filter.filterType !== 'notin') {\n <button mat-menu-item [matMenuTriggerFor]=\"columnMenu\">\n <mat-icon>table_chart</mat-icon>\n <span>Columns</span>\n </button>\n }\n @if (parameterValues && parameterValues.length) {\n <button mat-menu-item\n [matMenuTriggerFor]=\"parameterValuesMenu\">\n <mat-icon>text_fields</mat-icon>\n <span>Parameters</span>\n </button>\n }\n @if (filter.filterType !== 'in' && filter.filterType !== 'notin') {\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [])\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n }\n @if (filter.filterType !== 'in' && filter.filterType !== 'notin') {\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'period')\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n }\n </mat-menu>\n <mat-menu #columnMenu=\"matMenu\">\n @for (column of filterFields; track column) {\n <button mat-menu-item\n (click)=\"updateExpressionType(filter, null, '[[' + column.name + ']]')\">\n <span>{{column.title}}</span>\n </button>\n }\n </mat-menu>\n <mat-menu #parameterValuesMenu=\"matMenu\">\n @for (param of parameterValues; track param) {\n <button mat-menu-item\n (click)=\"updateExpressionType(filter, null, '{{' + param.name + '}}')\">\n <span>{{param.title}}</span>\n </button>\n }\n </mat-menu>\n </div>\n @if ((filter.filterType === 'similarto' || filter.filterType === 'between' || filter.filterType === 'like' || filter.filterType === 'notlike')) {\n <div\n class=\"ml-2 relative w-full\">\n @if (filter.filterType === 'similarto') {\n <select class=\"w-full\" name=\"similarityDistance\" [(ngModel)]=\"filter.rhsExpression[1]\">\n @for (val of _.range(10); track val) {\n <option [value]=\"val + 1\">\n {{ val + 1 }}\n </option>\n }\n </select>\n <div class=\"text-xs text-gray-400\">Select Maximum Number of Changes</div>\n }\n @if (filter.filterType === 'like' || filter.filterType === 'notlike') {\n <select class=\"w-full\" name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n }\n @if (filter.filterType === 'between') {\n <div class=\"relative flex items-center\">\n <div class=\"mr-2 font-medium\">and</div>\n @if (!filter._otherExpType) {\n <input type=\"text\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"otherbetween\" placeholder=\"To value\"\n class=\"pl-2 py-2 pr-8 full\">\n }\n @if (filter._otherExpType === 'date-picker') {\n <input type=\"date\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n }\n @if (filter._otherExpType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._otherPeriodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._otherPeriod || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div class=\"font-medium\">Ago</div>\n </div>\n }\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"otherMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #otherMenu=\"matMenu\">\n <button mat-menu-item (click)=\"updateExpressionType(filter, null, [], 1)\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [], 1)\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'period', null, 1)\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n </mat-menu>\n </div>\n }\n </div>\n }\n </div>\n}\n\n\n@if (joinFilterFields) {\n <div class=\"w-full mr-4\">\n <div>\n @if (!customLhs) {\n <mat-select [(value)]=\"filter.lhsExpression\" class=\"mr-4 p-2\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n @for (field of filterFields; track field) {\n <mat-option [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n }\n </mat-select>\n }\n @if (customLhs) {\n <input type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n }\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n @if (customLhs && openSide) {\n <a (click)=\"viewColumns(filterFields)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n }\n </div>\n </div>\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"mr-4 p-2\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n @for (filterType of getFilterTypes(); track filterType) {\n <mat-option [value]=\"filterType.value\">\n {{ filterType.label }}\n </mat-option>\n }\n </mat-select>\n <div class=\"w-full\">\n <div>\n @if (!customValue) {\n <mat-select [(value)]=\"filter.rhsExpression[0]\" class=\"mr-4 p-2\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n @for (field of joinFilterFields; track field) {\n <mat-option [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n }\n </mat-select>\n }\n @if (customValue) {\n <input type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Custom value\" class=\"mr-4 full p-2 font-mono\">\n }\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customValue\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n @if (customValue && openSide) {\n <a (click)=\"viewColumns(filterFields)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n }\n </div>\n </div>\n @if (filter.filterType === 'like' || filter.filterType === 'notlike') {\n <div class=\"pl-2 pr-8 mr-4 full\">\n <select name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n </div>\n }\n @if (filter.filterType === 'similarto') {\n <input type=\"number\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"similarityDistance\" placeholder=\"Maximum Distance\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n }\n @if (filter.filterType === 'between') {\n <input type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\" name=\"otherValue\"\n placeholder=\"Other value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n }\n}\n\n@if (!joinFilterFields) {\n <div class=\"flex items-start\">\n <ki-dataset-filter-inclusion [filter]=\"filter\" [parameterValues]=\"parameterValues\"></ki-dataset-filter-inclusion>\n </div>\n}\n\n\n<div>\n <button mat-icon-button color=\"warn\" title=\"Remove filter\" (click)=\"removeFilter()\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n</div>\n\n","import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-dataset-filter-junction',\n templateUrl: './dataset-filter-junction.component.html',\n styleUrls: ['./dataset-filter-junction.component.sass'],\n standalone: false\n})\nexport class DatasetFilterJunctionComponent implements OnInit {\n\n @Input() filterJunction: any;\n @Input() filterFields: any = [];\n @Input() parentJunction: any;\n @Input() junctionIndex: number;\n @Input() joinFilterFields: any;\n @Input() joinFieldsName: string;\n @Input() openSide: Subject<boolean>;\n @Input() parameterValues: any;\n\n @Output() filterJunctionChange = new EventEmitter<any>();\n\n constructor() {\n }\n\n ngOnInit(): void {\n // If parameter value, make temporary members for binding\n if (this.filterJunction.inclusionCriteria && this.filterJunction.inclusionCriteria !== \"Always\") {\n let splitData = this.filterJunction.inclusionData.split(\"=\");\n this.filterJunction._inclusionParam = splitData[0];\n this.filterJunction._inclusionParamValue = splitData.length > 1 ? splitData[1] : \"\";\n }\n }\n\n public addFilter(type) {\n if (type === 'single') {\n this.filterJunction.filters.push({\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n });\n } else if (type === 'group') {\n this.filterJunction.filterJunctions.push({\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n });\n }\n this.filterJunctionChange.emit(this.filterJunction);\n }\n\n public filtersRemoved() {\n this.parentJunction.filterJunctions.splice(this.junctionIndex, 1);\n }\n}\n","@if (filterJunction) {\n <div class=\"filter\">\n <div class=\"flex align-center justify-between\">\n <mat-button-toggle-group [(ngModel)]=\"filterJunction.logic\"\n [style]=\"{visibility: (filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'hidden': 'visible'}\">\n <mat-button-toggle value=\"AND\">All of the following apply</mat-button-toggle>\n <mat-button-toggle value=\"OR\">Any of the following apply</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n @if (!joinFilterFields) {\n <div class=\"flex {{(filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'mt-0': 'mt-2'}}\">\n <ki-dataset-filter-inclusion class=\"-ml-2\" [filter]=\"filterJunction\" [parameterValues]=\"parameterValues\"\n dependsString=\"Filter group depends\"></ki-dataset-filter-inclusion>\n </div>\n }\n @for (filter of filterJunction.filters; track filter; let i = $index) {\n <ki-dataset-filter [filter]=\"filter\" [filterJunction]=\"filterJunction\" [filterIndex]=\"i\"\n [parameterValues]=\"parameterValues\"\n [filterFields]=\"filterFields\" [joinFilterFields]=\"joinFilterFields\" [openSide]=\"openSide\"\n (filtersRemoved)=\"filtersRemoved()\" [joinFieldsName]=\"joinFieldsName\"></ki-dataset-filter>\n }\n <div>\n <button mat-button color=\"primary\" title=\"Add single filter\" (click)=\"addFilter('single')\">\n <mat-icon>add_circle</mat-icon>\n filter\n </button>\n <button mat-button color=\"primary\" title=\"Add group filters\" (click)=\"addFilter('group')\">\n <mat-icon>playlist_add</mat-icon>\n filter group\n </button>\n <button mat-button color=\"warn\" title=\"Remove group filter\" (click)=\"filtersRemoved()\">\n <mat-icon>delete_sweep</mat-icon>\n remove group\n </button>\n </div>\n </div>\n @for (junction of filterJunction.filterJunctions; track junction; let j = $index) {\n <div class=\"group-filters mb-4\">\n <ki-dataset-filter-junction [(filterJunction)]=\"filterJunction.filterJunctions[j]\" [openSide]=\"openSide\"\n [joinFilterFields]=\"joinFilterFields\" [joinFieldsName]=\"joinFieldsName\"\n [filterFields]=\"filterFields\" [parentJunction]=\"filterJunction\"\n [parameterValues]=\"parameterValues\"\n [junctionIndex]=\"j\"></ki-dataset-filter-junction>\n </div>\n }\n}\n","import {Component, Input, OnInit} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-dataset-filters',\n templateUrl: './dataset-filters.component.html',\n styleUrls: ['./dataset-filters.component.sass'],\n standalone: false\n})\nexport class DatasetFiltersComponent implements OnInit {\n\n @Input() filterJunction: any;\n @Input() filterFields: any = [];\n @Input() joinFilterFields: any;\n @Input() joinFieldsName: string;\n @Input() openSide: Subject<boolean>;\n @Input() parameterValues: any;\n\n constructor() {\n }\n\n ngOnInit(): void {\n // If parameter value, make temporary members for binding\n if (this.filterJunction.inclusionCriteria && this.filterJunction.inclusionCriteria !== 'Always') {\n const splitData = this.filterJunction.inclusionData.split('=');\n this.filterJunction._inclusionParam = splitData[0];\n this.filterJunction._inclusionParamValue = splitData.length > 1 ? splitData[1] : '';\n }\n }\n\n public addFilter(type) {\n if (type === 'single') {\n this.filterJunction.filters.push({\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n });\n } else if (type === 'group') {\n this.filterJunction.filterJunctions.push({\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n });\n }\n }\n}\n","<div class=\"top-filters\">\n <div class=\"filter\">\n <div class=\"flex align-center justify-between\">\n <mat-button-toggle-group [(ngModel)]=\"filterJunction.logic\"\n [style]=\"{visibility: (filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'hidden': 'visible'}\">\n <mat-button-toggle value=\"AND\">All of the following apply</mat-button-toggle>\n <mat-button-toggle value=\"OR\">Any of the following apply</mat-button-toggle>\n </mat-button-toggle-group>\n\n\n\n </div>\n\n @if (!joinFilterFields) {\n <div class=\"flex {{(filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'mt-0': 'mt-2'}}\">\n <ki-dataset-filter-inclusion class=\"-ml-2\" [filter]=\"filterJunction\" [parameterValues]=\"parameterValues\"\n dependsString=\"Filter group depends\"></ki-dataset-filter-inclusion>\n </div>\n }\n\n @for (filter of filterJunction.filters; track filter; let i = $index) {\n <ki-dataset-filter [filter]=\"filter\" [filterJunction]=\"filterJunction\" [filterIndex]=\"i\"\n [joinFieldsName]=\"joinFieldsName\" [openSide]=\"openSide\"\n [parameterValues]=\"parameterValues\"\n [filterFields]=\"filterFields\" [joinFilterFields]=\"joinFilterFields\"></ki-dataset-filter>\n }\n <div>\n <button mat-button color=\"primary\" title=\"Add single filter\" (click)=\"addFilter('single')\">\n <mat-icon>add_circle</mat-icon>\n filter\n </button>\n <button mat-button color=\"primary\" title=\"Add group filters\" (click)=\"addFilter('group')\"\n [disabled]=\"!filterJunction.filters.length\">\n <mat-icon>playlist_add</mat-icon>\n filter group\n </button>\n </div>\n </div>\n\n\n @for (junction of filterJunction.filterJunctions; track junction; let j = $index) {\n <div class=\"group-filters mb-4\">\n <ki-dataset-filter-junction [(filterJunction)]=\"filterJunction.filterJunctions[j]\" [openSide]=\"openSide\"\n [joinFilterFields]=\"joinFilterFields\" [joinFieldsName]=\"joinFieldsName\"\n [parameterValues]=\"parameterValues\"\n [filterFields]=\"filterFields\" [parentJunction]=\"filterJunction\" [junctionIndex]=\"j\"></ki-dataset-filter-junction>\n </div>\n }\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {AlertService} from '../../../../services/alert.service';\n\n@Component({\n selector: 'ki-edit-dashboard-alert',\n templateUrl: './edit-dashboard-alert.component.html',\n styleUrls: ['./edit-dashboard-alert.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class EditDashboardAlertComponent implements OnInit {\n\n public alert: any = {};\n public filterFields: any = [];\n public alertGroups: any = [];\n\n constructor(public dialogRef: MatDialogRef<EditDashboardAlertComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private alertService: AlertService) {\n }\n\n ngOnInit(): void {\n this.alertService.getAlertGroups().toPromise().then(groups => {\n this.alertGroups = groups;\n });\n\n this.alert = this.data.alert || {\n filterTransformation: {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: '',\n filterType: ''\n }],\n filterJunctions: []\n },\n matchRuleConfiguration: {\n matchType: 'equals',\n value: 1\n },\n enabled: true\n };\n\n\n this.filterFields = this.data.filterFields;\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Edit Alert</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div><b>Enable Alert</b></div>\n <mat-slide-toggle class=\"mb-4\" [(ngModel)]=\"alert.enabled\">\n @if (alert.enabled) {\n Alerts enabled\n }\n @if (!alert.enabled) {\n Alerts disabled\n }\n </mat-slide-toggle>\n\n <div class=\"my-2\"><b>Alert Title<span class=\"ml-1 text-red-600\">*</span></b></div>\n\n <input type=\"text\" class=\"w-full\" #alertTitle=\"ngModel\"\n [class]=\"{'border border-red-600': alertTitle.invalid}\"\n [(ngModel)]=\"alert.title\" required>\n\n <div class=\"mt-2\"><b>Conditions</b></div>\n <ki-dataset-filters [filterFields]=\"filterFields\"\n [filterJunction]=\"alert.filterTransformation\"></ki-dataset-filters>\n\n <div class=\"my-2\"><b>Matches</b></div>\n <div class=\"align-center justify-between\">\n <mat-select class=\"mr-2 w-1/2\" [(ngModel)]=\"alert.matchRuleConfiguration.matchType\">\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"greater\">Greater than</mat-option>\n <mat-option value=\"less\">Less than</mat-option>\n </mat-select>\n <input class=\"mr-2 flex-1\" type=\"number\" [(ngModel)]=\"alert.matchRuleConfiguration.value\">\n <div>Rows</div>\n </div>\n\n <div class=\"my-2\"><b>Alert Group</b></div>\n\n <mat-select [(ngModel)]=\"alert.alertGroupId\">\n @for (alertGroup of alertGroups; track alertGroup) {\n <mat-option [value]=\"alertGroup.id\">\n {{alertGroup.title}}\n </mat-option>\n }\n </mat-select>\n\n <div class=\"my-2\"><b>Summary Template<span class=\"ml-1 text-red-600\">*</span></b></div>\n\n <input type=\"text\" class=\"w-full\" #summaryTemplate=\"ngModel\"\n [class]=\"{'border border-red-600': summaryTemplate.invalid}\"\n [(ngModel)]=\"alert.summaryTemplate\" required>\n <small>Used for display on dashboard</small>\n\n <div class=\"my-2\"><b>Notification Template<span class=\"ml-1 text-red-600\">*</span></b></div>\n\n <textarea class=\"w-full\" rows=\"5\" #notificationTemplate=\"ngModel\"\n [class]=\"{'border border-red-600': notificationTemplate.invalid}\"\n [(ngModel)]=\"alert.notificationTemplate\" required></textarea>\n <small>Used for the notification</small>\n\n <div class=\"my-2\"><b>Notification Call To Action</b></div>\n\n <input type=\"text\" class=\"w-full\" [(ngModel)]=\"alert.notificationCta\">\n <small>Used for providing a click through for this alert for eg. a dashboard.</small>\n\n </div>\n\n <div class=\"dialog-footer\">\n\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" [mat-dialog-close]=\"alert\"\n [disabled]=\"!alert.title || !alert.summaryTemplate || !alert.notificationTemplate\">\n {{alert.id ? 'Update' : 'Add'}} Alert\n </button>\n </div>\n\n</div>\n\n\n","import {Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-change-source-warning',\n templateUrl: './change-source-warning.component.html',\n styleUrls: ['./change-source-warning.component.sass'],\n standalone: false\n})\nexport class ChangeSourceWarningComponent implements OnInit {\n\n constructor(public dialogRef: MatDialogRef<ChangeSourceWarningComponent>) {\n }\n\n ngOnInit(): void {\n }\n\n public close(res?) {\n this.dialogRef.close(res);\n }\n\n}\n","<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Change Source Query?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to change the underlying dataset which may have different column mappings to the\n dataset you are currently working with. Any upstream transformations that are not compatible will\n cause the evaluation to fail. For convenience, we will disable all transformations after this point\n so they can be reviewed manually one by one.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed With Change\n </button>\n\n\n </div>\n</div>\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {DatasetService} from '../../services/dataset.service';\nimport {BehaviorSubject} from 'rxjs';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-whitelisted-sql-functions',\n templateUrl: './whitelisted-sql-functions.component.html',\n styleUrls: ['./whitelisted-sql-functions.component.sass'],\n standalone: false\n})\nexport class WhitelistedSqlFunctionsComponent implements OnInit {\n\n @Input() search = new BehaviorSubject('');\n @Input() fields: any = [];\n\n public docs: any = [];\n public sqlFunctions: any = {};\n public showColumns = false;\n public Object = Object;\n\n constructor(private datasetService: DatasetService) {\n }\n\n ngOnInit(): void {\n\n this.datasetService.getWhiteListedSQLFunctions().then((sql: any) => {\n _.forEach(sql, (sqlFunction, name) => {\n if (!this.sqlFunctions[sqlFunction.category]) {\n this.sqlFunctions[sqlFunction.category] = {category: _.startCase(sqlFunction.category), functions: []};\n }\n sqlFunction.name = name;\n this.sqlFunctions[sqlFunction.category].functions.push(sqlFunction);\n });\n });\n }\n\n}\n","<div class=\"max-w-7xl mx-auto pb-6\">\n <div class=\"max-w-3xl mx-auto divide-y-2 divide-gray-200\">\n <h2 class=\"mt-4 text-center text-xl font-extrabold text-gray-900\">\n Documentation\n </h2>\n\n <dl class=\"space-y-6 divide-y divide-gray-200\">\n <div class=\"py-6\">\n @if (fields.length) {\n <dt class=\"text-lg\">\n <!-- Expand/collapse question button -->\n <button type=\"button\" (click)=\"showColumns = !showColumns\"\n class=\"text-left w-full flex justify-between items-start text-gray-400\"\n aria-controls=\"faq-0\" aria-expanded=\"false\">\n <span class=\"font-medium text-gray-900\"> Available Columns </span>\n <span class=\"ml-6 h-7 flex items-center\">\n <svg [class]=\"{'rotate-0': !showColumns, '-rotate-180': showColumns}\"\n class=\"h-6 w-6 transform\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </span>\n </button>\n </dt>\n @if (showColumns) {\n <dd class=\"mt-2\">\n <p class=\"text-base text-gray-500\">\n Use columns by wrapping the column name in double square brackets.\n </p>\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" class=\"px-3 py-4 text-left text-sm font-semibold text-gray-900\">\n Title\n </th>\n <th scope=\"col\" class=\"px-3 py-4 text-left text-sm font-semibold text-gray-900\">\n Column\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n @for (field of fields; track field) {\n <tr>\n <td class=\"whitespace-nowrap px-3 py-2 text-sm text-gray-900 font-semibold\">\n {{field.title}}</td>\n <td class=\"whitespace-nowrap px-3 py-2 text-sm text-gray-500\">\n [[{{field.name}}]]\n </td>\n </tr>\n }\n </tbody>\n </table>\n </dd>\n }\n }\n </div>\n </dl>\n </div>\n <div class=\"max-w-3xl mx-auto divide-y-2 divide-gray-200\">\n <p class=\"pt-6 text-base text-gray-500 text-semibold\">\n Available Functions\n </p>\n @if (Object.keys(sqlFunctions).length) {\n <dl class=\"space-y-6 divide-y divide-gray-200\">\n @for (key of Object.keys(sqlFunctions); track key) {\n <div class=\"pt-6\">\n <dt class=\"text-lg\">\n <!-- Expand/collapse question button -->\n <button type=\"button\" (click)=\"sqlFunctions[key].show = !sqlFunctions[key].show\"\n class=\"text-left w-full flex justify-between items-start text-gray-400\"\n aria-controls=\"faq-0\" aria-expanded=\"false\">\n <span class=\"font-medium text-gray-900 capitalize\"> {{key.toLowerCase()}} </span>\n <span class=\"ml-6 h-7 flex items-center\">\n <svg\n [class]=\"{'rotate-0': !sqlFunctions[key].show, '-rotate-180': sqlFunctions[key].show}\"\n class=\"h-6 w-6 transform\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </span>\n </button>\n </dt>\n @if (sqlFunctions[key].show) {\n <dd class=\"mt-2\">\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" class=\"px-3 py-4 text-left text-sm font-semibold text-gray-900\">\n Name\n </th>\n <th scope=\"col\" class=\"px-3 py-4 text-left text-sm font-semibold text-gray-900\">\n Parameters\n </th>\n <th scope=\"col\" class=\"px-3 py-4 text-left text-sm font-semibold text-gray-900\">\n Description\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n @for (sql of sqlFunctions[key].functions; track sql) {\n <tr>\n <td class=\"px-3 py-2 text-sm text-gray-900 font-semibold\">\n {{sql.name}}</td>\n <td class=\"px-3 py-2 text-sm text-gray-500\">\n {{sql.params}}\n </td>\n <td class=\"px-3 py-2 text-sm text-gray-500\">\n {{sql.description}}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </dd>\n }\n </div>\n }\n </dl>\n }\n </div>\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {CdkDragDrop, copyArrayItem, moveItemInArray} from '@angular/cdk/drag-drop';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-dataset-summarise',\n templateUrl: './dataset-summarise.component.html',\n styleUrls: ['./dataset-summarise.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetSummariseComponent implements OnInit {\n\n public availableColumns: any = [];\n public summariseFields: any = [];\n public summariseExpressions: any = [];\n public _ = _;\n public showDocs = false;\n public originDataItemTitle: string;\n public viewExample = false;\n\n public readonly expressionTypes = [\n {label: 'No. of Values', value: 'COUNT'},\n {label: 'No. of Unique Values', value: 'COUNT_DISTINCT'},\n {label: 'No. of Values as Percentage', value: 'COUNT_PERCENT'},\n {label: 'Sum of Values', value: 'SUM'},\n {label: 'Sum of Values as Percentage', value: 'SUM_PERCENT'},\n {label: 'Minimum Value', value: 'MIN'},\n {label: 'Maximum Value', value: 'MAX'},\n {label: 'Average Value', value: 'AVG'},\n {label: 'Join values together with comma', value: 'GROUP_CONCAT'}\n ];\n\n constructor(public dialogRef: MatDialogRef<DatasetSummariseComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n this.availableColumns = this.data.availableColumns;\n this.originDataItemTitle = this.data.originDataItemTitle;\n\n if (this.data.config) {\n this.summariseFields = this.data.config.summariseFieldNames.map(field => {\n return _.find(this.availableColumns, {name: field});\n });\n this.summariseExpressions = this.data.config.expressions;\n // Add in the existing column titles for display\n this.summariseExpressions.map(expression => {\n const column = _.find(this.availableColumns, {name: expression.fieldName});\n expression.title = column ? column.title : _.startCase(expression.fieldName);\n return expression;\n });\n }\n }\n\n drop(event: CdkDragDrop<string[]>) {\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n if (event.previousContainer.id === 'availableColumns') {\n copyArrayItem(_.cloneDeep(event.previousContainer.data),\n event.container.data,\n event.previousIndex,\n event.currentIndex);\n\n if (event.container.id === 'summariseExpressions') {\n const item: any = event.container.data[event.currentIndex];\n item.expressionType = 'SUM';\n }\n }\n }\n }\n\n public removeListItem(list, index) {\n list.splice(index, 1);\n }\n\n public createCustomExpression() {\n this.summariseExpressions.push({\n expressionType: 'CUSTOM'\n });\n }\n\n public applySettings() {\n const summariseTransformation: any = {\n summariseFieldNames: _.map(this.summariseFields, 'name'),\n expressions: _.map(this.summariseExpressions, expression => {\n const summariseExpression: any = {\n expressionType: expression.expressionType\n };\n\n if (expression.expressionType !== 'CUSTOM') {\n summariseExpression.fieldName = expression.name || expression.fieldName;\n } else {\n summariseExpression.customExpression = expression.customExpression;\n }\n\n if (expression.customLabel) {\n summariseExpression.customLabel = expression.customLabel;\n }\n\n return summariseExpression;\n })\n };\n\n this.dialogRef.close(summariseTransformation);\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Summarise Data</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-4\">\n\n <div class=\"border-t bg-blue-50 p-4 mb-4 -mx-4 -mt-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n The Summarise transformation is analogous to a <span class=\"font-medium\">SQL GROUP BY</span> expression.\n The <b>Summarise Fields</b> represent the columns to group by, and the <b>Summarise Expression</b> items\n represent columns to Select. <b>Drag</b> the available column to the desired section.<br>\n <a (click)=\"viewExample = true;\" class=\"font-medium hover:underline\">\n View an example of how this summarisation would appear as a SQL statement.</a>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"drop-container\" cdkDropListGroup>\n <div class=\"example-container\">\n <div class=\"border rounded-t bg-gray-100 text-lg px-2 font-medium py-1 border-gray-300\">\n Available Columns</div>\n\n <div\n cdkDropList\n id=\"availableColumns\"\n [cdkDropListData]=\"availableColumns\"\n class=\"example-list\"\n cdkDropListSortingDisabled\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of availableColumns; track item) {\n <div class=\"example-box\" cdkDrag>{{item.title}}</div>\n }\n </div>\n </div>\n\n <div class=\"example-container\">\n <div class=\"border rounded-t bg-gray-100 text-lg px-2 font-medium py-1 border-gray-300\">\n Summarise Fields</div>\n\n <div\n cdkDropList\n [cdkDropListData]=\"summariseFields\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of summariseFields; track item; let i = $index) {\n <div class=\"example-box p-0 pl-2 h-12\" cdkDrag>\n {{item.title}}\n <div class=\"bg-gray-50 h-full flex items-center\">\n <button mat-icon-button color=\"warn\" (click)=\"removeListItem(summariseFields, i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"example-container mr-0\">\n <div class=\"border rounded-t bg-gray-100 text-lg px-2 font-medium py-1 border-gray-300\">\n Summarise Expressions</div>\n\n <div\n cdkDropList\n [cdkDropListData]=\"summariseExpressions\"\n id=\"summariseExpressions\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of summariseExpressions; track item; let i = $index) {\n <div class=\"example-box expression\"\n cdkDrag >\n <div class=\"h-full w-full flex flex-row\">\n <div class=\"flex-1 px-1\">\n @if (item.expressionType !== 'CUSTOM') {\n <div\n class=\"px-2 pt-2 w-full flex items-center flex-row\">\n <div class=\"font-medium w-20 text-gray-600 text-xs\">Column</div>\n <div class=\"truncate w-48\">{{item.title}}</div>\n </div>\n }\n @if (item.expressionType !== 'CUSTOM') {\n <div class=\"p-2 w-full flex items-center flex-row\">\n <div class=\"font-medium w-20 text-gray-600 text-xs\">Expression</div>\n <mat-select class=\"p-2 w-48\" [(ngModel)]=\"item.expressionType\">\n @for (type of expressionTypes; track type) {\n <mat-option class=\"text-sm\"\n [value]=\"type.value\">{{type.label}}</mat-option>\n }\n </mat-select>\n </div>\n }\n @if (item.expressionType === 'CUSTOM') {\n <div class=\"top\">\n <div class=\"custom-container\">\n <div class=\"font-medium w-20 text-gray-600 text-xs pb-2\">Expression</div>\n <textarea class=\"w-full\" rows=\"4\" [(ngModel)]=\"item.customExpression\"></textarea>\n </div>\n </div>\n }\n <div class=\"px-2 pb-2 w-full flex items-center flex-row\">\n <div class=\"font-medium w-20 text-gray-600 text-xs\">Label<span class=\"text-red-500 text-xs\">&nbsp;*</span></div>\n <input type=\"text\" class=\"p-2 w-48\"\n [placeholder]=\"item.expressionType === 'CUSTOM' ? 'custom_expression' : item.expressionType + '_of_' + item.name\"\n [(ngModel)]=\"item.customLabel\" [class]=\"{'border border-red-500': !item.customLabel}\">\n </div>\n </div>\n <div class=\"bg-gray-50 flex items-center justify-center\">\n <button mat-icon-button color=\"warn\" (click)=\"removeListItem(summariseExpressions, i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n\n </div>\n </div>\n\n @if (viewExample) {\n <div class=\"rounded bg-gray-50 p-4 my-2\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"h-5 w-5 text-gray-400\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 18v-5.25m0 0a6.01 6.01 0 001.5-.189m-1.5.189a6.01 6.01 0 01-1.5-.189m3.75 7.478a12.06 12.06 0 01-4.5 0m3.75 2.383a14.406 14.406 0 01-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 10-7.517 0c.85.493 1.509 1.333 1.509 2.316V18\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-gray-700 mb-0\">\n <b>SELECT&nbsp;</b>@for (expression of summariseExpressions; track expression; let i = $index) {\n <span>@if (i > 0) {\n <span>, </span>\n }{{expression.customExpression || expression.expressionType + '(' + (expression.name || '') + ')'}}</span>\n }<b>&nbsp;FROM&nbsp;</b>{{originDataItemTitle}}@if (summariseFields.length) {\n <b>&nbsp;GROUP BY&nbsp;</b> {{_.chain(summariseFields).map('name').valueOf().join(', ')}}\n }\n </p>\n </div>\n </div>\n </div>\n }\n\n @if (showDocs) {\n <ki-whitelisted-sql-functions [fields]=\"availableColumns\"></ki-whitelisted-sql-functions>\n }\n\n</div>\n\n<div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <div class=\"flex items-center\">\n <a (click)=\"showDocs = !showDocs\"\n class=\"text-xs mr-2 hover:underline flex items-center primary\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n <button mat-stroked-button color=\"primary\" (click)=\"createCustomExpression()\"\n class=\"create-custom-button\">\n <mat-icon>construction</mat-icon>\n Create custom expression\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"applySettings()\"\n [disabled]=\"!_.every(summariseExpressions, 'customLabel')\">Apply Settings</button>\n </div>\n\n</div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnInit, ViewChild} from '@angular/core';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {DatasetService} from '../../../../services/dataset.service';\nimport {DatasourceService} from '../../../../services/datasource.service';\nimport {ProjectService} from '../../../../services/project.service';\nimport {TagService} from '../../../../services/tag.service';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {MatStepper} from '@angular/material/stepper';\nimport {DataProcessorService} from '../../../../services/data-processor.service';\n\n@Component({\n selector: 'ki-dataset-add-join',\n templateUrl: './dataset-add-join.component.html',\n styleUrls: ['./dataset-add-join.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetAddJoinComponent implements OnInit {\n\n @ViewChild('stepper') matStepper: MatStepper;\n\n public Object = Object;\n public environment: any = {};\n public datasources: any = [];\n public datasets: any = [];\n public snapshots: any = [];\n public sharedDatasets: any = [];\n public searchText = new BehaviorSubject('');\n public selectedSource: any;\n public filterFields: any;\n public joinFilterFields: any;\n public joinColumns: any = [];\n public joinTransformation: any = {\n type: 'join',\n config: {\n joinFilters: [],\n joinColumns: [],\n joinParameterMappings: [],\n strictJoin: false\n }\n };\n public admin: boolean;\n public allColumns = true;\n public activeProject: any;\n public activeTag: any;\n public requiredParameters: any;\n public parameterValues: any;\n public updateParams = new Subject();\n public openSide = new BehaviorSubject(false);\n public tableData: any = {\n datasources: {\n data: [],\n limit: 5,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n title: 'My Data',\n type: 'datasource'\n },\n datasets: {\n data: [],\n limit: 5,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n title: 'Stored Queries',\n type: 'dataset'\n }\n };\n\n public _ = _;\n\n private datasetEditor: any;\n\n constructor(private datasetService: DatasetService,\n private datasourceService: DatasourceService,\n private projectService: ProjectService,\n private tagService: TagService,\n public dialogRef: MatDialogRef<DatasetAddJoinComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dataProcessorService: DataProcessorService) {\n }\n\n ngOnInit(): void {\n this.admin = !!this.data.admin;\n this.environment = this.data.environment || {};\n this.filterFields = this.data.filterFields;\n this.parameterValues = this.data.parameterValues;\n this.datasetEditor = this.data.datasetEditor;\n\n if (!this.admin) {\n this.tableData.shared = {\n data: [],\n limit: 5,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n title: 'Data Feeds',\n type: 'dataset'\n };\n }\n\n this.tableData.snapshots = {\n data: [],\n limit: 5,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n title: 'Snapshots',\n type: 'snapshot'\n };\n\n this.activeProject = this.projectService.activeProject.getValue();\n this.activeTag = this.tagService.activeTag.getValue();\n\n merge(this.searchText, this.tableData.datasets.reload)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets(false, this.tableData.datasets.limit, this.tableData.datasets.offset)\n )\n ).subscribe((datasets: any) => {\n this.tableData.datasets.endOfResults = datasets.length < this.tableData.datasets.limit;\n this.tableData.datasets.data = datasets;\n });\n\n merge(this.searchText, this.tableData.snapshots.reload)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getSnapshots(this.tableData.snapshots.limit, this.tableData.snapshots.offset)\n )\n ).subscribe((snapshots: any) => {\n this.tableData.snapshots.endOfResults = snapshots.length < this.tableData.snapshots.limit;\n this.tableData.snapshots.data = snapshots;\n });\n\n merge(this.searchText, this.tableData.datasources.reload)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasources(this.tableData.datasources.limit, this.tableData.datasources.offset)\n )\n ).subscribe((datasources: any) => {\n this.tableData.datasources.endOfResults = datasources.length < this.tableData.datasources.limit;\n this.tableData.datasources.data = datasources;\n });\n\n if (!this.admin) {\n merge(this.searchText, this.tableData.shared.reload)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets(true, this.tableData.shared.limit, this.tableData.shared.offset)\n )\n ).subscribe((shared: any) => {\n this.tableData.shared.endOfResults = shared.length < this.tableData.shared.limit;\n this.tableData.shared.data = shared;\n });\n }\n\n if (this.data.joinTransformation) {\n this.joinTransformation = this.data.joinTransformation;\n const action = {\n datasourceKey: this.joinTransformation.config.joinedDataSourceInstanceKey,\n datasetId: this.joinTransformation.config.joinedDataSetInstanceId\n };\n\n setTimeout(() => {\n this.select(action, this.matStepper, false);\n }, 200);\n }\n }\n\n public increaseOffset(dataItem) {\n dataItem.page = dataItem.page + 1;\n dataItem.offset = (dataItem.limit * dataItem.page) - dataItem.limit;\n dataItem.reload.next(Date.now());\n }\n\n public decreaseOffset(dataItem) {\n dataItem.page = dataItem.page <= 1 ? 1 : dataItem.page - 1;\n dataItem.offset = (dataItem.limit * dataItem.page) - dataItem.limit;\n dataItem.reload.next(Date.now());\n }\n\n public pageSizeChange(value, dataItem) {\n dataItem.page = 1;\n dataItem.offset = 0;\n dataItem.limit = value;\n dataItem.reload.next(Date.now());\n }\n\n public async select(action, step, reset = true) {\n this.joinFilterFields = null;\n // Reset if we are selecting an item again, not loading initially.\n if (reset) {\n this.joinTransformation = {\n type: 'join',\n config: {\n joinFilters: [],\n joinColumns: [],\n joinParameterMappings: [],\n strictJoin: false\n }\n };\n }\n\n let requiredParams: any = [];\n\n if (action.datasourceKey) {\n this.selectedSource = {\n datasetInstanceId: null,\n datasourceInstanceKey: action.datasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n };\n this.joinTransformation.config.joinedDataSourceInstanceKey = action.datasourceKey;\n\n requiredParams = await this.datasourceService.getEvaluatedParameters({\n key: action.datasourceKey\n });\n } else if (action.datasetId) {\n this.selectedSource = await this.datasetService.getDataset(action.datasetId);\n this.joinTransformation.config.joinedDataSetInstanceId = action.datasetId;\n\n requiredParams = await this.datasetService.getEvaluatedParameters(this.selectedSource);\n }\n\n const existingJoinedParameters = this.joinTransformation.config.joinParameterMappings || [];\n\n this.createParameterStructure(requiredParams, existingJoinedParameters);\n\n if (!this.requiredParameters || !this.requiredParameters.length) {\n this.getJoinColumns(reset);\n }\n\n setTimeout(() => {\n step.next();\n }, 0);\n }\n\n public toggleAllColumns(event) {\n this.joinColumns.map(column => {\n column.selected = event.checked;\n return column;\n });\n }\n\n public allSelected() {\n this.allColumns = _.every(this.joinColumns, 'selected');\n }\n\n public async getParameterValues(step) {\n this.updateParams.next(Date.now());\n\n await this.getJoinColumns(true);\n\n setTimeout(() => {\n step.next();\n }, 0);\n }\n\n public setEvaluatedParameters(requiredParameters, step?) {\n const parameterMappings = [];\n requiredParameters.forEach(param => {\n const mapping: any = {parameterName: param.name};\n if (param.selectedType === 'Column') {\n mapping.sourceColumnName = param.value;\n } else if (param.selectedType === 'Parameter') {\n mapping.sourceParameterName = param.value;\n }\n parameterMappings.push(mapping);\n });\n this.joinTransformation.config.joinParameterMappings = parameterMappings;\n }\n\n public join() {\n const filters = this.joinTransformation.config.joinFilters;\n const selectedColumns = _.filter(this.joinColumns, 'selected');\n this.joinTransformation.config.joinColumns = selectedColumns.map(column => {\n return {name: column.name, title: column.title};\n });\n this.dialogRef.close(this.joinTransformation);\n }\n\n private createParameterStructure(requiredParameters, existingValue = []) {\n this.requiredParameters = requiredParameters.map(param => {\n param.type = 'join';\n param.selectedType = 'Column';\n\n const existing = _.find(existingValue, {parameterName: param.name});\n if (existing) {\n if (existing.sourceColumnName) {\n param.value = existing.sourceColumnName;\n }\n if (existing.sourceParameterName) {\n param.selectedType = 'Parameter';\n param.value = existing.sourceParameterName;\n }\n }\n\n param.values = [\n {\n label: 'Column',\n values: this.filterFields\n },\n {\n label: 'Parameter',\n values: _.map(this.parameterValues, (value) => {\n return {\n title: value.title + ' (' + value.currentValue + ')',\n name: value.name\n };\n })\n }\n ];\n return param;\n });\n }\n\n private async getJoinColumns(reset = true) {\n if (reset) {\n this.joinTransformation.config.joinFilters = {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: '',\n filterType: 'eq'\n }],\n filterJunctions: []\n };\n }\n\n // If we have join parameter mappings then we need to add the parameter value to the evaluate to get column data\n if (this.joinTransformation.config.joinParameterMappings &&\n this.joinTransformation.config.joinParameterMappings.length) {\n\n const firstDataRow = this.datasetEditor.dataset.allData[0];\n const parameterValues = {};\n this.joinTransformation.config.joinParameterMappings.forEach(param => {\n parameterValues[param.parameterName] = firstDataRow[param.sourceColumnName];\n });\n\n this.selectedSource.parameterValues = parameterValues;\n }\n\n const data: any = await this.datasetService.evaluateDataset(this.selectedSource, '0', '1');\n if (data.columns) {\n this.joinFilterFields = [];\n this.joinColumns = [];\n data.columns.forEach(column => {\n this.joinFilterFields.push(\n {\n title: column.title,\n name: column.name\n }\n );\n const duplicate = !!_.find(this.filterFields, {name: column.name, title: column.title});\n this.joinColumns.push({\n selected: !duplicate,\n name: column.name,\n title: column.title,\n duplicate\n });\n });\n }\n }\n\n private getDatasets(shared, limit, offset) {\n return this.datasetService.getDatasets(\n this.searchText.getValue() || '',\n limit.toString(),\n offset.toString(),\n shared ? null : ''\n ).pipe(map((datasets: any) => {\n return datasets;\n })\n );\n }\n\n private getDatasources(limit, offset) {\n return this.datasourceService.getDatasources(\n this.searchText.getValue() || '',\n limit.toString(),\n offset.toString()\n ).pipe(map((sources: any) => {\n return sources;\n })\n );\n }\n\n private getSnapshots(limit, offset) {\n return this.dataProcessorService.filterProcessorsByType(\n 'snapshot',\n this.searchText.getValue() || '',\n limit.toString(),\n offset.toString()\n ).pipe(map((snapshots: any) => {\n return _.filter(snapshots, snapshot => {\n return snapshot.taskStatus !== 'PENDING';\n });\n })\n );\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Join Data</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n\n <div class=\"border-t bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Join Data functionality allows you to merge data from another Data Feed, or Stored Query\n into this data feed. <b>Select</b> the data to merge and follow the on screen prompts to\n complete\n the join.\n </p>\n\n </div>\n </div>\n </div>\n\n <mat-horizontal-stepper [linear]=\"true\" #stepper [animationDuration]=\"0\">\n <mat-step [completed]=\"selectedSource\" label=\"Select data\">\n\n <ki-data-picker class=\"block\" style=\"height: 547px\" [admin]=\"admin\"\n (selected)=\"select($event, stepper)\"></ki-data-picker>\n\n </mat-step>\n @if (requiredParameters && requiredParameters.length) {\n <mat-step\n [completed]=\"joinTransformation.config.joinParameterMappings.length >= 1\"\n label=\"Required parameters\">\n <div class=\"mx-4\">\n @if (!selectedSource) {\n <p>Please select either a Datasource or Dataset to join to.</p>\n }\n @if (selectedSource) {\n <p class=\"mb-4\">\n @if (!joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ selectedSource.title || selectedSource.name }}</b>\n }\n @if (joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ joinTransformation.config.joinedDataItemTitle }}</b>\n }\n </p>\n @if (requiredParameters && requiredParameters.length) {\n <div class=\"mb-4\">\n <ki-dataset-parameter-values [parameterValues]=\"requiredParameters\" [hideNew]=\"true\"\n [update]=\"updateParams\"\n (changed)=\"setEvaluatedParameters($event, stepper)\"></ki-dataset-parameter-values>\n </div>\n }\n <div class=\"rounded-md bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: solid/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-600 mb-0\">\n The selected source requires a parameter to be set in order for the data\n to be retrieved. Please choose the relevant column to use as the parameter or\n choose an existing parameter value already defined in this query.\n </p>\n </div>\n </div>\n </div>\n }\n </div>\n </mat-step>\n }\n @if (!requiredParameters || !requiredParameters.length) {\n <mat-step\n [completed]=\"(!joinFilterFields || !joinFilterFields.length) ||\n (_.every(joinTransformation.config.joinFilters.filters, 'lhsExpression') &&\n _.every(joinTransformation.config.joinFilters.filters, 'rhsExpression'))\"\n label=\"Join criteria\">\n <div class=\"mx-4\">\n @if (!selectedSource) {\n <p>Please select either a Datasource or Dataset to join to.</p>\n }\n @if (selectedSource) {\n <p class=\"mb-4\">\n @if (!joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ selectedSource.title || selectedSource.name }}</b>\n }\n @if (joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ joinTransformation.config.joinedDataItemTitle }}</b>\n }\n </p>\n <div class=\"my-4\">\n <mat-checkbox [(ngModel)]=\"joinTransformation.config.strictJoin\">Strict Join?</mat-checkbox>\n <p><small>If turned on, data will be pruned to only return rows that match.</small></p>\n </div>\n @if (joinFilterFields) {\n <ki-dataset-filters [filterFields]=\"filterFields\"\n [joinFilterFields]=\"joinFilterFields\" [openSide]=\"openSide\"\n [joinFieldsName]=\"selectedSource.title || selectedSource.name\"\n [filterJunction]=\"joinTransformation.config.joinFilters\"></ki-dataset-filters>\n }\n @if (openSide.getValue()) {\n <ki-whitelisted-sql-functions [fields]=\"filterFields\"></ki-whitelisted-sql-functions>\n }\n }\n </div>\n </mat-step>\n }\n\n <mat-step [completed]=\"false\" label=\"Column definition\">\n <div class=\"mx-4\">\n @if (!selectedSource) {\n <p>Please select either a Datasource or Dataset to join to.</p>\n }\n\n @if (selectedSource) {\n <p class=\"mb-4\">\n @if (!joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ selectedSource.title || selectedSource.name }}</b>\n }\n @if (joinTransformation.config.joinedDataItemTitle) {\n <b>Selected\n source: {{ joinTransformation.config.joinedDataItemTitle }}</b>\n }\n </p>\n <p>Select the columns you would like to view, and set a new column name if required.</p>\n <div class=\"column-definition align-center\">\n <mat-checkbox [(ngModel)]=\"allColumns\" (change)=\"toggleAllColumns($event)\"></mat-checkbox>\n <label class=\"mw\">Column Name</label>\n <label class=\"mw\">New Column Title</label>\n </div>\n @for (column of joinColumns; track column) {\n <div class=\"column-definition align-center\">\n <mat-checkbox [(ngModel)]=\"column.selected\" (ngModelChange)=\"allSelected()\"></mat-checkbox>\n <label>\n <input type=\"text\" [(ngModel)]=\"column.name\" disabled>\n </label>\n <label>\n <input type=\"text\" [(ngModel)]=\"column.title\">\n </label>\n @if (column.duplicate) {\n <span class=\"primary\">Duplicate column name</span>\n }\n </div>\n }\n }\n </div>\n </mat-step>\n\n </mat-horizontal-stepper>\n\n </div>\n\n <div class=\"dialog-footer\">\n\n <!-- BACK/CANCEL BUTTONS-->\n @if (stepper.selectedIndex === 0) {\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n }\n @if (stepper.selectedIndex > 0) {\n <button mat-stroked-button color=\"primary\" (click)=\"stepper.previous()\">Back\n </button>\n }\n\n <!-- MIDDLE NEXT BUTTONS -->\n @if (stepper.selectedIndex === 1) {\n @if (!requiredParameters || !requiredParameters.length) {\n <button mat-flat-button color=\"primary\" (click)=\"stepper.next()\"\n [disabled]=\"(joinFilterFields && joinFilterFields.length) &&\n !(_.every(joinTransformation.config.joinFilters.filters, 'lhsExpression') &&\n _.every(joinTransformation.config.joinFilters.filters, 'rhsExpression'))\">\n Next\n </button>\n }\n @if (requiredParameters && requiredParameters.length) {\n <button mat-flat-button color=\"primary\" (click)=\"getParameterValues(stepper)\">\n Next\n </button>\n }\n }\n <!-- FINAL BUTTON -->\n @if (stepper.selectedIndex === 2) {\n <button mat-flat-button color=\"primary\" (click)=\"join()\">\n Create Join\n </button>\n }\n </div>\n\n</div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-dataset-create-formula',\n templateUrl: './dataset-create-formula.component.html',\n styleUrls: ['./dataset-create-formula.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetCreateFormulaComponent implements OnInit {\n\n public formulas: any = [{}];\n public allColumns: any = [];\n public _ = _;\n\n constructor(public dialogRef: MatDialogRef<DatasetCreateFormulaComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n this.allColumns = this.data.allColumns;\n this.formulas = this.data.formulas || [{}];\n this.formulas.map(formula => {\n if (formula.expression) {\n formula.expression = decodeURIComponent(formula.expression);\n }\n\n return formula;\n });\n }\n\n public addFormula() {\n this.formulas.push({});\n setTimeout(() => {\n const formulaScroll = document.getElementById('formula-scroll');\n formulaScroll.scrollTop = formulaScroll.scrollHeight;\n }, 0);\n }\n\n public removeFormula(i) {\n this.formulas.splice(i, 1);\n }\n\n public createFormula() {\n this.matchColumnName();\n this.dialogRef.close(this.formulas);\n }\n\n public close() {\n this.matchColumnName();\n this.dialogRef.close();\n }\n\n private matchColumnName() {\n this.formulas.map(formula => {\n if (formula.expression) {\n formula.expression = encodeURIComponent(formula.expression);\n }\n\n return formula;\n });\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Create Formula</h2>\n\n <button mat-icon-button (click)=\"close()\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-4\">\n\n <div class=\"border-t bg-blue-50 p-4 -mt-4 -mx-4 mb-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Use Formulas to create new derived columns from other columns. Use the inline\n <b>Documentation</b> below to see which columns and functions are available and how\n they can be used.\n </p>\n\n </div>\n </div>\n </div>\n\n @for (formula of formulas; track formula; let i = $index) {\n <div class=\"formula-container\">\n <div class=\"formula-fields\">\n <label>\n Column label\n <input type=\"text\" [(ngModel)]=\"formula.fieldTitle\">\n </label>\n <label>\n Expression\n <textarea name=\"\" id=\"\" cols=\"30\" rows=\"2\" [(ngModel)]=\"formula.expression\"></textarea>\n </label>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeFormula(i)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </div>\n }\n\n <ki-whitelisted-sql-functions [fields]=\"allColumns\"></ki-whitelisted-sql-functions>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-stroked-button color=\"primary\" (click)=\"close()\">Cancel</button>\n\n <button mat-flat-button color=\"primary\" (click)=\"createFormula()\"\n [disabled]=\"!_.every(this.formulas, 'fieldTitle') ||\n !_.every(this.formulas, 'expression')\">\n Create Formula\n </button>\n </div>\n\n</div>\n\n\n","import {Component, Input, OnInit, Output, EventEmitter, OnDestroy} from '@angular/core';\nimport {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-dataset-column-editor',\n templateUrl: './dataset-column-editor.component.html',\n styleUrls: ['./dataset-column-editor.component.sass'],\n standalone: false\n})\nexport class DatasetColumnEditorComponent implements OnInit, OnDestroy {\n\n @Input() columns: any = [];\n @Input() toggleAll = true;\n @Input() titleOnly = false;\n @Input() resetTrigger: Subject<any>;\n\n @Output() columnsChange = new EventEmitter();\n\n public allColumns = true;\n\n constructor() {\n }\n\n ngOnInit(): void {\n if (this.resetTrigger) {\n this.resetTrigger.subscribe(reset => {\n this.setColumns();\n });\n }\n\n this.setColumns();\n }\n\n ngOnDestroy() {\n if (this.resetTrigger) {\n this.resetTrigger.unsubscribe();\n }\n }\n\n public toggleAllColumns(event) {\n this.columns.map(column => {\n column.selected = event.checked;\n return column;\n });\n }\n\n public allSelected() {\n this.allColumns = _.every(this.columns, 'selected');\n }\n\n public drop(event: CdkDragDrop<string[]>) {\n moveItemInArray(this.columns, event.previousIndex, event.currentIndex);\n this.columnsChange.emit(this.columns);\n }\n\n private setColumns() {\n const previouslySelected = _.some(this.columns, 'selected');\n this.columns.forEach(column => {\n const filterObject: any = {title: column.title};\n if (!this.titleOnly) {\n filterObject.name = column.name;\n }\n const duplicate = _.filter(this.columns, filterObject) > 1;\n column.duplicate = duplicate;\n if (!previouslySelected) {\n column.selected = !duplicate;\n }\n if (duplicate) {\n column.selected = false;\n }\n });\n\n this.allColumns = _.every(this.columns, 'selected');\n }\n\n}\n","<div class=\"p-0\">\n\n <div class=\"column-toolbar py-3 px-6 bg-gray-50 border-b border-gray-200\">\n <div class=\"align-center\">\n <div class=\"show-hide\">\n <mat-checkbox [(ngModel)]=\"allColumns\" (change)=\"toggleAllColumns($event)\"></mat-checkbox>\n </div>\n @if (!titleOnly) {\n <div class=\"column-name uppercase tracking-wider text-xs font-semibold\">Name</div>\n }\n <div class=\"column-name uppercase tracking-wider text-xs font-semibold\">New column title</div>\n </div>\n\n <div class=\"reorder uppercase tracking-wider text-xs font-semibold\">Reorder</div>\n </div>\n\n <div cdkDropList class=\"column-editor px-4\" (cdkDropListDropped)=\"drop($event)\">\n @for (column of columns; track column) {\n <div class=\"align-center column-item\" cdkDrag>\n <div class=\"align-center\">\n <mat-checkbox [(ngModel)]=\"column.selected\" (ngModelChange)=\"allSelected()\"></mat-checkbox>\n @if (!titleOnly) {\n <input type=\"text\" [(ngModel)]=\"column.name\" disabled>\n }\n <input type=\"text\" [(ngModel)]=\"column.title\">\n @if (column.duplicate) {\n <span class=\"primary\">Duplicate column name</span>\n }\n </div>\n <mat-icon cdkDragHandle>drag_handle</mat-icon>\n </div>\n }\n </div>\n\n</div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-dataset-column-settings',\n templateUrl: './dataset-column-settings.component.html',\n styleUrls: ['./dataset-column-settings.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetColumnSettingsComponent implements OnInit {\n\n public columns: any = [];\n public reset = false;\n public resetFields = [];\n public resetTrigger = new Subject();\n public resetColumnNames: boolean = false;\n public namingConvention: string = \"CAMEL\";\n\n constructor(public dialogRef: MatDialogRef<DatasetColumnSettingsComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n this.columns = this.data.columns;\n this.reset = this.data.reset;\n this.resetFields = this.data.resetFields;\n this.resetColumnNames = this.data.resetColumnNames;\n this.namingConvention = this.data.namingConvention;\n }\n\n public updateSettings() {\n this.dialogRef.close({columns: _.filter(this.columns, 'selected'), resetColumnNames: this.resetColumnNames, namingConvention: this.namingConvention});\n }\n\n public resetColumns() {\n this.columns = this.resetFields;\n setTimeout(() => {\n this.resetTrigger.next(Date.now());\n }, 0);\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Table Column Settings</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content pt-0 pr-0 pb-4 pl-0\">\n\n <div class=\"bg-blue-50 p-4 border-t\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n <b>Select</b> which columns you would like to keep using the checkboxes. <b>Drag</b> the column\n rows using the handle to the right to reorder the columns. <b>Rename</b> any of the columns\n using the associated input boxes.\n </p>\n\n </div>\n </div>\n </div>\n\n @if (reset) {\n <div class=\"bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\"\n stroke=\"currentColor\" class=\"h-5 w-5 text-yellow-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n <a (click)=\"resetColumns()\" class=\"font-medium text-yellow-700 underline hover:text-yellow-600\">Revert changes back to original</a>\n </p>\n </div>\n </div>\n </div>\n }\n\n <div class=\"align-center px-6 pt-4\">\n <div class=\"show-hide\">\n <mat-checkbox [(ngModel)]=\"resetColumnNames\"></mat-checkbox>\n </div>\n <div class=\"font-medium ml-6\">&nbsp;&nbsp;Update Column Names using Titles</div>\n </div>\n <div class=\"text-gray-500 text-xs pl-6 pb-4 pt-1\">Change the underlying column names to match the titles based on the supplied format.</div>\n\n @if (resetColumnNames) {\n <div class=\"align-center px-6 pb-4\">\n <div class=\"font-medium\">Column Name Format&nbsp;&nbsp;</div>\n <div class=\"show-hide\">\n <mat-select [(ngModel)]=\"namingConvention\" class=\"p-2 mr-4 w-64\">\n <mat-option value=\"CAMEL\">Camel Case</mat-option>\n <mat-option value=\"UNDERSCORE\">Underscored</mat-option>\n </mat-select>\n </div>\n </div>\n }\n\n <hr>\n\n <ki-dataset-column-editor [(columns)]=\"columns\" [titleOnly]=\"true\"\n [resetTrigger]=\"resetTrigger\"></ki-dataset-column-editor>\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" (click)=\"updateSettings()\">Update Settings\n </button>\n </div>\n\n </div>\n\n\n","import {Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-upstream-changes-confirmation',\n templateUrl: './upstream-changes-confirmation.component.html',\n styleUrls: ['./upstream-changes-confirmation.component.sass'],\n standalone: false\n})\nexport class UpstreamChangesConfirmationComponent implements OnInit {\n\n constructor(public dialogRef: MatDialogRef<UpstreamChangesConfirmationComponent>) {\n }\n\n ngOnInit(): void {\n }\n\n public close(res?) {\n this.dialogRef.close(res);\n }\n\n}\n","<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Transformation Changes</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You have made changes which may result in upstream transformations becoming incompatible, causing\n the evaluation to fail.\n </p>\n\n <p class=\"text-sm text-gray-500\">\n You can choose to proceed with the evaluation keeping all transformations in place, remove the\n affected transformations, or cancel the changes you have made.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" (click)=\"close()\"\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">Cancel</button>\n <button type=\"button\" (click)=\"close('proceed')\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">Proceed Anyway</button>\n <button type=\"button\" (click)=\"close('remove')\"\n class=\"ml-2 inline-flex w-full justify-center rounded-md border border-transparent bg-primary px-4 py-2 text-sm font-medium text-white shadow-sm\">Remove Transformations</button>\n </div>\n</div>\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from '../../../../services/project.service';\n\n@Component({\n selector: 'ki-dataset-name-dialog',\n templateUrl: './dataset-name-dialog.component.html',\n styleUrls: ['./dataset-name-dialog.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetNameDialogComponent implements OnInit {\n\n public datasetInstanceSummary: any;\n public categories: any = [];\n\n constructor(public dialogRef: MatDialogRef<DatasetNameDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n async ngOnInit() {\n this.datasetInstanceSummary = this.data.datasetInstanceSummary;\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n this.categories = await this.http.get('/account/metadata/category?projectKey=' + projectKey, {\n params: {limit: '100'}\n }).toPromise();\n }\n\n public showSelected(o1: any, o2: any) {\n return o1 && o2 && o1.key === o2.key;\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Dataset Details</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"my-4\">\n <p><b>Title</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter title\" [(ngModel)]=\"datasetInstanceSummary.title\">\n </div>\n\n <div class=\"my-4\">\n <p><b>Summary</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter summary\" [(ngModel)]=\"datasetInstanceSummary.summary\">\n </div>\n\n <div class=\"my-4\">\n <p><b>Description</b></p>\n <textarea [(ngModel)]=\"datasetInstanceSummary.description\" placeholder=\"Enter description\" rows=\"5\"\n class=\"w-full\"></textarea>\n </div>\n\n <div class=\"my-4\">\n <p><b>Categories</b></p>\n\n <mat-selection-list [compareWith]=\"showSelected\" [(ngModel)]=\"datasetInstanceSummary.categories\" >\n @for (category of categories; track category) {\n <mat-list-option checkboxPosition=\"before\" [value]=\"category\">\n {{category.category}}\n </mat-list-option>\n }\n </mat-selection-list>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" [mat-dialog-close]=\"datasetInstanceSummary\">Save Changes</button>\n </div>\n\n</div>\n\n\n","import {Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-move-transformation-confirmation',\n templateUrl: './move-transformation-confirmation.component.html',\n styleUrls: ['./move-transformation-confirmation.component.sass'],\n standalone: false\n})\nexport class MoveTransformationConfirmationComponent implements OnInit {\n\n constructor(public dialogRef: MatDialogRef<MoveTransformationConfirmationComponent>) {\n }\n\n ngOnInit(): void {\n }\n\n public close(res?) {\n this.dialogRef.close(res);\n }\n}\n","<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Move Transformation?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You have made changes which may result in upstream transformations becoming incompatible, causing\n the evaluation to fail.\n </p>\n\n <p class=\"text-sm text-gray-500\">\n You can choose to proceed with the evaluation based on the new position\n of the selected transformation or cancel the changes you have made.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" (click)=\"close()\"\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">Cancel</button>\n <button type=\"button\" (click)=\"close('proceed')\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">Proceed Anyway</button>\n </div>\n</div>\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from '../../../../services/project.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-save-as-query',\n templateUrl: './save-as-query.component.html',\n styleUrls: ['./save-as-query.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class SaveAsQueryComponent implements OnInit {\n\n public datasetInstanceSummary: any;\n public categories: any = [];\n public transformations: any;\n public includeAllTransformations = true;\n public _ = _;\n public filteredTransformations: any = [];\n\n private projectKey = '';\n\n constructor(public dialogRef: MatDialogRef<SaveAsQueryComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n ngOnInit() {\n this.datasetInstanceSummary = this.data.datasetInstanceSummary;\n this.transformations = this.data.transformations;\n this.updateExcludedTransformations();\n this.projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n this.loadCategories();\n }\n\n public updateExcludedTransformations() {\n this.filteredTransformations = _.filter(this.transformations, transformation => {\n return this.includeAllTransformations ? true : (!transformation.exclude || transformation.type === 'multisort');\n });\n }\n\n public showSelected(o1: any, o2: any) {\n return o1 && o2 && o1.key === o2.key;\n }\n\n private async loadCategories() {\n this.categories = await this.http.get('/account/metadata/category?projectKey=' + this.projectKey, {\n params: {limit: '100'}\n }).toPromise();\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Copy Query</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"my-4\">\n <p><b>Title</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter title\" [(ngModel)]=\"datasetInstanceSummary.title\">\n </div>\n\n @if (transformations.length) {\n <div class=\"my-4\">\n <p><b>Transformations</b></p>\n @if (_.filter(transformations, 'exclude').length) {\n <mat-slide-toggle [(ngModel)]=\"includeAllTransformations\" (ngModelChange)=\"updateExcludedTransformations()\">\n Include disabled transformations</mat-slide-toggle>\n <div class=\"text-xs text-gray-400\">When saving this new query you can decide to exclude any\n disabled transformations in the current query.</div>\n }\n <div class=\"mt-4 text-sm text-gray-500\">Transformations being copied...</div>\n <div class=\"flex flex-wrap\">\n @for (transformation of filteredTransformations; track transformation) {\n <div class=\"bg-white border rounded-full px-2 py-1 mr-2 text-gray-500\"\n >\n {{_.startCase(transformation.type)}}\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"my-4\">\n <p><b>Summary</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter summary\" [(ngModel)]=\"datasetInstanceSummary.summary\">\n </div>\n\n <div class=\"my-4\">\n <p><b>Description</b></p>\n <textarea [(ngModel)]=\"datasetInstanceSummary.description\" placeholder=\"Enter description\" rows=\"5\"\n class=\"w-full\"></textarea>\n </div>\n\n <div class=\"my-4\">\n <p><b>Categories</b></p>\n\n <mat-selection-list [compareWith]=\"showSelected\" [(ngModel)]=\"datasetInstanceSummary.categories\" >\n @for (category of categories; track category) {\n <mat-list-option checkboxPosition=\"before\" [value]=\"category\">\n {{category.category}}\n </mat-list-option>\n }\n </mat-selection-list>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" [mat-dialog-close]=\"filteredTransformations\">Save Copy</button>\n </div>\n\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {AccountService, AuthenticationService} from 'ng-kiniauth';\nimport {MatAutocompleteSelectedEvent} from '@angular/material/autocomplete';\nimport {DatasetService} from '../../../../services/dataset.service';\nimport moment from 'moment';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-share-query',\n templateUrl: './share-query.component.html',\n styleUrls: ['./share-query.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ShareQueryComponent implements OnInit {\n\n public shareWithAccount = false;\n public hideShareWithAccount = false;\n public sharedAccounts: any = [];\n public invitedAccounts: any = [];\n public session: any;\n public accounts: any;\n public accountSearch: string = '';\n public enterSharingIdentifier: boolean = false;\n public sharingIdentifier: string = '';\n public sharingIdentifierError: boolean = false;\n public selectedAccount: any;\n public selectedExpiry: string;\n public moment: any = moment;\n public marketplaceData: any = {};\n public listOnMarketplace = false;\n\n protected readonly String = String;\n\n constructor(public dialogRef: MatDialogRef<ShareQueryComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private authService: AuthenticationService,\n private accountService: AccountService,\n private datasetService: DatasetService) {\n }\n\n async ngOnInit() {\n this.hideShareWithAccount = !!this.data.hideShareWithAccount;\n this.session = await this.authService.getSessionData();\n this.loadSharedAccounts();\n this.loadInvitedAccounts();\n }\n\n\n public async loadSharedAccounts() {\n this.sharedAccounts = await this.datasetService.getSharedAccessGroupsForDatasetInstance(this.data.datasetInstance.id);\n this.shareWithAccount = _.some(this.sharedAccounts, sharedAccount => {\n return _.find(sharedAccount.scopeAccesses, {itemIdentifier: String(this.session.account.accountId)});\n });\n }\n\n\n public async loadInvitedAccounts() {\n this.invitedAccounts = await this.datasetService.getInvitedAccessGroupsForDatasetInstance(this.data.datasetInstance.id);\n }\n\n\n public async filterSharableAccounts() {\n this.accounts = await this.accountService.searchForDiscoverableAccounts(this.accountSearch);\n }\n\n\n public async setLoggedInAccountShareStatus(event) {\n await this.datasetService.setSharedAccessForDatasetInstanceForLoggedInAccount(this.data.datasetInstance.id, event.checked);\n this.loadSharedAccounts();\n }\n\n\n public async lookupSharingIdentifier() {\n\n try {\n let account: any = await this.accountService.lookupDiscoverableAccountByExternalIdentifier(this.sharingIdentifier);\n this.selectAccount(account);\n } catch (e) {\n this.sharingIdentifierError = true;\n }\n }\n\n\n // Select account, and show additional options.\n public selectAccount(account: any) {\n\n this.accountSearch = '';\n this.sharingIdentifierError = false;\n this.sharingIdentifier = '';\n\n this.selectedAccount = account;\n\n }\n\n // Invite the selected account to share with the current query.\n public async inviteSelectedAccount() {\n await this.datasetService.inviteAccountToShareDatasetInstance(this.data.datasetInstance.id, this.selectedAccount.externalIdentifier, this.selectedExpiry);\n this.selectedAccount = null;\n this.loadInvitedAccounts();\n }\n\n\n // Revoke access to a group\n public async revokeAccessToGroup(accessGroup) {\n const message = 'Are you sure you would like to revoke access to this account?';\n if (window.confirm(message)) {\n await this.datasetService.revokeAccessToGroupForDatasetInstance(this.data.datasetInstance.id, accessGroup);\n this.loadSharedAccounts();\n }\n }\n\n public async cancelInvitation(accessGroup) {\n const message = 'Are you sure you would like to cancel this invitation?';\n if (window.confirm(message)) {\n await this.datasetService.cancelInvitationForAccessGroupForDatasetInstance(this.data.datasetInstance.id, accessGroup);\n this.loadInvitedAccounts();\n }\n }\n\n\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Share Query</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n <mat-tab-group>\n <mat-tab label=\"Sharing\">\n <div class=\"bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/information-circle -->\n <svg class=\"h-5 w-5 text-blue-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M19 10.5a8.5 8.5 0 11-17 0 8.5 8.5 0 0117 0zM8.25 9.75A.75.75 0 019 9h.253a1.75 1.75 0 011.709 2.13l-.46 2.066a.25.25 0 00.245.304H11a.75.75 0 010 1.5h-.253a1.75 1.75 0 01-1.709-2.13l.46-2.066a.25.25 0 00-.245-.304H9a.75.75 0 01-.75-.75zM10 7a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Share this query with other DAP users via a number of different methods.\n </p>\n </div>\n </div>\n </div>\n @if (!hideShareWithAccount) {\n <div class=\"px-6 pt-6 pb-4\">\n <mat-checkbox\n [(ngModel)]=\"shareWithAccount\" (change)=\"setLoggedInAccountShareStatus($event)\">\n Share With This Account\n </mat-checkbox>\n <div class=\"text-xs text-gray-400\">\n Make this query available to everyone who has access to the\n <b>{{ (session && session.account) ? session.account.name : '' }}</b> account.\n </div>\n </div>\n }\n\n <div class=\"px-6 py-4\">\n\n <div class=\"font-medium mb-2\">Share with other accounts</div>\n\n <div>\n <mat-form-field class=\"w-full mt-0 mb-0\" appearance=\"fill\">\n <mat-label>Search for Account</mat-label>\n <input type=\"text\"\n placeholder=\"Enter account name\"\n matInput\n [(ngModel)]=\"accountSearch\"\n [matAutocomplete]=\"auto\" (keyup)=\"filterSharableAccounts()\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selectAccount($event.option.value)\">\n @for (account of accounts; track account) {\n <mat-option [value]=\"account\">\n {{ account.accountName }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n <a (click)=\"enterSharingIdentifier=true\"\n class=\"bg-secondary px-2 py-1 rounded text-white inline-block mb-4\">or enter\n a sharing identifier</a>\n\n @if (enterSharingIdentifier) {\n <div class=\"flex\">\n <input class=\"full\" type=\"text\" [(ngModel)]=\"sharingIdentifier\"\n placeholder=\"Enter sharing identifier for other account\">\n <button (click)=\"lookupSharingIdentifier()\" mat-flat-button color=\"primary\" class=\"ml-2\">\n Lookup\n </button>\n </div>\n }\n @if (sharingIdentifierError) {\n <div class=\"text-xs text-red-500\">Invalid sharing identifier\n supplied.\n </div>\n }\n\n </div>\n\n @if (selectedAccount) {\n <div class=\"mt-8\">\n <h4>Share with account: {{selectedAccount.accountName}}</h4>\n <div class=\"flex items-center justify-between\">\n <mat-form-field appearance=\"fill\">\n <mat-label>Expiry Date for sharing</mat-label>\n <input type=\"date\"\n matInput\n [(ngModel)]=\"selectedExpiry\">\n </mat-form-field>\n <button mat-flat-button color=\"primary\" (click)=\"inviteSelectedAccount()\">\n Invite to share\n </button>\n </div>\n </div>\n }\n\n <hr class=\"my-8\">\n\n <div class=\" pl-3 tracking-wide uppercase border-b pb-2\">Invited Accounts</div>\n\n <table class=\"mb-10\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th class=\"w-1/2 sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">Account Name</th>\n <th class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">Access Expires</th>\n <th class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\"></th>\n </tr>\n </thead>\n @for (account of invitedAccounts; track account) {\n <tr>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">{{account.scopeAccesses[0].itemLabel}}</td>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">{{account.expiryDateString ? moment(account.expiryDateString).format('MMMM Do YYYY') : 'Never'}}</td>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500 text-right\">\n <a class=\"text-secondary bg-gray-50 border px-2 py-1 rounded\" (click)=\"cancelInvitation(account.groupName)\">cancel invite</a>\n </td>\n </tr>\n }\n </table>\n\n\n <div class=\" pl-3 tracking-wide uppercase border-b pb-2\">Accounts with Access</div>\n\n <table>\n <thead class=\"bg-gray-100\">\n <tr>\n <th class=\"w-1/2 sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">Account Name</th>\n <th class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">Access Expires</th>\n <th class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\"></th>\n </tr>\n </thead>\n @for (account of sharedAccounts; track account) {\n @if (String(account.scopeAccesses[0].itemIdentifier) !== String(session.account.accountId)) {\n <tr>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">{{account.scopeAccesses[0].itemLabel}}</td>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">{{account.expiryDateString ? moment(account.expiryDateString).format('MMMM Do YYYY') : 'Never'}}</td>\n <td class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500 text-right\">\n <a class=\"text-secondary bg-gray-50 border px-2 py-1 rounded\" (click)=\"revokeAccessToGroup(account.groupName)\">revoke access</a>\n </td>\n </tr>\n }\n }\n </table>\n\n\n </div>\n </mat-tab>\n <!-- <mat-tab label=\"Marketplace\">-->\n <!-- <div class=\"px-6 py-4\">-->\n <!-- <mat-checkbox-->\n <!-- [(ngModel)]=\"listOnMarketplace\">-->\n <!-- List Query on Marketplace-->\n <!-- </mat-checkbox>-->\n <!-- <div class=\"text-xs text-gray-400\">-->\n <!-- Advertise this query to other users via the DAP Marketplace.-->\n <!-- </div>-->\n\n <!-- <div class=\"border-l pl-8\" *ngIf=\"listOnMarketplace\">-->\n\n <!-- <div class=\"my-4\">-->\n <!-- <p><b>Marketplace Description</b></p>-->\n <!-- <textarea [(ngModel)]=\"marketplaceData.description\" placeholder=\"Enter description\" rows=\"3\"-->\n<!-- class=\"w-full\"></textarea>-->\n<!-- <div class=\"text-xs text-gray-400\">Describe the data you are offering.</div>-->\n<!-- </div>-->\n\n<!-- <div class=\"my-4\">-->\n<!-- <p><b>Upload Icon</b></p>-->\n<!-- <input class=\"full\" type=\"file\" [(ngModel)]=\"marketplaceData.icon\">-->\n<!-- <div class=\"text-xs text-gray-400\">Attach a small image to help identify your data.</div>-->\n<!-- </div>-->\n\n<!-- <div class=\"my-4\">-->\n<!-- <p><b>Price</b></p>-->\n<!-- <input class=\"w-1/2\" type=\"number\" placeholder=\"Enter price\" [(ngModel)]=\"marketplaceData.price\">-->\n<!-- <div class=\"text-xs text-gray-400\">Set a price for accessing this dataset.</div>-->\n<!-- </div>-->\n\n<!-- <mat-checkbox-->\n<!-- [(ngModel)]=\"marketplaceData.requireVerification\">-->\n<!-- Require Account Confirmation/Verification-->\n<!-- </mat-checkbox>-->\n<!-- <div class=\"text-xs text-gray-400\">Perform additional validation on accounts requesting access-->\n<!-- to this query.</div>-->\n\n<!-- </div>-->\n\n<!-- </div>-->\n<!-- </mat-tab>-->\n</mat-tab-group>\n\n</div>\n\n<div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Close</button>\n</div>\n\n</div>\n","import {Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-remove-transformation-warning',\n templateUrl: './remove-transformation-warning.component.html',\n styleUrls: ['./remove-transformation-warning.component.sass'],\n standalone: false\n})\nexport class RemoveTransformationWarningComponent implements OnInit {\n constructor(public dialogRef: MatDialogRef<RemoveTransformationWarningComponent>) {\n }\n\n ngOnInit(): void {\n }\n\n public close(res?) {\n this.dialogRef.close(res);\n }\n}\n","<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Remove Transformation?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to remove a transformation which may result in upstream transformations becoming\n incompatible, causing the evaluation to fail.\n </p>\n\n <p class=\"text-sm text-gray-500\">\n You can choose to proceed with the removal or cancel the change.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed Anyway\n </button>\n\n\n </div>\n</div>\n\n","import {Component, Inject, Input, OnInit, Output, EventEmitter, OnDestroy} from '@angular/core';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {DatasetSummariseComponent} from './dataset-summarise/dataset-summarise.component';\nimport {DatasetAddJoinComponent} from './dataset-add-join/dataset-add-join.component';\nimport {DatasetCreateFormulaComponent} from './dataset-create-formula/dataset-create-formula.component';\nimport {DatasetColumnSettingsComponent} from './dataset-column-settings/dataset-column-settings.component';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport {DatasetFilterComponent} from './dataset-filters/dataset-filter/dataset-filter.component';\nimport {\n DatasetAddParameterComponent\n} from './dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component';\nimport {BehaviorSubject, Subject, Subscription} from 'rxjs';\nimport moment from 'moment';\nimport {\n UpstreamChangesConfirmationComponent\n} from '../dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component';\nimport {\n DatasetNameDialogComponent\n} from '../dataset-editor/dataset-name-dialog/dataset-name-dialog.component';\nimport {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';\nimport {\n MoveTransformationConfirmationComponent\n} from '../dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component';\nimport {\n SaveAsQueryComponent\n} from '../dataset-editor/save-as-query/save-as-query.component';\nimport {\n ShareQueryComponent\n} from '../dataset-editor/share-query/share-query.component';\nimport {\n RemoveTransformationWarningComponent\n} from '../dataset-editor/remove-transformation-warning/remove-transformation-warning.component';\nimport {COMMA, ENTER} from \"@angular/cdk/keycodes\";\nimport {MatChipInputEvent} from \"@angular/material/chips\";\n\n@Component({\n selector: 'ki-dataset-editor',\n templateUrl: './dataset-editor.component.html',\n styleUrls: ['./dataset-editor.component.sass'],\n standalone: false\n})\nexport class DatasetEditorComponent implements OnInit, OnDestroy {\n\n @Input() datasetInstanceSummary: any;\n @Input() environment: any = {};\n @Input() admin: boolean;\n @Input() dashboardParameters: any;\n @Input() dashboardLayoutSettings: any;\n @Input() accountId;\n @Input() newTitle;\n @Input() newDescription;\n @Input() datasetEditorReadonly = false;\n @Input() datasetEditorSimpleMode: boolean = false;\n @Input() datasetEditorNoTools: boolean = false;\n\n @Output() dataLoaded = new EventEmitter<any>();\n @Output() datasetInstanceSummaryChange = new EventEmitter();\n\n public dataset: any;\n public tableData = [];\n public showFilters = false;\n public showParameters = false;\n public displayedColumns = [];\n public _ = _;\n public Array = Array;\n public Object = Object;\n public filterFields = [];\n public filterJunction = {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n };\n public page = 1;\n public endOfResults = false;\n public parameterValues: any = [];\n public focusParams = false;\n public terminatingTransformations = [];\n public String = String;\n public longRunning = false;\n public sideOpen = false;\n public openSide = new BehaviorSubject(false);\n public limit = 25;\n public offset = 0;\n public filterParameterValues: any;\n\n public readonly decodeURIComponent = decodeURIComponent;\n\n private evaluateSub: Subscription;\n private resultsSub: Subscription;\n private datasetTitle: string;\n\n constructor(public dialogRef: MatDialogRef<DatasetEditorComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dialog: MatDialog,\n private datasetService: DatasetService,\n private snackBar: MatSnackBar) {\n }\n\n async ngOnInit() {\n let limit = null;\n limit = localStorage.getItem('datasetInstanceLimit' + this.datasetInstanceSummary.id);\n\n this.limit = limit ? Number(limit) : 25;\n\n if (this.datasetInstanceSummary.transformationInstances.length) {\n const filters = _.filter(this.datasetInstanceSummary.transformationInstances, {type: 'filter'});\n if (filters.length) {\n filters.forEach(filter => {\n filter.hide = true;\n });\n }\n }\n\n if (Array.isArray(this.datasetInstanceSummary.parameterValues)) {\n this.datasetInstanceSummary.parameterValues = {};\n }\n\n if (!this.datasetInstanceSummary.id) {\n this.datasetTitle = this.datasetInstanceSummary.title;\n }\n\n this.evaluateDataset();\n\n this.openSide.subscribe((open: boolean) => {\n if (open) {\n document.getElementById('sidebarWrapper')?.classList.add('z-20');\n document.getElementById('sidebarWrapper')?.classList.remove('-z-10');\n } else {\n setTimeout(() => {\n document.getElementById('sidebarWrapper')?.classList.add('-z-10');\n document.getElementById('sidebarWrapper')?.classList.remove('z-20');\n }, 700);\n }\n this.sideOpen = open;\n });\n }\n\n ngOnDestroy() {\n if (this.evaluateSub) {\n this.evaluateSub.unsubscribe();\n }\n }\n\n public async shareQuery() {\n this.dialog.open(ShareQueryComponent, {\n width: '800px',\n height: '950px',\n data: {\n datasetInstance: this.datasetInstanceSummary\n }\n }).afterClosed().subscribe(res => {\n\n });\n }\n\n public async saveAsQuery() {\n const newDatasetInstance: any = {\n title: this.datasetInstanceSummary.title || 'Stored Query' + ' COPY',\n summary: '',\n description: '',\n categories: this.datasetInstanceSummary.categories,\n datasourceInstanceKey: this.datasetInstanceSummary.datasourceInstanceKey,\n datasetInstanceId: this.datasetInstanceSummary.datasetInstanceId,\n tags: this.datasetInstanceSummary.tags,\n parameterValue: this.datasetInstanceSummary.parameterValues,\n parameters: this.datasetInstanceSummary.parameters\n };\n this.dialog.open(SaveAsQueryComponent, {\n width: '700px',\n height: '800px',\n data: {\n datasetInstanceSummary: newDatasetInstance,\n transformations: this.datasetInstanceSummary.transformationInstances\n }\n }).afterClosed().subscribe(async transformationInstances => {\n if (transformationInstances) {\n newDatasetInstance.transformationInstances = transformationInstances;\n await this.datasetService.saveDataset(newDatasetInstance, this.accountId);\n this.snackBar.open('Dataset successfully copied.', 'Close', {\n verticalPosition: 'top',\n duration: 3000\n });\n }\n });\n }\n\n public drop(event: CdkDragDrop<any>) {\n this.dialog.open(MoveTransformationConfirmationComponent, {\n width: '700px',\n height: '275px'\n }).afterClosed().subscribe(res => {\n if (res === 'proceed') {\n moveItemInArray(this.datasetInstanceSummary.transformationInstances, event.previousContainer.data.index, event.container.data.index);\n this.evaluateDataset();\n }\n });\n }\n\n public async insertTransformation(index: number, transformationType: string, nextTransformation: any) {\n await this.excludeUpstreamTransformations(nextTransformation);\n\n switch (transformationType) {\n case 'columns':\n this.editColumnSettings(null, null, index);\n break;\n case 'formula':\n this.createFormula(null, null, index);\n break;\n case 'join':\n this.joinData(null, null, index);\n break;\n case 'summarise':\n this.summariseData(null, null, index);\n break;\n case 'filter':\n this.addFilter(index);\n break;\n }\n }\n\n public addFilter(insertIndex?: number) {\n _.forEach(this.datasetInstanceSummary.transformationInstances || [], transformation => {\n transformation.hide = true;\n });\n\n const filterTransformation = {\n type: 'filter',\n config: {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n },\n hide: false\n };\n\n if (!_.isNil(insertIndex) && insertIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances.splice(insertIndex, 0, filterTransformation);\n } else {\n this.datasetInstanceSummary.transformationInstances.push(filterTransformation);\n }\n\n this.showFilters = true;\n this.setTerminatingTransformations();\n\n setTimeout(() => {\n const filters = document.getElementById('datasetFilters');\n if (filters) {\n filters.scrollTo({top: filters.scrollHeight, behavior: 'smooth'});\n }\n }, 0);\n }\n\n public getFilterString(config) {\n const filter = config.filters[0];\n if (config.filters.length) {\n if (_.every(filter)) {\n const type = DatasetFilterComponent.getFilterType(filter.filterType);\n if (type) {\n const lhsExpression = filter.lhsExpression.replace('[[', '').replace(']]', '');\n return `${_.startCase(lhsExpression)} ${type.string} ${filter.rhsExpression}`;\n }\n return '';\n }\n }\n return '';\n }\n\n public removeFilter(index) {\n const existingMultiSort = _.find(this.datasetInstanceSummary.transformationInstances, {type: 'multisort'});\n existingMultiSort.config.sorts.splice(index, 1);\n if (!existingMultiSort.config.sorts.length) {\n _.remove(this.datasetInstanceSummary.transformationInstances, {type: 'multisort'});\n }\n this.evaluateDataset();\n }\n\n public removeTransformation(transformation: any, confirm = false, index?: number, active?: boolean) {\n if (index === undefined) {\n index = _.findIndex(this.datasetInstanceSummary.transformationInstances, {\n type: transformation.type,\n config: transformation.config\n });\n }\n\n\n if (!active) {\n const dialogRef = this.dialog.open(RemoveTransformationWarningComponent, {\n width: '700px',\n height: '275px'\n });\n dialogRef.afterClosed().subscribe(proceed => {\n if (proceed) {\n this._removeTransformation(transformation, index);\n }\n });\n } else {\n if (confirm) {\n const message = 'Are you sure you would like to remove this transformation?';\n if (window.confirm(message)) {\n this._removeTransformation(transformation, index);\n }\n } else {\n this._removeTransformation(transformation, index);\n }\n }\n\n }\n\n public enableAllTransformation() {\n this.datasetInstanceSummary.transformationInstances.forEach((transformation: any) => {\n transformation.exclude = false;\n });\n this.evaluateDataset();\n }\n\n public disableTransformation(transformation, index) {\n transformation.exclude = !transformation.exclude;\n this.evaluateDataset();\n }\n\n public showTransformationDetail(transformation) {\n const clone = _.clone(transformation);\n this.terminatingTransformations.forEach(item => {\n item._showDetail = false;\n });\n if (!clone._showDetail) {\n transformation._showDetail = true;\n }\n }\n\n public async editTerminatingTransformation(transformation) {\n const [clonedTransformation, existingIndex] = await this.excludeUpstreamTransformations(transformation);\n if (transformation.type === 'filter') {\n const hiddenValue = !transformation.hide;\n const filters = _.filter(this.datasetInstanceSummary.transformationInstances, {type: 'filter'});\n filters.forEach(filter => {\n filter.hide = true;\n });\n transformation.hide = hiddenValue;\n this.showFilters = !hiddenValue;\n } else {\n if (transformation.type === 'summarise') {\n this.summariseData(clonedTransformation.config, existingIndex);\n }\n if (transformation.type === 'join') {\n this.joinData(clonedTransformation, existingIndex);\n }\n if (transformation.type === 'formula') {\n this.createFormula(clonedTransformation, existingIndex);\n }\n if (transformation.type === 'columns') {\n this.editColumnSettings(clonedTransformation, existingIndex);\n }\n }\n }\n\n public exportData() {\n\n }\n\n public async editColumnSettings(existingTransformation?: any, existingIndex?: number, insertIndex?: number) {\n const clonedColumns = existingTransformation ? _.clone(existingTransformation.config.columns) : null;\n const resetColumnNames = existingTransformation ? existingTransformation.config.resetColumnNames : true;\n const namingConvention = existingTransformation ? existingTransformation.config.namingConvention : \"CAMEL\";\n\n\n const columnSettings = [];\n\n if (clonedColumns) {\n clonedColumns.forEach(column => {\n column.selected = true;\n columnSettings.push(column);\n });\n }\n\n this.filterFields.forEach(field => {\n if (!_.find(columnSettings, {name: field.name})) {\n columnSettings.push(field);\n }\n });\n\n const dialogRef = this.dialog.open(DatasetColumnSettingsComponent, {\n width: '1000px',\n height: '800px',\n disableClose: true,\n data: {\n columns: columnSettings,\n reset: !!_.find(this.datasetInstanceSummary.transformationInstances, {type: 'columns'}),\n resetFields: _.clone(this.filterFields),\n resetColumnNames,\n namingConvention\n }\n });\n\n dialogRef.afterClosed().subscribe(result => {\n const columns = result.columns;\n if (columns) {\n const fields = _.map(columns, column => {\n return {title: column.title, name: column.name};\n });\n\n const columnTransformation = {\n type: 'columns',\n config: {\n columns: fields,\n resetColumnNames: result.resetColumnNames,\n namingConvention: result.namingConvention\n }\n };\n\n if (!_.isNil(existingIndex) && existingIndex > -1) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = columnTransformation;\n } else if (!_.isNil(insertIndex) && insertIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances.splice(insertIndex, 0, columnTransformation);\n } else {\n this.datasetInstanceSummary.transformationInstances.push(columnTransformation);\n }\n\n this.evaluateDataset();\n } else {\n if (clonedColumns) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = {\n type: 'columns',\n config: {\n columns: clonedColumns\n }\n };\n this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n instance.exclude = false;\n });\n this.evaluateDataset();\n }\n }\n });\n }\n\n public createFormula(existingTransformation?: any, existingIndex?: number, insertIndex?: number) {\n const clonedExpressions = existingTransformation ? _.clone(existingTransformation.config.expressions) : null;\n const dialogRef = this.dialog.open(DatasetCreateFormulaComponent, {\n width: '900px',\n height: '800px',\n disableClose: true,\n data: {\n allColumns: this.filterFields,\n formulas: existingTransformation ? existingTransformation.config.expressions : [{}]\n }\n });\n\n dialogRef.afterClosed().subscribe(formula => {\n if (formula) {\n const formulaTransformation = {\n type: 'formula',\n config: {\n expressions: formula\n }\n };\n\n if (!_.isNil(existingIndex) && existingIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = formulaTransformation;\n } else if (!_.isNil(insertIndex) && insertIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances.splice(insertIndex, 0, formulaTransformation);\n } else {\n this.datasetInstanceSummary.transformationInstances.push(formulaTransformation);\n }\n\n this.evaluateDataset();\n } else {\n // Formula was cancelled, restore if we have one\n if (clonedExpressions) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = {\n type: 'formula',\n config: {\n expressions: clonedExpressions\n }\n };\n this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n instance.exclude = false;\n });\n this.evaluateDataset();\n }\n }\n });\n }\n\n public joinData(transformation?: any, existingIndex?: number, insertIndex?: number) {\n const clonedTransformation = transformation ? _.clone(transformation) : null;\n const data: any = {\n admin: this.admin,\n environment: this.environment,\n filterFields: this.filterFields,\n parameterValues: _.map(this.parameterValues, param => {\n return {\n title: param.title,\n name: param.name,\n currentValue: this.datasetInstanceSummary.parameterValues[param.name]\n };\n }),\n datasetEditor: this,\n };\n if (transformation) {\n data.joinTransformation = {\n type: 'join',\n config: transformation.config\n };\n }\n\n const dialogRef = this.dialog.open(DatasetAddJoinComponent, {\n width: '1200px',\n height: '800px',\n disableClose: true,\n data,\n });\n\n dialogRef.afterClosed().subscribe(joinTransformation => {\n if (joinTransformation) {\n if (!_.isNil(existingIndex) && existingIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = joinTransformation;\n } else if (!_.isNil(insertIndex) && insertIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances.splice(insertIndex, 0, joinTransformation);\n } else {\n this.datasetInstanceSummary.transformationInstances.push(joinTransformation);\n }\n this.evaluateDataset(true);\n } else {\n if (clonedTransformation) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = clonedTransformation;\n this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n instance.exclude = false;\n });\n this.evaluateDataset();\n }\n }\n });\n }\n\n public applyFilters() {\n const filterTransformations = _.filter(this.datasetInstanceSummary.transformationInstances, {type: 'filter'});\n filterTransformations.forEach(transformation => {\n this.validateFilterJunction(transformation.config);\n });\n\n this.evaluateDataset(true);\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluateDataset();\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluateDataset();\n }\n\n public pageSizeChange(value) {\n this.limit = value;\n localStorage.setItem('datasetInstanceLimit' + this.datasetInstanceSummary.id, this.limit.toString());\n this.evaluateDataset(true);\n }\n\n public addPagingMarker() {\n this.datasetInstanceSummary.transformationInstances.push({type: 'pagingmarker'});\n this.evaluateDataset();\n }\n\n public sort(event) {\n const column = event.active;\n const direction = event.direction;\n\n const existingMultiSort = _.find(this.datasetInstanceSummary.transformationInstances, {type: 'multisort'});\n if (existingMultiSort) {\n const existingIndex = _.findIndex(existingMultiSort.config.sorts, {fieldName: column});\n if (direction) {\n if (existingIndex > -1) {\n existingMultiSort.config.sorts[existingIndex] = {fieldName: column, direction};\n } else {\n existingMultiSort.config.sorts.push({fieldName: column, direction});\n }\n } else {\n existingMultiSort.config.sorts.splice(existingIndex, 1);\n if (!existingMultiSort.config.sorts.length) {\n _.remove(this.datasetInstanceSummary.transformationInstances, {type: 'multisort'});\n }\n }\n } else {\n if (direction) {\n this.datasetInstanceSummary.transformationInstances.push(\n {\n type: 'multisort',\n config: {\n sorts: [{fieldName: column, direction}]\n }\n }\n );\n }\n }\n this.evaluateDataset(true);\n }\n\n public summariseData(config?: any, existingIndex?: number, insertIndex?: number) {\n const clonedConfig = config ? _.clone(config) : null;\n const summariseDialog = this.dialog.open(DatasetSummariseComponent, {\n width: '1100px',\n height: '900px',\n disableClose: true,\n data: {\n availableColumns: this.filterFields,\n config: config ? config : null,\n originDataItemTitle: this.datasetInstanceSummary.originDataItemTitle\n }\n });\n\n summariseDialog.afterClosed().subscribe(summariseTransformation => {\n if (summariseTransformation) {\n // this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n // instance.exclude = false;\n // });\n if (!_.isNil(existingIndex) && existingIndex >= 0) {\n // Check if anything has changed\n if (!_.isEqual(clonedConfig, summariseTransformation) && (existingIndex + 1) < this.datasetInstanceSummary.transformationInstances.length) {\n // Things have changed, ask user to confirm\n\n this.dialog.open(UpstreamChangesConfirmationComponent, {\n width: '700px',\n height: '275px'\n }).afterClosed().subscribe(res => {\n if (res) {\n if (res === 'remove') {\n for (let i = existingIndex; i < this.datasetInstanceSummary.transformationInstances.length; i++) {\n this.datasetInstanceSummary.transformationInstances.splice(i, 1);\n }\n }\n\n this.datasetInstanceSummary.transformationInstances[existingIndex] = {\n type: 'summarise',\n config: summariseTransformation\n };\n this.evaluateDataset(true);\n }\n });\n } else {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = {\n type: 'summarise',\n config: summariseTransformation\n };\n this.evaluateDataset(true);\n }\n } else if (!_.isNil(insertIndex) && insertIndex >= 0) {\n this.datasetInstanceSummary.transformationInstances.splice(insertIndex, 0, {\n type: 'summarise',\n config: summariseTransformation\n });\n this.evaluateDataset(true);\n } else {\n this.datasetInstanceSummary.transformationInstances.push({\n type: 'summarise',\n config: summariseTransformation\n });\n this.evaluateDataset(true);\n }\n } else {\n // If we get here then the summarise transformation was cancelled - restore if we have one\n if (clonedConfig) {\n this.datasetInstanceSummary.transformationInstances[existingIndex] = {\n type: 'summarise',\n config: clonedConfig\n };\n this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n instance.exclude = false;\n });\n this.evaluateDataset();\n }\n }\n });\n }\n\n public removeParameter(parameter) {\n const message = 'Are you sure you would like to remove this parameter. This may cause some dashboard items ' +\n 'to fail.';\n if (window.confirm(message)) {\n _.remove(this.parameterValues, {name: parameter.name});\n _.remove(this.datasetInstanceSummary.parameters, {name: parameter.name});\n this.evaluateDataset();\n }\n }\n\n public addParameter(existingParameter?, parameterValueIndex?) {\n let clonedParameter = null;\n if (existingParameter) {\n clonedParameter = _.clone(existingParameter);\n }\n if (!this.showParameters) {\n this.showParameters = true;\n }\n const dialogRef = this.dialog.open(DatasetAddParameterComponent, {\n width: '750px',\n height: '850px',\n disableClose: true,\n data: {\n parameter: clonedParameter\n }\n });\n dialogRef.afterClosed().subscribe(parameter => {\n if (parameter) {\n if (!clonedParameter) {\n if (parameter.defaultValue) {\n parameter.value = parameter.defaultValue;\n }\n\n this.parameterValues.push(parameter);\n this.datasetInstanceSummary.parameters.push(parameter);\n } else {\n if (!clonedParameter.value) {\n parameter.value = parameter.defaultValue || '';\n }\n this.parameterValues[parameterValueIndex] = parameter;\n this.datasetInstanceSummary.parameters[parameterValueIndex] = parameter;\n }\n\n if (parameter.type === 'list') {\n this.loadListParameters(parameter);\n }\n\n this.setAvailableFilterParameters();\n }\n });\n }\n\n public async loadListParameters(parameter: any) {\n if (parameter.settings && parameter.settings.datasetInstance) {\n return this.datasetService.evaluateDataset(parameter.settings.datasetInstance, '0', '100000')\n .then((data: any) => {\n const list = _.map(data.allData, item => {\n return {\n label: item[parameter.settings.labelColumn],\n value: item[parameter.settings.valueColumn]\n };\n });\n parameter.list = _.uniqWith(list, _.isEqual);\n });\n }\n }\n\n public getOrdinal(n) {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\n }\n\n public viewFullItemData(data, columnName) {\n this.dialog.open(DatasetEditorPopupComponent, {\n width: '800px',\n height: '400px',\n data: {\n fullData: data,\n columnName\n }\n });\n }\n\n public booleanUpdate(event, parameter) {\n parameter.value = event.checked;\n }\n\n public changeDateType(event, parameter, value) {\n event.stopPropagation();\n event.preventDefault();\n parameter._dateType = value;\n }\n\n public updatePeriodValue(value, period, parameter) {\n parameter.value = `${value}_${period}_AGO`;\n }\n\n public cancelEvaluate() {\n if (this.resultsSub) {\n this.resultsSub.unsubscribe();\n }\n\n this.longRunning = false;\n }\n\n public setDashboardParameter(parameter: any, parameterName: string) {\n parameter.value = '{{' + parameterName + '}}';\n this.evaluateDataset(true);\n }\n\n public save() {\n if (!this.datasetInstanceSummary.id && (this.datasetInstanceSummary.title === this.datasetTitle)) {\n const dialogRef = this.dialog.open(DatasetNameDialogComponent, {\n width: '700px',\n height: '800px',\n disableClose: true,\n data: {\n datasetInstanceSummary: this.datasetInstanceSummary\n }\n });\n dialogRef.afterClosed().subscribe(datasetInstanceSummary => {\n if (datasetInstanceSummary) {\n this.datasetInstanceSummary = datasetInstanceSummary;\n this.saveDataset();\n }\n });\n } else {\n this.saveDataset();\n }\n }\n\n private async saveDataset() {\n await this.datasetService.saveDataset(this.datasetInstanceSummary, this.accountId);\n this.snackBar.open('Dataset successfully saved.', 'Close', {\n verticalPosition: 'top',\n duration: 3000\n });\n }\n\n public async excludeUpstreamTransformations(transformation, resetPager = false) {\n const clonedTransformation = _.clone(transformation);\n // Grab the index of the current transformation - so we know which upstream transformations to exclude\n const existingIndex = _.findIndex(this.datasetInstanceSummary.transformationInstances, {\n type: transformation.type,\n config: transformation.config\n });\n\n // Exclude all upstream transformations from the evaluate\n this.datasetInstanceSummary.transformationInstances.forEach((instance, index) => {\n if ((index >= existingIndex) && instance.type !== 'multisort') {\n instance.exclude = true;\n }\n });\n\n await this.evaluateDataset(resetPager);\n return [clonedTransformation, existingIndex];\n }\n\n private validateFilterJunction(filterConfig) {\n\n const check = (filterJunction) => {\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < filterJunction.filterJunctions.length; i++) {\n const junction = filterJunction.filterJunctions[i];\n if (!junction.filters.length && !junction.filterJunctions.length) {\n filterJunction.filterJunctions.splice(i, 1);\n } else {\n check(junction);\n }\n }\n };\n\n check(filterConfig);\n }\n\n private loadData() {\n this.tableData = this.dataset.allData;\n\n if (!this.tableData.length) {\n const data = {};\n data[this.dataset.columns[0].name] = 'No Results';\n this.tableData = [data];\n }\n\n this.endOfResults = this.dataset.allData.length < this.limit;\n this.displayedColumns = _.map(this.dataset.columns, 'name');\n this.filterFields = _.map(this.dataset.columns, column => {\n return {\n title: column.title,\n name: column.name\n };\n });\n this.dataLoaded.emit(this.dataset);\n this.datasetInstanceSummaryChange.emit(this.datasetInstanceSummary);\n this.setTerminatingTransformations();\n return true;\n }\n\n private setParameterValues(values) {\n\n }\n\n private setTerminatingTransformations() {\n let summarise = 0;\n let join = 0;\n const summariseTotal = _.filter(this.datasetInstanceSummary.transformationInstances, {type: 'summarise'}).length;\n const joinTotal = _.filter(this.datasetInstanceSummary.transformationInstances, {type: 'join'}).length;\n\n this.terminatingTransformations = _.filter(this.datasetInstanceSummary.transformationInstances, (transformation, index) => {\n if (transformation.type === 'summarise') {\n summarise++;\n transformation._label = this.getOrdinal(summarise) + ' Summarise';\n transformation._disable = summarise < summariseTotal;\n transformation._active = summarise === summariseTotal;\n\n return true;\n }\n if (transformation.type === 'join') {\n join++;\n transformation._label = transformation.config.joinedDataItemTitle || this.getOrdinal(join) + ' Join';\n transformation._disable = join < joinTotal;\n transformation._active = join === joinTotal;\n\n return true;\n }\n if (transformation.type === 'pagingmarker') {\n transformation._label = 'Paging Marker';\n transformation._disable = false;\n transformation._active = true;\n return true;\n }\n if (transformation.type === 'formula') {\n transformation._label = transformation.config.expressions[0].fieldTitle;\n transformation._disable = false;\n transformation._active = true;\n return true;\n }\n if (transformation.type === 'columns') {\n transformation._label = 'Columns Update';\n transformation._disable = false;\n transformation._active = true;\n return true;\n }\n if (transformation.type === 'filter') {\n transformation._label = 'Filter';\n transformation._disable = false;\n transformation._active = true;\n return true;\n }\n return false;\n });\n }\n\n\n /**\n * Add an in value\n */\n public addParameterValue(parameter: any, event: any) {\n\n const value = (event.value || event.target?.value || '').trim();\n\n if (!_.isArray(parameter.value)) {\n parameter.value = [];\n }\n\n if (value && value !== 'null' && parameter.value.indexOf(value) === -1) {\n parameter.value.push(value);\n }\n\n // Clear the input value\n if (event.chipInput) {\n event.chipInput!.clear();\n }\n }\n\n /**\n * Remove an in value\n *\n */\n public removeParameterValue(parameter: any, value: string) {\n\n const index = parameter.value.indexOf(value);\n\n if (index >= 0) {\n parameter.value.splice(index, 1);\n }\n }\n\n public async evaluateDataset(resetPager?: boolean) {\n return new Promise(async (resolve, reject) => {\n if (resetPager) {\n this.resetPager();\n }\n\n const clonedDatasetInstance = await this.prepareDatasetInstanceForEvaluation();\n this.setAvailableFilterParameters();\n\n const trackingKey = Date.now() + (Math.random() + 1).toString(36).substr(2, 5);\n let finished = false;\n\n if (this.dashboardLayoutSettings) {\n this.dashboardLayoutSettings.limit = this.limit;\n this.dashboardLayoutSettings.offset = this.offset;\n }\n\n this.evaluateSub = this.datasetService.evaluateDatasetWithTracking(\n clonedDatasetInstance,\n String(this.offset),\n String(this.limit),\n trackingKey\n ).subscribe(async dataset => {\n finished = true;\n this.dataset = dataset;\n this.loadData();\n resolve(true);\n }, err => {\n finished = true;\n if (err.error && err.error.message) {\n let message = err.error.message.toLowerCase();\n if (message.includes('sql')) {\n message = 'An error occurred processing your query. Please check any SQL syntax and try again.';\n }\n if (!message.includes('parameter') && !message.includes('required')) {\n this.snackBar.open(err.error.message, 'Close', {\n verticalPosition: 'top',\n duration: 5000\n });\n }\n }\n // If the evaluate fails we still want to publish the instance and set the terminating transformations\n this.datasetInstanceSummaryChange.emit(this.datasetInstanceSummary);\n this.setTerminatingTransformations();\n\n return reject(false);\n });\n\n setTimeout(() => {\n if (!finished) {\n // If we have any pre-existing long-running tasks cancel these before setting off another evaluate.\n this.cancelEvaluate();\n\n this.longRunning = true;\n this.evaluateSub.unsubscribe();\n\n this.resultsSub = this.datasetService.getDataTrackingResults(trackingKey)\n .subscribe((results: any) => {\n if (results.status === 'COMPLETED') {\n this.resultsSub.unsubscribe();\n this.dataset = results.result;\n this.longRunning = false;\n this.loadData();\n resolve(true);\n } else if (results.status === 'FAILED') {\n this.resultsSub.unsubscribe();\n this.longRunning = false;\n const errorMessage = results.result;\n if (errorMessage) {\n const message = errorMessage.toLowerCase();\n if (!message.includes('parameter') && !message.includes('required')) {\n this.snackBar.open(errorMessage, 'Close', {\n verticalPosition: 'top',\n duration: 5000\n });\n }\n }\n // If the evaluate fails we still want to publish the instance and set the terminating transformations\n this.datasetInstanceSummaryChange.emit(this.datasetInstanceSummary);\n this.setTerminatingTransformations();\n resolve(false);\n }\n });\n }\n }, 3000);\n });\n }\n\n private setAvailableFilterParameters() {\n const filterParameterValues = _.map(_.concat(_.values(this.dashboardParameters), _.values(this.parameterValues)), param => {\n return {name: param.name, title: param.title};\n });\n this.filterParameterValues = _.uniqBy(filterParameterValues, 'name');\n }\n\n private _removeTransformation(transformation, index?) {\n if (!_.isNil(index) && index >= 0) {\n // If a current index has been supplied, reset all the pre transformation hidden fields prior to eval.\n for (let i = 0; i < index; i++) {\n if (this.datasetInstanceSummary.transformationInstances[i].type !== 'filter') {\n this.datasetInstanceSummary.transformationInstances[i].hide = false;\n }\n }\n\n this.datasetInstanceSummary.transformationInstances.splice(index, 1);\n } else {\n _.remove(this.datasetInstanceSummary.transformationInstances, _.omitBy({\n type: transformation.type,\n config: transformation.type !== 'pagingmarker' ? transformation.config : null\n }, _.isNil));\n }\n\n this.evaluateDataset(true);\n }\n\n private resetPager() {\n this.offset = 0;\n this.page = 1;\n }\n\n private async prepareDatasetInstanceForEvaluation() {\n const values: any = await this.datasetService.getEvaluatedParameters(this.datasetInstanceSummary);\n\n const paramValues = values.map(value => {\n value._locked = !_.find(this.datasetInstanceSummary.parameters, {name: value.name});\n return value;\n });\n\n this.focusParams = false;\n const parameterValues = {};\n paramValues.forEach(paramValue => {\n const existParam = _.find(this.parameterValues, {name: paramValue.name});\n if (!existParam) {\n const existingValue = this.datasetInstanceSummary.parameterValues[paramValue.name];\n paramValue.value = _.isNil(existingValue) ? paramValue.defaultValue : existingValue;\n parameterValues[paramValue.name] = paramValue;\n this.focusParams = !existingValue;\n } else {\n parameterValues[existParam.name] = existParam;\n }\n });\n this.parameterValues = _.values(parameterValues);\n\n if (this.datasetInstanceSummary && this.datasetInstanceSummary.id) {\n localStorage.setItem('datasetInstanceLimit' + this.datasetInstanceSummary.id, (this.limit).toString());\n } else if (this.datasetInstanceSummary.instanceKey) {\n localStorage.setItem('datasetInstanceLimit' + this.datasetInstanceSummary.instanceKey, (this.limit).toString());\n }\n\n const sort = _.find(this.datasetInstanceSummary.transformationInstances, {type: 'multisort'});\n if (sort) {\n const clone = _.clone(sort);\n _.remove(this.datasetInstanceSummary.transformationInstances, sort);\n this.datasetInstanceSummary.transformationInstances.push(clone);\n }\n\n // Clone the current instance object, so we can remove any excluded transformations, without affecting\n // the original object which the gui uses to draw transformation items.\n const clonedDatasetInstance = _.merge({}, this.datasetInstanceSummary);\n _.remove(clonedDatasetInstance.transformationInstances, {exclude: true});\n\n const excludedTransformations = _.find(this.datasetInstanceSummary.transformationInstances, {exclude: true});\n if (excludedTransformations) {\n _.remove(clonedDatasetInstance.transformationInstances, {type: 'multisort'});\n }\n\n this.parameterValues.forEach(param => {\n if (param.type === 'date' || param.type === 'datetime') {\n if (!param._dateType && param.value) {\n const isPeriod = param.value.includes('AGO');\n param._dateType = isPeriod ? 'period' : 'picker';\n if (isPeriod) {\n const periodValues = param.value.split('_');\n param._periodValue = periodValues[0];\n param._period = periodValues[1];\n }\n }\n }\n if (param.type === 'list' && !param.list?.length) {\n this.loadListParameters(param);\n }\n\n if (this.dashboardParameters && Object.keys(this.dashboardParameters).length) {\n if (_.isString(param.value) && param.value.includes('{{')) {\n const paramKey = param.value.replace('{{', '').replace('}}', '');\n\n if (this.dashboardParameters[paramKey]) {\n clonedDatasetInstance.parameterValues[param.name] = this.dashboardParameters[paramKey].value;\n }\n } else if (!clonedDatasetInstance.parameterValues[param.name] && this.dashboardParameters[param.name]) {\n // If no value has been set default to the dashboard param value\n clonedDatasetInstance.parameterValues[param.name] = this.dashboardParameters[param.name].value;\n } else if (!clonedDatasetInstance.parameterValues[param.name]) {\n // Unless there isn't a dashboard param that matches\n clonedDatasetInstance.parameterValues[param.name] = param.value;\n }\n } else {\n clonedDatasetInstance.parameterValues[param.name] = param.value;\n }\n\n this.datasetInstanceSummary.parameterValues[param.name] = param.value;\n });\n\n // Merge in global dashboard params\n if (this.dashboardParameters && Object.keys(this.dashboardParameters).length) {\n _.forEach(this.dashboardParameters, (param, name) => {\n if (!clonedDatasetInstance.parameterValues[name]) {\n clonedDatasetInstance.parameterValues[name] = param.value;\n }\n });\n }\n\n // Ensure we send back any dates in correct format\n const datetimeParams = _.filter(clonedDatasetInstance.parameters, param => {\n return param.type === 'date' || param.type === 'datetime';\n });\n datetimeParams.forEach(param => {\n const value = clonedDatasetInstance.parameterValues[param.name];\n if (value && !value.includes('AGO')) {\n clonedDatasetInstance.parameterValues[param.name] = moment(value).format('YYYY-MM-DD HH:mm:ss');\n }\n });\n\n return clonedDatasetInstance;\n }\n\n protected readonly decodeURI = decodeURI;\n protected readonly ENTER = ENTER;\n protected readonly COMMA = COMMA;\n}\n\n@Component({\n selector: 'ki-dataset-editor-popup',\n templateUrl: 'dataset-editor-popup.html',\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DatasetEditorPopupComponent {\n\n public fullData: string;\n public columnName: string;\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: DatasetEditorPopupComponent) {\n\n this.fullData = this.data.fullData;\n this.columnName = _.startCase(this.data.columnName);\n }\n\n}\n","@if (longRunning) {\n <div class=\"long-running flex-col\">\n <div class=\"loading-box\">\n <mat-spinner [diameter]=\"150\"></mat-spinner>\n <div>Loading</div>\n </div>\n <p class=\"text-center\">Please wait while we process this query.</p>\n <p class=\"text-center\">The results will be shown here once it has finished running.</p>\n <div>\n <a class=\"text-primary hover:underline\" (click)=\"cancelEvaluate()\">Cancel query and return to editor.</a>\n </div>\n </div>\n}\n<div class=\"pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 -z-10\" id=\"sidebarWrapper\">\n <div [class]=\"{'translate-x-0': sideOpen, 'translate-x-full': !sideOpen}\"\n (click)=\"$event.stopPropagation()\"\n class=\"pointer-events-auto w-screen max-w-md transform transition ease-in-out duration-500 sm:duration-700\"\n id=\"docSidebar\">\n <div class=\"flex h-full flex-col overflow-y-scroll bg-white py-6 shadow-xl\">\n <div class=\"px-4 sm:px-6\">\n <div class=\"flex items-start justify-between\">\n <div></div>\n\n <div class=\"ml-3 flex h-7 items-center\">\n <button type=\"button\" (click)=\"openSide.next(false)\"\n class=\"rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none\">\n <span class=\"sr-only\">Close panel</span>\n <!-- Heroicon name: outline/x -->\n <svg class=\"h-6 w-6\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n <div class=\"relative flex-1 px-4 sm:px-6\">\n <ki-whitelisted-sql-functions [fields]=\"filterFields\"></ki-whitelisted-sql-functions>\n </div>\n </div>\n </div>\n</div>\n\n@if (!datasetEditorNoTools) {\n <div class=\"border-b cell-header end\">\n <div class=\"leading-5 px-4 text-xs uppercase tracking-wider font-medium border-r-2 text-gray-600\">\n Operations\n </div>\n <div class=\"dataset-data-actions\">\n <button (click)=\"addFilter()\"\n title=\"Filter the set using column based restrictions\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">filter_alt</span>\n filter\n </button>\n <button (click)=\"summariseData()\"\n title=\"Summarise this data to produce aggregated totals, sums and other derivations\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">pivot_table_chart</span>\n summarise\n </button>\n @if (!datasetEditorSimpleMode) {\n <button (click)=\"joinData()\"\n title=\"Join another data set to the current dataset\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">merge_type</span>\n join\n </button>\n }\n <div class=\"divider\"></div>\n <button (click)=\"createFormula()\"\n title=\"Create a formula column using an expression based on other columns\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">functions</span>\n formula\n </button>\n <button (click)=\"editColumnSettings()\"\n title=\"Switch on and off columns for display\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">table_chart</span>\n columns\n </button>\n @if (!datasetEditorSimpleMode) {\n <div class=\"divider\"></div>\n }\n @if (!datasetEditorSimpleMode) {\n <button (click)=\"addParameter()\"\n title=\"Add a parameter to use in filters, expressions etc.\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">text_fields</span>\n parameters\n </button>\n }\n @if (!datasetEditorSimpleMode) {\n <button (click)=\"addPagingMarker()\"\n title=\"Insert paging marker to limit results at this stage in the query flow\"\n class=\"w-24 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">skip_next</span>\n paging marker\n </button>\n }\n <div class=\"divider\"></div>\n <button (click)=\"evaluateDataset()\"\n title=\"Reload this query based upon changes you may have made\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">sync</span>\n reload\n </button>\n @if (!datasetEditorReadonly) {\n <button [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\" (click)=\"shareQuery()\"\n title=\"Share this query with other account holders\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">share</span>\n share\n </button>\n <button (click)=\"saveAsQuery()\"\n title=\"Make a copy of this query\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">file_copy</span>\n copy query\n </button>\n @if (!dashboardLayoutSettings && datasetInstanceSummary.id) {\n <button (click)=\"save()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">save</span>\n save\n </button>\n }\n }\n </div>\n </div>\n}\n\n<div class=\"cell-header\">\n @if (showParameters || parameterValues.length) {\n <div class=\"transformation-listing parameter-listing\">\n <div class=\"list-title\">\n Parameters\n </div>\n <div class=\"flex items-center flex-wrap\">\n @for (parameter of parameterValues; track parameter; let i = $index) {\n <label class=\"pl-4\">\n {{ parameter.title }}\n @if ((parameter.value || '').toString().includes('}}')) {\n <div>\n <mat-chip class=\"bg-gray-50 ml-2\" title=\"Using parameter value from {{parameter.value}}\">\n <div class=\"flex items-center\">\n <span class=\"material-symbols-outlined text-xl mr-1 text-gray-500\">layers</span>\n @if (dashboardParameters[parameter.value.replace('{{', '').replace('}}', '')]) {\n <span\n [innerHTML]=\"dashboardParameters[parameter.value.replace('{{', '').replace('}}', '')].value\"></span>\n }\n @if (!dashboardParameters[parameter.value.replace('{{', '').replace('}}', '')]) {\n <span\n class=\"font-medium text-orange-600\">\n Parameter Not Found !\n </span>\n }\n </div>\n <button matChipRemove (click)=\"parameter.value = ''\" title=\"\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n </div>\n }\n @if (!(parameter.value || '').toString().includes('}}')) {\n <div class=\"parameter-input\">\n @if (!parameter.multiple) {\n @if (parameter.type === 'text') {\n <input class=\"pr-8\" type=\"text\" placeholder=\"Enter {{parameter.title}}\"\n [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"evaluateDataset(true)\" required autofocus>\n }\n @if (parameter.type === 'numeric') {\n <input class=\"pr-8\" type=\"number\" placeholder=\"Enter {{parameter.title}}\"\n [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"evaluateDataset(true)\" required autofocus>\n }\n @if (parameter.type === 'list') {\n <select class=\"pr-8 py-1.5 pl-1 self-center\" [(ngModel)]=\"parameter.value\"\n (change)=\"evaluateDataset(true)\" required autofocus>\n <option [value]=\"null\">-- Select Value --</option>\n @for (item of parameter.list; track item) {\n <option [value]=\"item.value\">{{ item.label }}\n </option>\n }\n </select>\n }\n @if (parameter.type === 'date' || parameter.type === 'datetime') {\n @if (!parameter._dateType) {\n <div class=\"flex items-center mr-8\">\n <button (click)=\"changeDateType($event, parameter, 'picker')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n Date Picker\n </button>\n <button (click)=\"changeDateType($event, parameter, 'period')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n Time Period\n </button>\n </div>\n }\n @if (parameter._dateType === 'picker') {\n <input [type]=\"parameter.type === 'date' ? 'date' : 'datetime-local'\"\n placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"evaluateDataset(true)\" required autofocus>\n <a (click)=\"changeDateType($event, parameter, 'period')\"\n matTooltip=\"Time Period\"\n class=\"mr-10 text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n </a>\n }\n @if (parameter._dateType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-16 mr-2\" min=\"0\" [value]=\"parameter._periodValue\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <select class=\"param-period-picker mr-2\" [value]=\"parameter._period || 'DAYS'\"\n #period\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div>Ago</div>\n </div>\n <a (click)=\"changeDateType($event, parameter, 'picker')\"\n matTooltip=\"Date Picker\"\n class=\"mr-10 text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n </a>\n }\n }\n @if (parameter.type === 'boolean') {\n <mat-slide-toggle class=\"pr-8\" color=\"primary\"\n [checked]=\"parameter.value\" (change)=\"booleanUpdate($event, parameter)\"\n required></mat-slide-toggle>\n }\n }\n @if (parameter.multiple) {\n <mat-chip-grid class=\"pl-2\" #chipGrid aria-label=\"Enter values\">\n @for (paramValue of parameter.value; track paramValue) {\n <mat-chip-row\n class=\"bg-white mr-2\"\n (removed)=\"removeParameterValue(parameter, paramValue)\">\n {{paramValue}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + paramValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n @if (parameter.type === 'text') {\n <input class=\"pr-8 py-1 self-center\" type=\"text\" placeholder=\"Enter {{parameter.title}}\"\n required autofocus\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"[ENTER, COMMA]\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addParameterValue(parameter, $event)\">\n }\n @if (parameter.type === 'numeric') {\n <input class=\"pr-8\" type=\"number\" placeholder=\"Enter {{parameter.title}}\"\n required autofocus\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"[ENTER, COMMA]\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addParameterValue(parameter, $event)\">\n }\n @if (parameter.type === 'list') {\n <select class=\"pr-8 py-1.5 pl-1 self-center\" matNativeControl\n (change)=\"addParameterValue(parameter, $event)\" required autofocus>\n <option [value]=\"null\">-- Select Value --</option>\n @for (item of parameter.list; track item) {\n <option [value]=\"item.value\">{{ item.label }}\n </option>\n }\n </select>\n }\n </mat-chip-grid>\n }\n @if (!parameter._locked) {\n <button mat-icon-button [matMenuTriggerFor]=\"paramMenu\">\n <mat-icon>settings</mat-icon>\n </button>\n <mat-menu #paramMenu=\"matMenu\">\n <button mat-menu-item (click)=\"addParameter(parameter, i)\">Edit Parameter</button>\n <button mat-menu-item (click)=\"removeParameter(parameter)\">Remove Parameter</button>\n </mat-menu>\n }\n @if (Object.keys(dashboardParameters || {}).length) {\n <button mat-icon-button [matMenuTriggerFor]=\"dashParamMenu\"\n title=\"Bind this parameter value to another\">\n <mat-icon>text_fields</mat-icon>\n </button>\n <mat-menu #dashParamMenu=\"matMenu\">\n @for (dashParamKey of Object.keys(dashboardParameters); track dashParamKey) {\n <button mat-menu-item\n (click)=\"setDashboardParameter(parameter, dashboardParameters[dashParamKey].name)\">{{ dashboardParameters[dashParamKey].title }}\n </button>\n }\n </mat-menu>\n }\n </div>\n }\n </label>\n @if (parameterValues.length) {\n <div class=\"divider ml-2\"></div>\n }\n }\n <button mat-icon-button color=\"primary\" class=\"mx-2\" (click)=\"addParameter()\">\n <mat-icon>add_circle</mat-icon>\n </button>\n @if (parameterValues.length) {\n <button type=\"button\" (click)=\"evaluateDataset(true)\"\n class=\"mr-2 flex items-center whitespace-nowrap justify-center px-4 py-1 border border-transparent text-sm rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Apply Parameters\n </button>\n }\n </div>\n </div>\n }\n</div>\n\n<div class=\"cell-header\">\n @if (terminatingTransformations.length) {\n <div class=\"transformation-listing py-2\">\n <div class=\"list-title\">\n Transformations\n </div>\n <div class=\"example-list flex flex-wrap\" cdkDropListGroup>\n @for (transformation of terminatingTransformations; track transformation; let i = $index) {\n @if (!transformation.hidden) {\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"{item:transformation,index:i}\">\n <div class=\"flex items-center\">\n <div class=\"new-transformation flex items-center justify-center w-6 h-6\">\n <a [matMenuTriggerFor]=\"addTransformation\"\n class=\"items-center add-transformation text-primary\">\n <mat-icon class=\"flex items-center w-5 h-5 text-xl\">add_circle</mat-icon>\n </a>\n <mat-menu #addTransformation=\"matMenu\">\n <button mat-menu-item (click)=\"insertTransformation(i, 'columns', transformation)\">\n Insert Column Transformation\n </button>\n <button mat-menu-item (click)=\"insertTransformation(i, 'formula', transformation)\">\n Insert Formula Transformation\n </button>\n <button mat-menu-item (click)=\"insertTransformation(i, 'join', transformation)\">\n Insert Join Transformation\n </button>\n <button mat-menu-item (click)=\"insertTransformation(i, 'summarise', transformation)\">\n Insert Summarise Transformation\n </button>\n <button mat-menu-item (click)=\"insertTransformation(i, 'filter', transformation)\">\n Insert Filter Transformation\n </button>\n </mat-menu>\n </div>\n <div cdkDrag class=\"pl-0 example-box badge-item w-auto m-0\" cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n [class]=\"{active: transformation._active, 'exclude bg-orange-50 border-orange-200': !!transformation.exclude, 'bg-indigo-50 border-indigo-200': (transformation.type === 'filter' && transformation.hide === false)}\">\n <button class=\"-mt-0.5\" title=\"Show transformation details\" mat-icon-button\n (click)=\"showTransformationDetail(transformation)\">\n @if (transformation.type === 'columns') {\n <span class=\"material-symbols-outlined ml-1 text-xl\"\n >table_chart</span>\n }\n @if (transformation.type === 'formula') {\n <span class=\"material-symbols-outlined text-xl\"\n >functions</span>\n }\n @if (transformation.type === 'join') {\n <span class=\"material-symbols-outlined text-xl\">merge_type</span>\n }\n @if (transformation.type === 'summarise') {\n <span class=\"material-symbols-outlined ml-1 text-xl\"\n >pivot_table_chart</span>\n }\n @if (transformation.type === 'filter') {\n <span class=\"material-symbols-outlined text-xl\"\n >filter_alt</span>\n }\n </button>\n <span class=\"whitespace-nowrap cursor-pointer\"\n (click)=\"editTerminatingTransformation(transformation)\">{{ transformation._label }}</span>\n @if (transformation.exclude) {\n <button class=\"-ml-1\" [title]=\"'Re-enable this transformation'\"\n mat-icon-button (click)=\"disableTransformation(transformation, i)\">\n <mat-icon class=\"text-orange-400\">replay</mat-icon>\n </button>\n }\n @if (!transformation.exclude && i + 1 === terminatingTransformations.length) {\n <button class=\"-ml-1\" [title]=\"'Disable transformation'\"\n mat-icon-button (click)=\"disableTransformation(transformation, i)\">\n <mat-icon>block</mat-icon>\n </button>\n }\n @if (!transformation.exclude && i + 1 !== terminatingTransformations.length) {\n <button class=\"-ml-1\" [matMenuTriggerFor]=\"disableMenu\"\n [title]=\"'Disable transformation'\"\n mat-icon-button>\n <mat-icon>block</mat-icon>\n </button>\n <mat-menu #disableMenu=\"matMenu\">\n <button mat-menu-item (click)=\"disableTransformation(transformation, i)\">\n Disable this transformation\n </button>\n <button mat-menu-item (click)=\"excludeUpstreamTransformations(transformation)\">\n Disable subsequent transformation(s)\n </button>\n </mat-menu>\n }\n <button class=\"-ml-1\" title=\"Remove this transformation\" mat-icon-button color=\"primary\"\n (click)=\"removeTransformation(transformation, true, null, transformation._active)\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"transformation._showDetail\">\n <div class=\"p-4 w-96 bg-white shadow rounded\">\n @if (transformation.type === 'summarise') {\n <p class=\"text-sm text-gray-700 mb-0\">\n <b>SELECT&nbsp;</b>@for (expression of transformation.config.expressions; track expression; let i = $index) {\n <span\n >@if (i > 0) {\n <span\n >, </span>\n }{{ expression.customExpression || expression.expressionType + '(' + (expression.fieldName || '') + ')' }}</span>\n }\n @if (transformation.config.summariseFieldNames.length) {\n <br><b>GROUP\n BY&nbsp;</b> {{ transformation.config.summariseFieldNames.join(', ') }}\n }\n </p>\n }\n @if (transformation.type === 'formula') {\n <div class=\"text-sm text-gray-700 mb-0\">\n <b>EXPRESSION</b>&nbsp;{{ decodeURIComponent(transformation.config.expressions[0].expression) }}\n </div>\n }\n @if (transformation.type === 'columns') {\n <div class=\"text-sm text-gray-700 mb-0\">\n <b>COLUMNS</b>&nbsp;{{ _.map(transformation.config.columns, 'title').join(', ') }}\n </div>\n }\n @if (transformation.type === 'join') {\n <div class=\"text-sm text-gray-700 mb-0\">\n <b>JOIN\n COLUMNS</b>&nbsp;{{ _.map(transformation.config.joinColumns, 'title').join(', ') }}\n </div>\n }\n @if (transformation.type === 'filter') {\n @for (filter of transformation.config.filters; track filter) {\n <div\n class=\"text-sm text-gray-700 mb-0\">\n <b>FILTER</b>&nbsp;{{ filter.lhsExpression }}&nbsp;<b>{{ filter.filterType }}</b>&nbsp;{{ filter.rhsExpression }}\n </div>\n }\n }\n </div>\n </ng-template>\n </div>\n </div>\n }\n @if (_.some(terminatingTransformations, {exclude: true}) && i === terminatingTransformations.length - 1) {\n <button\n class=\"ml-4 flex items-center border-none bg-primary text-sm rounded-md text-white pr-2 pl-1 py-0.5\"\n (click)=\"enableAllTransformation()\">\n <mat-icon class=\"mr-1 text-base\">replay</mat-icon>\n Enable All\n </button>\n }\n }\n </div>\n</div>\n}\n</div>\n\n<div class=\"cell-header\">\n @if (_.filter(datasetInstanceSummary.transformationInstances, {type: 'filter', hide: false}).length) {\n <div class=\"transformation-listing py-2 filters-list\"\n >\n <a class=\"list-title flex items-center\" (click)=\"showFilters = !showFilters\">\n Filters&nbsp;\n @if (!showFilters) {\n <mat-icon>expand_more</mat-icon>\n }\n @if (showFilters) {\n <mat-icon>expand_less</mat-icon>\n }\n </a>\n @for (filterTransformation of _.filter(datasetInstanceSummary.transformationInstances, {type: 'filter', hide: false}); track filterTransformation) {\n @if (_.every(filterTransformation.config.filters[0])) {\n <div class=\"badge-item pl-2 mr-1\"\n (click)=\"showFilters = !showFilters\">\n <span class=\"cursor-pointer\" [innerHtml]=\"getFilterString(filterTransformation.config)\"></span>\n </div>\n }\n }\n </div>\n }\n</div>\n\n@if (_.filter(datasetInstanceSummary.transformationInstances, {type: 'filter', hide: false}).length\n && showFilters) {\n <div class=\"dataset-filters\" id=\"datasetFilters\"\n >\n @for (transformation of datasetInstanceSummary.transformationInstances; track transformation; let i = $index) {\n @if (transformation.type === 'filter' && transformation.hide === false) {\n <div class=\"dataset-filter border-b border-gray-200\">\n <button mat-stroked-button class=\"mr-2 bg-white remove-filter\" color=\"warn\"\n (click)=\"removeTransformation(transformation, true, i)\">\n Remove Filter\n </button>\n @if (filterFields.length) {\n <ki-dataset-filters [filterFields]=\"filterFields\"\n [openSide]=\"openSide\" [parameterValues]=\"filterParameterValues\"\n [filterJunction]=\"transformation.config\"></ki-dataset-filters>\n }\n @if (_.filter(datasetInstanceSummary.transformationInstances, {type: 'filter', hide: false}).length) {\n <button\n mat-flat-button class=\"apply-filter mr-2\" color=\"primary\"\n (click)=\"applyFilters()\" [disabled]=\"!filterJunction.filters.length\">\n Apply Filters\n </button>\n }\n </div>\n }\n }\n </div>\n}\n\n<div class=\"cell-header\">\n @if (_.find(datasetInstanceSummary.transformationInstances, {type: 'multisort'})) {\n <div class=\"transformation-listing sort\"\n >\n <div class=\"list-title\">\n Sort\n </div>\n <div class=\"flex flex-wrap\">\n @for (sort of _.find(datasetInstanceSummary.transformationInstances, {type: 'multisort'}).config.sorts; track sort; let i = $index) {\n <div class=\"badge-item outline\"\n [class]=\"{'exclude bg-orange-50 border-orange-200': _.find(datasetInstanceSummary.transformationInstances, {exclude: true})}\"\n >\n <span>{{ _.startCase(sort.fieldName) }}&nbsp;<span class=\"uppercase\">{{ sort.direction }}</span></span>\n <button mat-icon-button (click)=\"removeFilter(i)\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<div class=\"h-full table-overflow overflow-scroll\">\n @if (displayedColumns.length) {\n <table mat-table [dataSource]=\"tableData\" matSort (matSortChange)=\"sort($event)\"\n class=\"block sticky\">\n @for (column of filterFields; track column) {\n <ng-container [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n class=\"text-xs font-semibold text-gray-900 py-3.5 px-4\"> {{ column.title }}\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"py-3 px-4\">\n @if (!Array.isArray(element[column.name]) && !_.isPlainObject(element[column.name])) {\n @if (element[column.name] && String(element[column.name]).length <= 100) {\n <div [innerHTML]=\"element[column.name]\"></div>\n }\n @if (element[column.name] && String(element[column.name]).length > 100) {\n <div>{{ element[column.name].substring(0, 100) + '...' }}</div>\n <a (click)=\"viewFullItemData(element[column.name], column.name)\"\n class=\"flex items-center text-sm text-cta\">\n view more\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ml-1 h-4 w-4\" fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"/>\n </svg>\n </a>\n }\n @if (!element[column.name]) {\n @if (element[column.name] === null) {\n <span class=\"font-mono text-gray-400\">null</span>\n }\n @if (element[column.name] !== null) {\n <span>{{ element[column.name] }}</span>\n }\n }\n }\n @if (Array.isArray(element[column.name])) {\n Contains {{ element[column.name].length }} items\n }\n @if (_.isPlainObject(element[column.name])) {\n Object has {{ Object.keys(element[column.name]).length }} keys\n }\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"h-auto\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n }\n</div>\n\n\n<div class=\"border-b border-t bg-gray-50 px-4 py-1 flex align-center justify-end\">\n\n <div class=\"flex items-center\">\n <div class=\"text-sm text-gray-500 mr-10\">\n @if (dataset) {\n Showing {{ offset + 1 }} - {{ (page * limit) - (limit - tableData.length) }}\n }\n </div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n</div>\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>{{columnName}}</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div [innerHTML]=\"fullData\"></div>\n\n </div>\n\n</div>\n\n\n","import {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n@Component({\n selector: 'ki-html-documentation',\n templateUrl: './html-documentation.component.html',\n styleUrls: ['./html-documentation.component.sass'],\n standalone: false\n})\nexport class HtmlDocumentationComponent implements OnInit, OnDestroy {\n\n @Input() columns: Subject<any>;\n\n public availableColumns: any = [];\n public showData = false;\n public Object = Object;\n public documentation = [\n {\n title: 'HTML Classes',\n description: 'Available classes for styling HTML elements.',\n data: [\n {\n description: 'Change colour of text',\n classes: {\n Class: 'text-{colour}-{value}',\n '{colour}': 'red, blue, green, gray',\n '{value}': '100, 200, 300, ..., 900'\n }\n },\n {\n description: 'Change background colour',\n classes: {\n Class: 'bg-{colour}-{value}',\n '{colour}': 'red, blue, green, gray',\n '{value}': '100, 200, 300, ..., 900'\n }\n },\n {\n description: 'Add padding to an element.',\n classes: {\n Class: 'p{t|r|b|l}-{size}, py-{size}, px-{size}',\n '{size}': '0, 1, 1.5, 2, 2.5, ..., p-10',\n Value: '1 = .25rem, 2 = .5rem, 4 = 1rem'\n }\n },\n {\n description: 'Add margin to an element.',\n classes: {\n Class: 'm{t|r|b|l}-{size}, my-{size}, mx-{size}',\n '{size}': '0, 1, 1.5, 2, 2.5, ..., p-10',\n Value: '1 = .25rem, 2 = .5rem, 4 = 1rem'\n }\n },\n {\n description: 'Change font size',\n classes: {\n Class: 'text-{size}',\n '{size}': 'xs, sm, base, lg, xl, 2xl, ..., 9xl',\n Value: 'xs = .75rem, sm = .875rem, base = 1rem'\n }\n },\n {\n description: 'Change font weight',\n classes: {\n Class: 'font-{weight}',\n '{weight}': 'thin, light, normal, medium, bold',\n Value: 'thin = 100, light = 300, medium = 500, bold = 700'\n }\n }\n ]\n },\n {\n title: 'Dynamic Templating',\n description: 'Attribute and template functionality for iterating and conditioning',\n data: [\n {\n description: 'Iterate over whole dataset and display each item name.',\n classes: {\n Template: 'd-each-item=\"dataSet\"',\n Example: '<div d-each-item=\"dataSet\">[[item.name]]</div>'\n }\n },\n {\n description: 'Show/Hide element based on value.',\n classes: {\n Template: 'd-if=\"item.value\"',\n Example: '<section d-if=\"item.value\"></section>'\n }\n },\n {\n description: 'Dynamically add a class to an element.',\n classes: {\n Template: 'd-class-completed=\"item.completed\"',\n Example: '<li d-class-completed=\"item.completed\">[[item.name]]</li>'\n }\n }\n ]\n }\n ];\n\n constructor() {\n }\n\n ngOnInit(): void {\n if (this.columns) {\n this.columns.subscribe(columns => {\n this.availableColumns = columns;\n });\n }\n }\n\n ngOnDestroy(): void {\n if (this.columns) {\n this.columns.unsubscribe();\n }\n }\n\n}\n","<div class=\"max-w-3xl mx-auto divide-y-2 divide-gray-200\">\n <h2 class=\"mt-4 text-center text-xl font-extrabold text-gray-900\">\n Documentation\n </h2>\n <dl class=\"mt-6 space-y-6 divide-y divide-gray-200\">\n @for (doc of documentation; track doc) {\n <div class=\"pt-6\">\n <dt class=\"text-lg\">\n <!-- Expand/collapse question button -->\n <button type=\"button\" (click)=\"doc.show = !doc.show\"\n class=\"text-left w-full flex justify-between items-start text-gray-400\"\n aria-controls=\"faq-0\" aria-expanded=\"false\">\n <span class=\"font-medium text-gray-900\"> {{doc.title}} </span>\n <span class=\"ml-6 h-7 flex items-center\">\n <svg [class]=\"{'rotate-0': !doc.show, '-rotate-180': doc.show}\"\n class=\"h-6 w-6 transform\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </span>\n </button>\n </dt>\n @if (doc.show) {\n <dd class=\"mt-2\">\n <p class=\"text-base text-gray-500\">{{doc.description}}</p>\n @for (data of doc.data; track data) {\n <div class=\"mt-3 mb-2 text-gray-900\">{{data.description}}</div>\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n @for (key of Object.keys(data.classes); track key) {\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\"\n >\n {{key}}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n <tr>\n @for (key of Object.keys(data.classes); track key; let i = $index) {\n <td class=\"p-2 text-sm \"\n [class]=\"{'text-gray-900 font-semibold': i === 0, 'text-gray-500': i !== 0}\"\n >\n {{data.classes[key]}}</td>\n }\n </tr>\n </tbody>\n </table>\n }\n </dd>\n }\n </div>\n }\n <!--AVAILABLE DATA FIELDS-->\n <div class=\"pt-6\">\n <dt class=\"text-lg\">\n <!-- Expand/collapse question button -->\n <button type=\"button\" (click)=\"showData = !showData\"\n class=\"text-left w-full flex justify-between items-start text-gray-400\"\n aria-controls=\"faq-0\" aria-expanded=\"false\">\n <span class=\"font-medium text-gray-900\"> Data Access </span>\n <span class=\"ml-6 h-7 flex items-center\">\n <svg [class]=\"{'rotate-0': !showData, '-rotate-180': showData}\"\n class=\"h-6 w-6 transform\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"/>\n </svg>\n </span>\n </button>\n </dt>\n @if (showData) {\n <dd class=\"mt-2\">\n <p class=\"text-base text-gray-500\">Access the underlying data via exposed variables.</p>\n <div class=\"mt-3 mb-2 text-gray-900\">Access top level parameters.</div>\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Variable\n </th>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Notes\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n <tr>\n <td class=\"p-2 text-sm text-gray-900 font-semibold\">\n {{\"{{parameterName\\}\\}\"}}\n </td>\n <td class=\"p-2 text-sm text-gray-500\">\n Access the value of parameters defined in the dataset.\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"mt-3 mb-2 text-gray-900\">Access the whole dataset.</div>\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Variable\n </th>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Notes\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n <tr>\n <td class=\"p-2 text-sm text-gray-900 font-semibold\">\n [[dataSet]]\n </td>\n <td class=\"p-2 text-sm text-gray-500\">\n The whole dataset can be access via the \"dataSet\" variable\n </td>\n </tr>\n </tbody>\n </table>\n @if (availableColumns && availableColumns.length) {\n <div class=\"mt-3 mb-2 text-gray-900\">Access first row field values</div>\n <table class=\"min-w-full divide-y divide-gray-300\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Variable\n </th>\n <th scope=\"col\" class=\"p-2 text-left text-sm font-semibold text-gray-900\">\n Notes\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n @for (column of availableColumns; track column) {\n <tr>\n <td class=\"p-2 text-sm text-gray-900 font-semibold\">\n [[{{column.name}}]]\n </td>\n <td class=\"p-2 text-sm text-gray-500\">\n {{column.title}}\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </dd>\n }\n </div>\n </dl>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport moment from 'moment';\nimport {DashboardService} from '../../../../services/dashboard.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-table-cell-formatter',\n templateUrl: './table-cell-formatter.component.html',\n styleUrls: ['./table-cell-formatter.component.sass'],\n standalone: false\n})\nexport class TableCellFormatterComponent implements OnInit {\n\n @Input() type: string;\n @Input() data: any = {};\n @Input() currencies: any = [];\n @Input() openSide: any;\n @Input() dataset: any;\n @Input() dashboards: any = [];\n @Input() sharedDashboards: any = [];\n @Input() privateDashboards: any = [];\n @Input() dashboardParameters: any = [];\n @Input() actionEvents: any = [];\n\n public dateFormats: any = [\n {\n title: 'None',\n value: null\n },\n {\n title: moment().format('dddd, D MMMM YYYY'),\n value: 'dddd, D MMMM YYYY'\n },\n {\n title: moment().format('ddd, D MMM YYYY'),\n value: 'ddd, D MMM YYYY'\n },\n {\n title: moment().format('D MMMM YYYY'),\n value: 'D MMMM YYYY'\n },\n {\n title: moment().format('D MMM YYYY'),\n value: 'D MMM YYYY'\n },\n {\n title: moment().format('D MMMM'),\n value: 'D MMMM'\n },\n {\n title: moment().format('MMM D'),\n value: 'MMM D'\n },\n {\n title: moment().format('MMMM YYYY'),\n value: 'MMMM YYYY'\n },\n {\n title: moment().format('MMMM'),\n value: 'MMMM'\n },\n {\n title: moment().format('YYYY'),\n value: 'YYYY'\n },\n {\n title: moment().format('D/M/YYYY'),\n value: 'D/M/YYYY'\n },\n {\n title: moment().format('DD/MM/YYYY'),\n value: 'DD/MM/YYYY'\n },\n {\n title: moment().format('YYYY-MM-DD'),\n value: 'YYYY-MM-DD'\n }\n ];\n public timeFormats: any = [\n {\n title: 'None',\n value: null\n },\n {\n title: moment().format('h a'),\n value: 'ha'\n },\n {\n title: moment().format('h:mm a'),\n value: 'h:mm a'\n },\n {\n title: moment().format('h:mm:ss a'),\n value: 'h:mm:ss a'\n },\n {\n title: moment().format('HH:mm'),\n value: 'HH:mm'\n },\n {\n title: moment().format('HH:mm:ss'),\n value: 'HH:mm:ss'\n }\n ];\n\n constructor(private dashboardService: DashboardService) {\n }\n\n ngOnInit(): void {\n if (this.data.linkType === 'dashboard' && this.data.dashboardLink) {\n this.dashboardParamUpdate(this.data.dashboardLink);\n }\n }\n\n public selectOption(c1: any, c2: any) {\n if (!c2) {\n return true;\n }\n return c1.value === c2.value;\n }\n\n public ctaSelectOption(c1: any, c2: any) {\n return c1 === c2;\n }\n\n public setDecimalValue(value) {\n if (value === 'undefined') {\n delete this.data.decimal;\n }\n }\n\n public async dashboardParamUpdate(selection) {\n if (!this.data.dashboardLinkParams || Array.isArray(this.data.dashboardLinkParams)) {\n this.data.dashboardLinkParams = {};\n }\n const dashboard: any = await this.dashboardService.getDashboard(selection.value);\n if (dashboard.layoutSettings.parameters) {\n this.dashboardParameters = _.values(dashboard.layoutSettings.parameters);\n\n setTimeout(() => {\n const el = document.getElementsByClassName('dashboard-param-pick').item(0);\n if (el) {\n el.scrollIntoView();\n }\n }, 0);\n }\n }\n\n}\n","@if (type === 'number') {\n <label class=\"mb-2\">\n Decimals\n <select matNativeControl [(ngModel)]=\"data.decimal\"\n (ngModelChange)=\"setDecimalValue($event)\">\n @for (decimal of [0,1,2,3,4,5,6,7,8,9]; track decimal) {\n <option\n [value]=\"decimal\">\n {{decimal}}\n </option>\n }\n </select>\n </label>\n}\n\n@if (type === 'currency') {\n <label class=\"mb-2\">\n Decimals\n <select matNativeControl [(ngModel)]=\"data.decimal\"\n (ngModelChange)=\"setDecimalValue($event)\">\n @for (decimal of [0,1,2,3,4,5,6,7,8,9]; track decimal) {\n <option\n [value]=\"decimal\">\n {{decimal}}\n </option>\n }\n </select>\n </label>\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"data.thousandsSeparator\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Thousands Separator</p>\n </div>\n <label class=\"mb-4\">\n Currency\n <select matNativeControl [compareWith]=\"selectOption\" [(ngModel)]=\"data.currency\">\n <option value=\"\">-- Select Currency --</option>\n @for (currency of currencies; track currency) {\n <option [ngValue]=\"currency\">\n {{currency.name}}\n </option>\n }\n </select>\n </label>\n}\n\n@if (type === 'percentage') {\n <label class=\"mb-2\">\n Decimals\n <select matNativeControl [(ngModel)]=\"data.decimal\"\n (ngModelChange)=\"setDecimalValue($event)\">\n @for (decimal of [0,1,2,3,4,5,6,7,8,9]; track decimal) {\n <option\n [value]=\"decimal\">\n {{decimal}}\n </option>\n }\n </select>\n </label>\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"data.thousandsSeparator\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Thousands Separator</p>\n </div>\n}\n\n@if (type === 'datetime') {\n <label class=\"mb-2\">\n Date Format\n <select matNativeControl [(ngModel)]=\"data.dateFormat\">\n @for (format of dateFormats; track format) {\n <option\n [value]=\"format.value\">\n {{format.title}}\n </option>\n }\n </select>\n </label>\n <label class=\"mb-2\">\n Time Format\n <select matNativeControl [(ngModel)]=\"data.timeFormat\">\n @for (format of timeFormats; track format) {\n <option\n [value]=\"format.value\">\n {{format.title}}\n </option>\n }\n </select>\n </label>\n}\n\n@if (type === 'comparison') {\n <label class=\"mb-2\">\n Select Column to compare\n <select matNativeControl [(ngModel)]=\"data.comparisonColumn\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"data.comparisonPercentage\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Display Change as Percentage</p>\n </div>\n <label class=\"mb-2\">\n Decimals\n <select matNativeControl [(ngModel)]=\"data.comparisonDecimals\"\n (ngModelChange)=\"setDecimalValue($event)\">\n @for (decimal of [0,1,2,3,4,5,6,7,8,9]; track decimal) {\n <option\n [value]=\"decimal\">\n {{decimal}}\n </option>\n }\n </select>\n </label>\n}\n\n@if (type === 'link') {\n <label class=\"mb-2\">\n Link Settings\n <select matNativeControl [(ngModel)]=\"data.linkType\">\n <option value=\"\">External Link</option>\n <option value=\"custom\">Custom Link</option>\n <option value=\"dashboard\">Existing Dashboard</option>\n </select>\n <small class=\"font-normal\">Select the destination for the action link</small>\n </label>\n @if (data.linkType === 'custom') {\n <p>Please enter the link for this call to action.</p>\n <label class=\"mb-2\">\n Link\n <input type=\"text\" [(ngModel)]=\"data.customLink\">\n </label>\n }\n @if (data.linkType === 'dashboard') {\n <label class=\"mb-2\">\n Select Dashboard\n <select matNativeControl [(ngModel)]=\"data.dashboardLink\"\n [compareWith]=\"selectOption\" (ngModelChange)=\"dashboardParamUpdate($event)\">\n <optgroup label=\"Dashboards\">\n @for (dashboard of dashboards; track dashboard) {\n <option\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n }\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n @for (dashboard of sharedDashboards; track dashboard) {\n <option\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n }\n </optgroup>\n @if (privateDashboards.length) {\n <optgroup label=\"Private Dashboards\">\n @for (dashboard of privateDashboards; track dashboard) {\n <option\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n }\n </optgroup>\n }\n </select>\n <small class=\"font-normal\">Select the destination for the action link</small>\n </label>\n }\n @if (data.dashboardLinkParams && dashboardParameters.length) {\n <p>Please enter the following parameters to use with this dashboard</p>\n @for (param of dashboardParameters; track param) {\n <label>{{param.title}}</label>\n @if (!data.dashboardLinkParams['custom-'+param.name]) {\n <label\n class=\"mb-2 dashboard-param-pick\">\n <select matNativeControl [(ngModel)]=\"data.dashboardLinkParams[param.name]\"\n [compareWith]=\"ctaSelectOption\">\n <option>-- Select Value --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"'[['+column.name+']]'\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n }\n <div class=\"mb-2 flex items-center\">\n <mat-checkbox class=\"mr-2\"\n [(ngModel)]=\"data.dashboardLinkParams['custom-'+param.name]\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Use custom value</p>\n </div>\n <label class=\"mb-2 dashboard-param-pick\">\n @if (data.dashboardLinkParams['custom-'+param.name]) {\n <input type=\"text\"\n placeholder=\"Enter custom parameter value\"\n [(ngModel)]=\"data.dashboardLinkParams[param.name]\">\n }\n </label>\n }\n }\n}\n\n@if (type === 'custom') {\n <div class=\"flex items-center mb-2 justify-between\">\n <div class=\"font-semibold\">Enter the HTML/Text for this item</div>\n <a (click)=\"openSide.next(true)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n <textarea class=\"font-mono w-full\"\n cols=\"30\" rows=\"10\" [(ngModel)]=\"data.customText\"></textarea>\n}\n\n@if (type === 'action') {\n <label class=\"mb-2\">\n Action Event\n <select matNativeControl [(ngModel)]=\"data.actionEvent\">\n @for (actionEvent of actionEvents; track actionEvent) {\n <option [value]=\"actionEvent.name\">\n {{actionEvent.title}}\n </option>\n }\n </select>\n <small class=\"font-normal\">Select the action event to be triggered when this item is clicked.</small>\n </label>\n}\n","import {Component, Inject, OnInit, ViewChild} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {\n SourceSelectorDialogComponent\n} from '../../dashboard-editor/source-selector-dialog/source-selector-dialog.component';\nimport {DashboardService} from '../../../services/dashboard.service';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport chroma from 'chroma-js';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {EditDashboardAlertComponent} from '../configure-item/edit-dashboard-alert/edit-dashboard-alert.component';\nimport {\n DatasetFilterComponent\n} from '../../dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component';\nimport {Router} from '@angular/router';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport {BehaviorSubject, Subject} from 'rxjs';\nimport {ActionEvent} from '../../../objects/action-event';\nimport {BaseChartDirective} from 'ng2-charts';\nimport regression from 'regression';\nimport {ProjectService} from '../../../services/project.service';\nimport {scales} from 'chart.js';\nimport visNetworkOptions from './vis-network-options.json';\nimport {CreateDatasetComponent} from '../../dataset/create-dataset/create-dataset.component';\nimport {\n ChangeSourceWarningComponent\n} from '../../data-explorer/change-source-warning/change-source-warning.component';\nimport {DatasetEditorComponent} from '../../dataset/dataset-editor/dataset-editor.component';\n\n@Component({\n selector: 'ki-configure-item',\n templateUrl: './configure-item.component.html',\n styleUrls: ['./configure-item.component.sass'],\n host: { class: 'configure-dialog' },\n standalone: false\n})\nexport class ConfigureItemComponent implements OnInit {\n\n @ViewChild(BaseChartDirective) chart: BaseChartDirective;\n @ViewChild('datasetEditorComponent') datasetEditorComponent: DatasetEditorComponent;\n\n public grid;\n public chartData: any;\n public metric: any = {};\n public textData: any = {};\n public networkData: any = {};\n public wordCloud: any = {};\n public imageData: any = {};\n public tabular: any = {};\n public tableCells: any = {};\n public general: any = {};\n public dependencies: any = {};\n public callToAction: any = {};\n public actionItem: any = {};\n public dashboard;\n public dashboardItemType;\n public dashboardDatasetInstance: any;\n public dashboards: any = [];\n public sharedDashboards: any = [];\n public privateDashboards: any = [];\n public dashboardParameters: any = [];\n public dashboardParamValues: any = [];\n public actionEvents: ActionEvent[] = [];\n public admin: boolean;\n public filterFields: any = [];\n public chartTypes = ['line', 'bar', 'pie', 'doughnut', 'scatter'];\n public metricFormats = ['Currency', 'Number', 'Percentage'];\n public currencies = [\n {\n name: 'British Pound (£)',\n value: 'GBP',\n symbol: '£'\n },\n {\n name: 'US Dollar ($)',\n value: 'USD',\n symbol: '$'\n },\n {\n name: 'Euro (€)',\n value: 'EUR',\n symbol: '€'\n }\n ];\n public filterJunction = {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: '',\n filterType: ''\n }],\n filterJunctions: []\n };\n public columnFormats: any = [\n {\n title: 'Number',\n type: 'number'\n },\n {\n title: 'Currency',\n type: 'currency'\n },\n {\n title: 'Percentage',\n type: 'percentage'\n },\n {\n title: 'Date & Time',\n type: 'datetime'\n },\n {\n title: 'Comparison',\n type: 'comparison'\n },\n {\n title: 'Link',\n type: 'link'\n },\n {\n title: 'Custom',\n type: 'custom'\n },\n {\n title: 'Hide Column',\n type: 'hide'\n }\n ];\n public showAlertWarning = false;\n public dapFeeds: any = [];\n public sideOpen = false;\n public openSide = new BehaviorSubject(false);\n public dataset: any;\n public edgeDataset: any;\n public fullEdgeDataset: any;\n public _ = _;\n public docColumns = new Subject();\n public canSetAlerts = false;\n public colourPalettes: any = [];\n public visNetworkOptions = visNetworkOptions;\n public availableNodeOptions: string[] = [];\n public availableEdgeOptions: string[] = [];\n public datasetNodes: any = [];\n public datasetEdges: any = [];\n public nodeGroups: any;\n public widgetParameters: any = {};\n\n protected readonly Array = Array;\n protected readonly Object = Object;\n\n constructor(public dialogRef: MatDialogRef<ConfigureItemComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dialog: MatDialog,\n private dashboardService: DashboardService,\n private datasetService: DatasetService,\n private datasourceService: DatasourceService,\n private router: Router,\n private projectService: ProjectService) {\n }\n\n async ngOnInit(): Promise<any> {\n this.availableNodeOptions = Object.keys(this.visNetworkOptions.nodes);\n this.availableEdgeOptions = Object.keys(this.visNetworkOptions.edges);\n\n this.grid = this.data.grid;\n this.dashboard = this.data.dashboard;\n this.dashboardDatasetInstance = this.data.dashboardDatasetInstance;\n this.dashboardItemType = this.data.dashboardItemType;\n this.admin = !!this.data.admin;\n this.actionEvents = this.data.actionEvents || [];\n this.canSetAlerts = this.projectService.doesActiveProjectHavePrivilege('alertmanage');\n\n if (this.actionEvents.length) {\n this.columnFormats.push({\n title: 'Action',\n type: 'action'\n });\n }\n\n if (!this.dashboardItemType.colourMode) {\n this.dashboardItemType.colourMode = 'lrgb';\n }\n if (!this.dashboardItemType.borderColor || !Array.isArray(this.dashboardItemType.borderColor)) {\n this.dashboardItemType.borderColor = [_.isString(this.dashboardItemType.borderColor) ? this.dashboardItemType.borderColor : ''];\n }\n\n if (!this.dashboardDatasetInstance) {\n this.selectedDatasource();\n } else {\n this.loadDashboardItems();\n }\n\n this.dashboardService.getDashboards(\n '',\n '100',\n '0'\n ).toPromise().then(dashboards => {\n this.dashboards = dashboards;\n });\n\n this.dashboardService.getDashboards(\n '',\n '100',\n '0',\n null\n ).toPromise().then(dashboards => {\n this.sharedDashboards = dashboards;\n });\n\n this.dashboardService.getDashboards(\n '',\n '100',\n '0',\n 0\n ).toPromise().then(dashboards => {\n this.privateDashboards = dashboards;\n });\n\n this.dapFeeds = await this.datasetService.getDatasets(\n '',\n '1000',\n '0',\n '',\n ''\n ).toPromise();\n\n this.openSide.subscribe((open: boolean) => {\n if (open) {\n document.getElementById('sidebarWrapper2')?.classList.add('z-20');\n document.getElementById('sidebarWrapper2')?.classList.remove('-z-10');\n this.docColumns.next(this.filterFields);\n } else {\n setTimeout(() => {\n document.getElementById('sidebarWrapper2')?.classList.add('-z-10');\n document.getElementById('sidebarWrapper2')?.classList.remove('z-20');\n }, 700);\n }\n this.sideOpen = open;\n });\n\n const project: any = await this.projectService.getProject(this.projectService.activeProject.getValue().projectKey);\n if (project.settings.palettes && project.settings.palettes.length) {\n this.colourPalettes = project.settings.palettes;\n }\n }\n\n public updateChart(newValue, index) {\n this.dashboardItemType.backgroundColor[index] = newValue;\n setTimeout(() => {\n this.chart.chart.update();\n }, 50);\n }\n\n public changeSource() {\n const dialogRef = this.dialog.open(CreateDatasetComponent, {\n width: '1200px',\n height: '800px',\n data: {\n admin: this.admin\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n const dialogRef2 = this.dialog.open(ChangeSourceWarningComponent, {\n width: '700px',\n height: '275px'\n });\n dialogRef2.afterClosed().subscribe(proceed => {\n if (proceed) {\n this.dashboardDatasetInstance.datasetInstanceId = res.datasetInstanceId;\n this.dashboardDatasetInstance.datasourceInstanceKey = res.datasourceInstanceKey;\n this.dashboardDatasetInstance.source = {\n title: res.title,\n datasetInstanceId: res.datasetInstanceId,\n datasourceInstanceKey: res.datasourceInstanceKey,\n type: null\n };\n const transformation = this.dashboardDatasetInstance.transformationInstances[0];\n if (transformation) {\n this.datasetEditorComponent.excludeUpstreamTransformations(transformation, true);\n } else {\n this.datasetEditorComponent.evaluateDataset(true);\n }\n }\n });\n }\n });\n }\n\n public selectedDatasource() {\n const dialogRef = this.dialog.open(SourceSelectorDialogComponent, {\n width: '1200px',\n height: '800px',\n data: {\n dashboard: this.dashboard,\n dashboardItemInstanceKey: this.data.itemInstanceKey,\n dashboardDatasetInstance: this.dashboardDatasetInstance || {\n dashboardId: this.dashboard.id,\n instanceKey: this.data.itemInstanceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n },\n admin: this.admin\n }\n });\n\n dialogRef.afterClosed().subscribe(dashboardDatasetInstance => {\n this.dashboardDatasetInstance = dashboardDatasetInstance;\n this.loadDashboardItems();\n });\n }\n\n public pickNetworkEdgeDataset() {\n const dialogRef = this.dialog.open(SourceSelectorDialogComponent, {\n width: '1200px',\n height: '800px',\n data: {\n dashboard: this.dashboard,\n dashboardItemInstanceKey: this.data.itemInstanceKey,\n dashboardDatasetInstance: this.dashboardDatasetInstance || {\n dashboardId: this.dashboard.id,\n instanceKey: this.data.itemInstanceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n },\n admin: this.admin\n }\n });\n\n dialogRef.afterClosed().subscribe(async dashboardDatasetInstance => {\n this.networkData.edgeDatasetId = dashboardDatasetInstance.datasetInstanceId;\n this.networkData.edgeDatasourceKey = dashboardDatasetInstance.datasourceInstanceKey;\n\n await this.loadEdgeDataset();\n\n this.networkData.edgeDatasetTitle = dashboardDatasetInstance.title || this.edgeDataset.instanceTitle;\n });\n }\n\n public async loadEdgeDataset() {\n const datasetInstanceSummary = {\n datasetInstanceId: this.networkData.edgeDatasetId,\n datasourceInstanceKey: this.networkData.edgeDatasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: {}\n };\n\n this.edgeDataset = await this.datasetService.evaluateDataset(\n datasetInstanceSummary,\n '0',\n '1'\n );\n }\n\n public clearEdgeDataset() {\n delete this.networkData.edgeDatasetTitle;\n delete this.networkData.edgeDatasetId;\n delete this.networkData.edgeDatasourceKey;\n\n this.edgeDataset = null;\n }\n\n public addGroupOption(nodeGroup: string) {\n if (!this.networkData.nodeGroupOptions) {\n this.networkData.nodeGroupOptions = {};\n }\n\n if (!this.networkData.nodeGroupOptions[nodeGroup]) {\n this.networkData.nodeGroupOptions[nodeGroup] = {options: []};\n }\n\n this.networkData.nodeGroupOptions[nodeGroup].options.unshift({});\n }\n\n public addOption(typeOptions: string) {\n if (!this.networkData[typeOptions] || !Array.isArray(this.networkData[typeOptions])) {\n this.networkData[typeOptions] = [];\n }\n\n this.networkData[typeOptions].unshift({});\n }\n\n public updateOptions(nodeOption: any, datasetType: string) {\n const option = nodeOption.key;\n const column = nodeOption.column;\n let value = nodeOption.value;\n let allData = this.dataset.allData;\n\n if (datasetType === 'datasetEdges') {\n allData = this.fullEdgeDataset ? this.fullEdgeDataset.allData : this.dataset.allData;\n }\n\n this[datasetType].forEach(item => {\n if (column) {\n const dataset = _.find(allData, {id: item.id});\n if (dataset) {\n value = dataset[column];\n }\n }\n\n const existing = _.find(item.options, {key: option});\n if (existing) {\n existing.value = value;\n } else {\n item.options.unshift({key: option, value});\n }\n });\n }\n\n public dataLoaded(dataset) {\n this.dataset = dataset;\n this.filterFields = _.map(dataset.columns, column => {\n return {\n title: column.title,\n name: column.name\n };\n });\n this.updateMetricDataValues();\n this.setChartData();\n this.setNetworkChartData();\n }\n\n public async ctaUpdate(cta) {\n this.dashboardParameters = [];\n if (cta) {\n if (cta.type && cta.type === 'dashboard') {\n if (!cta.parameters) {\n cta.parameters = {};\n }\n\n const dashboard: any = await this.dashboardService.getDashboard(cta.value);\n if (dashboard.layoutSettings.parameters) {\n this.dashboardParameters = _.values(dashboard.layoutSettings.parameters);\n\n setTimeout(() => {\n const el = document.getElementsByClassName('dashboard-param-pick').item(0);\n if (el) {\n el.scrollIntoView();\n }\n }, 0);\n }\n } else {\n cta.parameters = {};\n }\n }\n }\n\n public setImageData(column) {\n this.imageData.source = column ? this.dataset.allData[0][column] : null;\n }\n\n public setColumn(column) {\n if (!this.tableCells[column] || Array.isArray(this.tableCells[column])) {\n this.tableCells[column] = {};\n }\n }\n\n public setColumnFormat(format) {\n if (format === 'undefined') {\n delete this.tableCells[this.tableCells.column].type;\n } else {\n if (!this.tableCells[this.tableCells.column].data || Array.isArray(this.tableCells[this.tableCells.column].data)) {\n this.tableCells[this.tableCells.column].data = {};\n }\n }\n }\n\n public editAlert(alert, index?) {\n const dialogRef = this.dialog.open(EditDashboardAlertComponent, {\n width: '900px',\n height: '750px',\n data: {\n alert,\n filterFields: this.filterFields\n }\n });\n\n dialogRef.afterClosed().subscribe(alertItem => {\n if (alertItem) {\n if (!this.dashboardDatasetInstance.alerts) {\n this.dashboardDatasetInstance.alerts = [];\n }\n if (index >= 0) {\n this.dashboardDatasetInstance.alerts[index] = alertItem;\n } else {\n this.dashboardDatasetInstance.alerts.push(alertItem);\n this.showAlertWarning = !this.dashboard.alertsEnabled;\n }\n }\n });\n }\n\n public deleteAlert(index) {\n const message = 'Are you sure you would like to delete this alert?';\n if (window.confirm(message)) {\n this.dashboardDatasetInstance.alerts.splice(index, 1);\n }\n }\n\n public getAlertDetails(alert) {\n let details = '';\n const filter = alert.filterTransformation.filters[0];\n\n if (filter) {\n const filterType = DatasetFilterComponent.getFilterType(filter.filterType);\n details += `<span class=\"font-medium\">Where</span> ${filter.lhsExpression} `;\n details += filterType ? filterType.label : '';\n details += ` ${filter.rhsExpression}`;\n }\n\n const matchRule = alert.matchRuleConfiguration;\n if (matchRule && alert.matchRuleType === 'rowcount') {\n if (matchRule.matchType === 'equals') {\n details += ` <span class=\"font-medium\">And</span> exactly ${matchRule.value} row${matchRule.value > 1 ? 's' : ''} returned`;\n } else if (matchRule.matchType === 'greater') {\n details += ` <span class=\"font-medium\">And</span> more than ${matchRule.value} row${matchRule.value > 1 ? 's' : ''} returned`;\n } else if (matchRule.matchType === 'less') {\n details += ` <span class=\"font-medium\">And</span> less than ${matchRule.value} row${matchRule.value > 1 ? 's' : ''} returned`;\n }\n }\n\n return details;\n }\n\n public setCallToActionItem(d1: any, d2: any) {\n if (!d2) {\n return true;\n }\n if (d2.type === 'custom') {\n return d1.type === 'custom';\n } else if (d2.type === 'dashboard' || d2.type === 'feed') {\n return d1.value === d2.value;\n }\n }\n\n public ctaSelectOption(c1: any, c2: any) {\n return c1 === c2;\n }\n\n public paletteSelectOption(c1: any, c2: any) {\n if (!c2) {\n return true;\n }\n return c1.name === c2.name;\n }\n\n public depSelection(c1: any, c2: any) {\n if (!c2) {\n return true;\n }\n return c1.type === c2.type;\n }\n\n public backgroundColourUpdate() {\n const colours = this.dashboardItemType.colourPalette ? this.dashboardItemType.colourPalette.colours : [\n this.dashboardItemType.backgroundColorFrom || 'black',\n this.dashboardItemType.backgroundColorTo || 'black'\n ];\n\n if (this.dashboardItemType.colourMode !== 'repeat') {\n const chromaScale = chroma.scale(colours);\n chromaScale.mode(this.dashboardItemType.colourMode);\n this.dashboardItemType.backgroundColor = chromaScale.colors(this.dashboardItemType.labels.length);\n } else {\n this.repeatColours(colours);\n }\n\n setTimeout(() => {\n this.setChartData();\n }, 50);\n }\n\n public async updateInstanceFilterFields(change, instanceKey) {\n if (change.type === 'MATCH') {\n const selectedDatasetInstance = _.find(this.dashboard.datasetInstances, {instanceKey});\n if (selectedDatasetInstance) {\n const mappedParams = {};\n _.forEach(selectedDatasetInstance.parameterValues, (value, key) => {\n if (_.isString(value) && value.includes('{{')) {\n const globalKey = value.replace('{{', '').replace('}}', '');\n if (this.dashboard.layoutSettings.parameters && this.dashboard.layoutSettings.parameters[globalKey]) {\n mappedParams[key] = this.dashboard.layoutSettings.parameters[globalKey].value;\n }\n } else {\n mappedParams[key] = value;\n }\n });\n\n const datasetInstanceSummary = {\n datasetInstanceId: selectedDatasetInstance.datasetInstanceId,\n datasourceInstanceKey: selectedDatasetInstance.datasourceInstanceKey,\n transformationInstances: selectedDatasetInstance.transformationInstances,\n parameterValues: mappedParams,\n parameters: selectedDatasetInstance.parameters\n };\n\n this.dataset = await this.datasetService.evaluateDataset(datasetInstanceSummary, '0', '10');\n\n this.dependencies[instanceKey].filterFields = _.map(this.dataset.columns, column => {\n return {\n title: column.title,\n name: column.name\n };\n });\n }\n\n }\n }\n\n public async saveDashboard() {\n const grid = this.grid.save(true);\n if (!this.dashboard.layoutSettings) {\n this.dashboard.layoutSettings = {};\n }\n this.dashboard.layoutSettings.grid = grid;\n\n if (!this.dashboard.layoutSettings.charts) {\n this.dashboard.layoutSettings.charts = {};\n }\n\n this.dashboard.layoutSettings.charts[this.dashboardDatasetInstance.instanceKey] = this.dashboardItemType;\n\n this.mapComponentDataToDashboardInstance();\n\n if (!this.networkData.nodeLevelOptions || Array.isArray(this.networkData.nodeLevelOptions)) {\n this.networkData.nodeLevelOptions = {};\n }\n\n this.datasetNodes.forEach(node => {\n if (node.options && node.options.length) {\n this.networkData.nodeLevelOptions[node.id] = node.options;\n }\n });\n\n if (!this.networkData.edgeLevelOptions || !Array.isArray(this.networkData.edgeLevelOptions)) {\n this.networkData.edgeLevelOptions = [];\n }\n\n this.datasetEdges.forEach(edge => {\n if (edge.options && edge.options.length) {\n this.networkData.edgeLevelOptions.push(edge);\n }\n });\n\n // If there is an old instance remove it, and then add the new/updated one.\n _.remove(this.dashboard.datasetInstances, {instanceKey: this.dashboardDatasetInstance.instanceKey});\n _.remove(this.dashboardDatasetInstance.transformationInstances, {type: 'paging'});\n this.dashboard.datasetInstances.push(this.dashboardDatasetInstance);\n\n this.dialogRef.close(this.dashboardDatasetInstance);\n }\n\n public resetDefaultColours() {\n this.dashboardItemType.backgroundColorFrom = null;\n this.dashboardItemType.backgroundColorTo = null;\n this.setChartData();\n }\n\n public updateColourPalette() {\n if (this.dashboardItemType.colourPalette) {\n this.dashboardItemType.colourMode = 'repeat';\n this.repeatColours(this.dashboardItemType.colourPalette.colours);\n this.setChartData();\n } else {\n this.backgroundColourUpdate();\n }\n }\n\n public async setChartData() {\n if (this.dashboardItemType.xAxis && this.dashboardItemType.yAxis) {\n let data: any;\n\n if (!this.dashboardItemType.seriesColumn) {\n if (this.dashboardItemType.type !== 'pie' && this.dashboardItemType.type !== 'doughnut') {\n data = _.map(this.dataset.allData, item => {\n return {x: item[this.dashboardItemType.xAxis], y: item[this.dashboardItemType.yAxis]};\n });\n } else {\n data = _.map(this.dataset.allData, item => {\n return item[this.dashboardItemType.yAxis];\n });\n }\n\n this.chartData = [\n {\n data,\n label: _.find(this.filterFields, {name: this.dashboardItemType.xAxis}).title,\n fill: !!this.dashboardItemType.fill,\n borderColor: (this.dashboardItemType.type === 'pie' || this.dashboardItemType.type === 'doughnut') ? chroma('white').alpha(0.2).hex() : this.dashboardItemType.borderColor,\n backgroundColor: (this.dashboardItemType.type === 'line' || this.dashboardItemType.type === 'scatter') ?\n (Array.isArray(this.dashboardItemType.borderColor) ? _.map(this.dashboardItemType.borderColor, colour => {\n return chroma(colour || 'black').alpha(0.5).hex();\n }) : chroma(this.dashboardItemType.borderColor || 'black').alpha(0.5).hex()) : this.dashboardItemType.backgroundColor,\n tension: 0.2,\n pointBackgroundColor: this.dashboardItemType.borderColor ? this.dashboardItemType.borderColor[0] : null,\n pointBorderColor: this.dashboardItemType.borderColor ? this.dashboardItemType.borderColor[0] : null\n }\n ];\n this.dashboardItemType.labels = _.map(this.dataset.allData, item => {\n return item[this.dashboardItemType.xAxis];\n });\n } else {\n const chartData = [];\n const series = _.uniq(_.map(this.dataset.allData, this.dashboardItemType.seriesColumn));\n series.forEach((value, index) => {\n const seriesResults = _.filter(this.dataset.allData, allData => {\n return allData[this.dashboardItemType.seriesColumn] === value;\n });\n\n chartData.push({\n data: _.map(seriesResults, item => {\n return {x: item[this.dashboardItemType.xAxis], y: item[this.dashboardItemType.yAxis]};\n }),\n label: value,\n fill: !!this.dashboardItemType.fill,\n borderColor: this.dashboardItemType.borderColor,\n backgroundColor: (this.dashboardItemType.type === 'line' || this.dashboardItemType.type === 'scatter') ?\n (Array.isArray(this.dashboardItemType.borderColor) ? _.map(this.dashboardItemType.borderColor, colour => {\n return chroma(colour || 'black').alpha(0.5).hex();\n }) : chroma(this.dashboardItemType.borderColor || 'black').alpha(0.5).hex()) : this.dashboardItemType.backgroundColor[index],\n tension: 0.2,\n pointBackgroundColor: this.dashboardItemType.borderColor[index],\n pointBorderColor: this.dashboardItemType.borderColor[index]\n });\n });\n this.chartData = chartData;\n this.dashboardItemType.labels = _.uniq(_.map(this.dataset.allData, item => {\n return item[this.dashboardItemType.xAxis];\n }));\n }\n\n if (this.dashboardItemType.trendLine &&\n this.dashboardItemType.type !== 'pie' &&\n this.dashboardItemType.type !== 'doughnut') {\n\n let trendLine = [];\n let trendLabel = 'Trend';\n if (this.dashboardItemType.trendLine === 'average') {\n trendLabel = 'Average';\n const trendData = [];\n this.chartData.forEach(dataItem => {\n trendData.push(_.map(dataItem.data, 'y'));\n });\n const average = _.flatMap(trendData).reduce((p, c) => p + c, 0) / _.flatMap(trendData).length;\n trendLine = _.fill(_.range(0, _.flatMap(trendData).length), average, 0, _.flatMap(trendData).length);\n } else if (this.dashboardItemType.trendLine === 'logarithmic' ||\n this.dashboardItemType.trendLine === 'linear' ||\n this.dashboardItemType.trendLine === 'power' ||\n this.dashboardItemType.trendLine === 'exponential') {\n\n const trendLineData = _.map(this.dataset.allData, (item, index) => {\n return {x: index + 1, y: item[this.dashboardItemType.yAxis]};\n }).filter(({x, y}) => {\n return (\n typeof x === typeof y &&\n !isNaN(x) &&\n !isNaN(y) &&\n Math.abs(x) !== Infinity &&\n Math.abs(y) !== Infinity\n );\n }).map(({x, y}) => {\n return [x, y];\n });\n\n const trendLineResults = regression[this.dashboardItemType.trendLine](trendLineData);\n trendLine = trendLineResults.points.map(([x, y]) => {\n return y;\n });\n } else {\n trendLine = _.map(this.dataset.allData, item => {\n return item[this.dashboardItemType.trendLine];\n });\n trendLabel = _.find(this.filterFields, {name: this.dashboardItemType.trendLine}).title;\n }\n\n this.chartData.push({\n type: 'line',\n data: trendLine,\n label: trendLabel,\n borderColor: this.dashboardItemType.trendLineColour,\n fill: false,\n order: -1,\n tension: 0.15,\n pointBackgroundColor: this.dashboardItemType.trendLineColour,\n pointBorderColor: this.dashboardItemType.trendLineColour\n });\n }\n }\n }\n\n public updateMetricDataValues() {\n if (this.metric.main) {\n this.metric.mainValue = _.isNaN(Number(this.dataset.allData[0][this.metric.main])) ? this.dataset.allData[0][this.metric.main] : Number(this.dataset.allData[0][this.metric.main]);\n this.metric.title = _.startCase(this.metric.main);\n }\n\n if (this.metric.subMetric) {\n this.metric.subValue = Number(this.dataset.allData[0][this.metric.subMetric]);\n this.metric.subTitle = _.startCase(this.metric.subMetric);\n }\n\n if (this.metric.showSubChange) {\n this.metric.difference = Math.abs(this.metric.mainValue - this.metric.subValue);\n }\n }\n\n private mapLayoutSettingsToComponentData() {\n _.forEach(this.dashboard.layoutSettings, (data, key) => {\n if (key !== 'grid') {\n const defaultValue = _.isPlainObject(this[key]) ? {} : [];\n this[key] = Object.keys(data).length ?\n (data[this.dashboardDatasetInstance.instanceKey] && Object.keys(data[this.dashboardDatasetInstance.instanceKey]).length ?\n data[this.dashboardDatasetInstance.instanceKey] : defaultValue) : defaultValue;\n }\n });\n }\n\n private mapComponentDataToDashboardInstance() {\n const layoutSettings = ['metric', 'dependencies', 'tabular', 'tableCells', 'general', 'imageData', 'textData', 'callToAction', 'wordCloud', 'actionItem', 'networkData'];\n layoutSettings.forEach(setting => {\n if (!this.dashboard.layoutSettings[setting]) {\n this.dashboard.layoutSettings[setting] = {};\n }\n const defaultData = _.isPlainObject(this[setting]) ? {} : [];\n this.dashboard.layoutSettings[setting][this.dashboardDatasetInstance.instanceKey] = this[setting] || defaultData;\n });\n }\n\n private repeatColours(colours: string[]) {\n this.dashboardItemType.backgroundColor = [];\n this.dashboardItemType.borderColor = [];\n while (this.dashboardItemType.backgroundColor.length < this.dataset.allData.length) {\n for (const colour of colours) {\n this.dashboardItemType.backgroundColor.push(colour);\n if (this.dashboardItemType.backgroundColor.length === this.dataset.allData.length) {\n break;\n }\n }\n }\n const dataLength = (this.dashboardItemType.type === 'line' || this.dashboardItemType.type === 'scatter') ? this.chartData.length : this.dataset.allData;\n while (this.dashboardItemType.borderColor.length < dataLength) {\n for (const colour of colours) {\n this.dashboardItemType.borderColor.push(colour);\n if (this.dashboardItemType.borderColor.length === dataLength) {\n break;\n }\n }\n }\n }\n\n private loadDashboardItems() {\n if (this.dashboard.layoutSettings) {\n this.mapLayoutSettingsToComponentData();\n\n if (!this.general.parameterBar) {\n this.general.parameterBar = {};\n }\n\n if (this.dashboard.layoutSettings.parameters) {\n this.dashboardParamValues = _(this.dashboard.layoutSettings.parameters)\n .filter('value')\n .map('value')\n .valueOf();\n }\n\n this.widgetParameters = _.cloneDeep(this.dashboard.layoutSettings.parameters);\n if (this.general.widgetParameters && Object.keys(this.general.widgetParameters).length) {\n _.forEach(this.general.widgetParameters, widgetParam => {\n if (widgetParam.value) {\n this.widgetParameters[widgetParam.name].value = widgetParam.value;\n }\n });\n }\n\n const matchDependencies = _.filter(this.dependencies, (dep, key) => {\n if (dep.type === 'MATCH') {\n dep.key = key;\n return true;\n }\n return false;\n });\n matchDependencies.forEach(dep => {\n this.updateInstanceFilterFields(dep, dep.key);\n });\n\n if (this.tabular.cta) {\n this.ctaUpdate(this.tabular.cta);\n }\n }\n }\n\n public async setNetworkChartData(reload = false) {\n if (!reload && this.networkData.edgeDatasetTitle) {\n await this.loadEdgeDataset();\n }\n\n const nodeData = this.dataset.allData;\n\n this.datasetNodes = [];\n this.datasetEdges = [];\n\n nodeData.forEach(item => {\n let nodeOptions: any = [];\n if (this.networkData.nodeLevelOptions && Object.keys(this.networkData.nodeLevelOptions).length &&\n this.networkData.nodeLevelOptions[item[this.networkData.nodeIds]]) {\n nodeOptions = this.networkData.nodeLevelOptions[item[this.networkData.nodeIds]];\n }\n\n this.datasetNodes.push({\n id: item[this.networkData.nodeIds],\n label: item[this.networkData.nodeLabels],\n group: item[this.networkData.nodeGroups],\n options: nodeOptions\n });\n if (!this.networkData.edgeDatasetTitle) {\n this.datasetEdges.push({\n from: item[this.networkData.fromIds],\n to: item[this.networkData.toIds],\n options: []\n });\n }\n });\n\n if (this.networkData.edgeDatasetTitle) {\n const datasetInstanceSummary = {\n datasetInstanceId: this.networkData.edgeDatasetId,\n datasourceInstanceKey: this.networkData.edgeDatasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: {}\n };\n\n this.fullEdgeDataset = await this.datasetService.evaluateDataset(\n datasetInstanceSummary,\n '0',\n '10000000'\n );\n\n this.fullEdgeDataset.allData.forEach(item => {\n this.datasetEdges.push({\n from: item[this.networkData.fromIds],\n to: item[this.networkData.toIds],\n options: []\n });\n });\n }\n\n this.nodeGroups = _(this.datasetNodes)\n .filter('group')\n .map('group')\n .uniq()\n .valueOf();\n\n this.datasetEdges.forEach(edge => {\n const edgeOptions = _.find(this.networkData.edgeLevelOptions, {from: edge.from, to: edge.to});\n if (edgeOptions) {\n edge.options = edgeOptions.options;\n }\n });\n }\n}\n","<div class=\"pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 -z-10\" id=\"sidebarWrapper2\">\n <div [class]=\"{'translate-x-0': sideOpen, 'translate-x-full': !sideOpen}\"\n (click)=\"$event.stopPropagation()\"\n class=\"pointer-events-auto w-screen max-w-md transform transition ease-in-out duration-500 sm:duration-700\"\n id=\"docSidebar\">\n <div class=\"flex h-full flex-col overflow-y-scroll bg-white py-6 shadow-xl\">\n <div class=\"px-4 sm:px-6\">\n <div class=\"flex items-start justify-between\">\n <div></div>\n <div class=\"ml-3 flex h-7 items-center\">\n <button type=\"button\" (click)=\"openSide.next(false)\"\n class=\"rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none\">\n <span class=\"sr-only\">Close panel</span>\n <!-- Heroicon name: outline/x -->\n <svg class=\"h-6 w-6\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n <div class=\"relative flex-1 px-4 sm:px-6\">\n <ki-html-documentation [columns]=\"docColumns\"></ki-html-documentation>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"configure-header\">\n Configure {{dashboardItemType.label}}\n <button mat-button (click)=\"saveDashboard()\">\n <div class=\"flex items-center\">\n <mat-icon class=\"mr-1\">chevron_left</mat-icon>\n Back to Dashboard\n </div>\n </button>\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a mat-dialog-close [routerLink]=\"['/']\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a mat-dialog-close [routerLink]=\"['/dashboards']\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n Dashboards</a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a (click)=\"saveDashboard()\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n Dashboard Editor</a>\n </div>\n </li>\n\n @if (dashboardDatasetInstance) {\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{dashboardItemType.label}} Editor\n </a>\n @if (dashboardDatasetInstance && dashboardDatasetInstance.source) {\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n @if (dashboardDatasetInstance.source.datasourceInstanceKey) {\n @if (['custom', 'snapshot'].indexOf(dashboardDatasetInstance.source.type) === -1) {\n <img\n src=\"/assets/favicon-rev.png\" class=\"w-2.5 mx-1.5\">\n }\n @if (dashboardDatasetInstance.source.type === 'custom') {\n <span\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n }\n @if (dashboardDatasetInstance.source.type === 'snapshot') {\n <span\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n }\n }\n @if (!dashboardDatasetInstance.source.datasourceInstanceKey) {\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n }\n &nbsp;{{dashboardDatasetInstance.source.title}}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n }\n </div>\n </li>\n }\n </ol>\n </nav>\n <div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"['bottom']\" [rFlex]=\"true\">\n <div class=\"cell-contents p-0\">\n @if (!dashboardDatasetInstance) {\n <div class=\"flex items-center justify-center h-full w-full\">\n <div class=\"flex items-center flex-col\">\n <button mat-stroked-button color=\"primary\" class=\"config-button\"\n (click)=\"selectedDatasource()\">\n Configure {{dashboardItemType.label}}\n </button>\n <p class=\"font-light w-3/4 text-center mt-4\">\n Please configure this {{dashboardItemType.label}} using a data feed or stored query.\n </p>\n </div>\n </div>\n }\n\n @if (dashboardDatasetInstance) {\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"dashboardDatasetInstance\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\" [dashboardLayoutSettings]=\"general\"\n [dashboardParameters]=\"widgetParameters\"></ki-dataset-editor>\n }\n </div>\n </rsz-layout>\n\n <rsz-layout class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\">\n <mat-tab-group class=\"gray-header h-full\">\n <mat-tab label=\"Header\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Header Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Enter HTML/Text for the Title and Description fields\n </p>\n </div>\n </div>\n <div class=\"flex flex-col-reverse justify-stretch\">\n <a (click)=\"openSide.next(true)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary text-cta\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n </div>\n <div class=\"flex justify-between\">\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Title\n <input type=\"text\" [(ngModel)]=\"general.name\">\n <small class=\"font-normal\">Title of the item</small>\n </label>\n <label class=\"mb-2\">\n Description\n <textarea class=\"font-mono w-full\"\n cols=\"30\" rows=\"5\" [(ngModel)]=\"general.description\"></textarea>\n <small class=\"font-normal\">Description of the data item.</small>\n </label>\n\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <div class=\"flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"general.transparent\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Transparent background</p>\n </div>\n <small class=\"mb-4 block font-normal\">Make this dashboard items background transparent -\n requires page refresh to take affect</small>\n\n @if (dashboard.layoutSettings && dashboard.layoutSettings.parameters && Object.keys(dashboard.layoutSettings.parameters).length) {\n <div class=\"flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"general.showParameterBar\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Show Parameter Bar</p>\n </div>\n <small class=\"mb-4 block font-normal\">\n Enable which parameters to show in this widget. Values entered here will only reload\n this widget.\n </small>\n @if (general.showParameterBar) {\n <div class=\"border-l-2 pl-4\">\n @for (parameterKey of Object.keys(dashboard.layoutSettings.parameters); track parameterKey) {\n <div\n class=\"flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"general.parameterBar[parameterKey]\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">{{dashboard.layoutSettings.parameters[parameterKey].title}}</p>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </div>\n\n\n </mat-tab>\n <mat-tab label=\"Footer\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Footer Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Enter HTML/Text for the footer field\n </p>\n </div>\n </div>\n <div class=\"flex flex-col-reverse justify-stretch\">\n <a (click)=\"openSide.next(true)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary text-cta\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Footer\n <input type=\"text\" [(ngModel)]=\"general.footer\">\n <small class=\"font-normal\">Text to display at the bottom of the item</small>\n </label>\n\n <label class=\"mb-2\">\n Call to action\n <select matNativeControl [(ngModel)]=\"callToAction\" [compareWith]=\"setCallToActionItem\"\n (ngModelChange)=\"ctaUpdate($event)\">\n <option value=\"\">None</option>\n <option [ngValue]=\"{type: 'custom'}\">Custom Link</option>\n <optgroup label=\"Dashboards\">\n @for (dashboard of dashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title}\">{{dashboard.title}}</option>\n }\n </optgroup>\n @if (admin) {\n <optgroup label=\"DAP Data Feeds\">\n @for (dapFeed of dapFeeds; track dapFeed) {\n <option\n [ngValue]=\"{type: 'feed', value: dapFeed.id, label: dapFeed.title}\">{{dapFeed.title}}</option>\n }\n </optgroup>\n }\n </select>\n <small class=\"font-normal\">Select the destination for the action link</small>\n </label>\n @if (callToAction.type === 'custom') {\n <p>Please enter the link for this call to action.</p>\n <label class=\"mb-2\">\n Link\n <input type=\"text\" [(ngModel)]=\"callToAction.link\">\n </label>\n }\n\n <label class=\"mb-2\">\n Set action label\n <input type=\"text\" [(ngModel)]=\"callToAction.label\">\n </label>\n\n @if (callToAction && callToAction.parameters && dashboardParameters.length) {\n <p>Please enter the following parameters to use with this dashboard</p>\n @for (param of dashboardParameters; track param) {\n <label>{{param.title}}</label>\n @if (!callToAction.parameters['custom-'+param.name]) {\n <label\n class=\"mb-2 dashboard-param-pick\">\n <select matNativeControl [(ngModel)]=\"callToAction.parameters[param.name]\"\n [compareWith]=\"ctaSelectOption\">\n <option [value]=\"undefined\">-- Select Value --</option>\n @for (paramValue of dashboardParamValues; track paramValue) {\n <option\n [value]=\"paramValue\">\n {{paramValue}}\n </option>\n }\n </select>\n </label>\n }\n <div class=\"mb-2 flex items-center\">\n <mat-checkbox class=\"mr-1\"\n [(ngModel)]=\"callToAction.parameters['custom-'+param.name]\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Use custom value</p>\n </div>\n <label class=\"mb-2 dashboard-param-pick\">\n @if (callToAction.parameters['custom-'+param.name]) {\n <input type=\"text\"\n placeholder=\"Enter custom parameter value\"\n [(ngModel)]=\"callToAction.parameters[param.name]\">\n }\n </label>\n }\n }\n </div>\n\n </div>\n </mat-tab>\n <mat-tab label=\"Dependencies\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Dependency Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n If the loading of this widget is dependant on the results of another,\n you can set the dependency here.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex justify-between\">\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Select the dashboard item(s) this depends on\n <mat-select [(ngModel)]=\"dependencies.instanceKeys\" multiple>\n @for (instance of dashboard.datasetInstances; track instance) {\n <mat-option\n [value]=\"instance.instanceKey\">\n {{dashboard.layoutSettings.general ? (dashboard.layoutSettings.general[instance.instanceKey] ? dashboard.layoutSettings.general[instance.instanceKey].name || instance.instanceKey : instance.instanceKey) : instance.instanceKey }}\n </mat-option>\n }\n </mat-select>\n </label>\n\n @for (instanceKey of dependencies.instanceKeys; track instanceKey) {\n <label class=\"mb-2\">\n Dependency result type for\n {{dashboard.layoutSettings.general ? (dashboard.layoutSettings.general[instanceKey] ? dashboard.layoutSettings.general[instanceKey].name || instanceKey : instanceKey) : instanceKey }}\n <mat-select [(ngModel)]=\"dependencies[instanceKey]\" [compareWith]=\"depSelection\"\n (ngModelChange)=\"updateInstanceFilterFields($event, instanceKey)\">\n <mat-option [value]=\"{type: null}\">-- Select Type --</mat-option>\n <mat-option [value]=\"{type: 'LOADED'}\">Loaded</mat-option>\n <mat-option\n [value]=\"{type: 'MATCH', filterJunction: _.clone(filterJunction), key: instanceKey}\">\n Matches Criteria\n </mat-option>\n </mat-select>\n </label>\n @if (dependencies[instanceKey] && dependencies[instanceKey].type === 'MATCH') {\n @if (!dependencies[instanceKey].filterFields) {\n <div class=\"w-full flex items-center\"\n >\n Loading filter component...\n </div>\n }\n @if (dependencies[instanceKey].filterFields) {\n <ki-dataset-filters class=\"ml-0\"\n [filterJunction]=\"dependencies[instanceKey].filterJunction\"\n [filterFields]=\"dependencies[instanceKey].filterFields\"></ki-dataset-filters>\n }\n }\n }\n\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n No data notice message\n <input type=\"text\" [(ngModel)]=\"dependencies.notice\">\n <small class=\"font-normal\">Enter the message to display when no data is returned from\n dependency.</small>\n </label>\n </div>\n </div>\n </div>\n\n </mat-tab>\n <mat-tab label=\"Action\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Action Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Configure available actions that can be performed on this item.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <div class=\"font-medium mb-2\">\n Navigate to another dashboard or URL by clicking on this widget item.\n </div>\n\n <label class=\"mb-2\">\n Destination\n <select matNativeControl [(ngModel)]=\"actionItem\" [compareWith]=\"setCallToActionItem\"\n (ngModelChange)=\"ctaUpdate($event)\">\n <option value=\"\">None</option>\n <option [ngValue]=\"{type: 'custom'}\">Custom Link</option>\n <optgroup label=\"Dashboards\">\n @for (dashboard of dashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title}\">{{dashboard.title}}</option>\n }\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n @for (dashboard of sharedDashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title}\">{{dashboard.title}}</option>\n }\n </optgroup>\n @if (privateDashboards.length) {\n <optgroup label=\"Private Dashboards\">\n @for (dashboard of privateDashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title}\">{{dashboard.title}}</option>\n }\n </optgroup>\n }\n </select>\n <small class=\"font-normal\">Select the destination for the action link</small>\n </label>\n @if (actionItem.type === 'custom') {\n <p>Please enter the link for this call to action.</p>\n <label class=\"mb-2\">\n Link\n <input type=\"text\" [(ngModel)]=\"actionItem.link\">\n </label>\n }\n\n @if (actionItem && actionItem.parameters && dashboardParameters.length) {\n <p>Please enter the following parameters to use with this dashboard</p>\n @for (param of dashboardParameters; track param) {\n <label>{{param.title}}</label>\n @if (!actionItem.parameters['custom-'+param.name]) {\n <label\n class=\"mb-2 dashboard-param-pick\">\n <select matNativeControl [(ngModel)]=\"actionItem.parameters[param.name]\"\n [compareWith]=\"ctaSelectOption\">\n <option [value]=\"undefined\">-- Select Value --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"'[['+column.name+']]'\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n }\n <div class=\"mb-2 flex items-center\">\n <mat-checkbox class=\"mr-1\"\n [(ngModel)]=\"actionItem.parameters['custom-'+param.name]\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Use custom value</p>\n </div>\n <label class=\"mb-2 dashboard-param-pick\">\n @if (actionItem.parameters['custom-'+param.name]) {\n <input type=\"text\"\n placeholder=\"Enter custom parameter value\"\n [(ngModel)]=\"actionItem.parameters[param.name]\">\n }\n </label>\n }\n }\n </div>\n </div>\n </mat-tab>\n @if (dashboardItemType.type === 'text') {\n <mat-tab label=\"Text\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Text Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Enter HTML/Text for this item.\n </p>\n </div>\n </div>\n <div class=\"flex flex-col-reverse justify-stretch\">\n <a (click)=\"openSide.next(true)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary text-cta\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n </div>\n <ngx-codemirror\n [(ngModel)]=\"textData.value\"\n [options]=\"{lineNumbers: true,theme: 'ttcn',mode: 'htmlmixed',autoRefresh: true,smartIndent: true,extraKeys: {'Ctrl-Space': 'autocomplete'}}\">\n </ngx-codemirror>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'image') {\n <mat-tab label=\"Image\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Image Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set the image to be displayed in this widget.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Select the column that corresponds to the desired image\n <select matNativeControl [(ngModel)]=\"imageData.column\"\n (ngModelChange)=\"setImageData($event)\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'table') {\n <mat-tab label=\"Table\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Table Row Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Adjust the settings to be applied to each table row.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"tabular.expandRows\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Expand rows. By default rows are compressed and restrict wrapping.</p>\n </div>\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"tabular.hidePager\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Hide the pager at the bottom of the table.</p>\n </div>\n <div class=\"mb-4 flex items-center\">\n <mat-checkbox class=\"mr-2\" [(ngModel)]=\"tabular.actionRows\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Make table rows clickable</p>\n </div>\n @if (tabular.actionRows) {\n <label class=\"mb-2\">\n Call to action\n <select matNativeControl [(ngModel)]=\"tabular.cta\"\n [compareWith]=\"setCallToActionItem\"\n (ngModelChange)=\"ctaUpdate($event)\">\n <option value=\"\">None</option>\n <option [ngValue]=\"{type: 'custom', windowLocation: 'EXISTING'}\">Custom Link\n </option>\n <optgroup label=\"Dashboards\">\n @for (dashboard of dashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title, windowLocation: 'EXISTING'}\">{{dashboard.title}}</option>\n }\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n @for (dashboard of sharedDashboards; track dashboard) {\n <option\n [ngValue]=\"{type: 'dashboard', value: dashboard.id, label: dashboard.title, windowLocation: 'EXISTING'}\">{{dashboard.title}}</option>\n }\n </optgroup>\n </select>\n <small class=\"font-normal\">Select the destination for the action link</small>\n </label>\n @if (tabular.cta && tabular.cta.type === 'custom') {\n <p>Please enter the link for this call to action.</p>\n <label class=\"mb-2\">\n Link\n <input type=\"text\" [(ngModel)]=\"tabular.cta.link\">\n </label>\n }\n @if (tabular.cta && dashboardParameters.length) {\n <p>Please enter the following parameters to use with this dashboard</p>\n @for (param of dashboardParameters; track param) {\n <label>{{param.title}}</label>\n @if (!tabular.cta.parameters['custom-'+param.name]) {\n <label\n class=\"mb-2 dashboard-param-pick\">\n <select matNativeControl [(ngModel)]=\"tabular.cta.parameters[param.name]\"\n [compareWith]=\"ctaSelectOption\">\n <option>-- Select Value --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"'[['+column.name+']]'\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n }\n <div class=\"mb-2 flex items-center\">\n <mat-checkbox class=\"mr-2\"\n [(ngModel)]=\"tabular.cta.parameters['custom-'+param.name]\"></mat-checkbox>\n <p class=\"mb-0 mt-1\">Use custom value</p>\n </div>\n <label class=\"mb-2 dashboard-param-pick\">\n @if (tabular.cta.parameters['custom-'+param.name]) {\n <input type=\"text\"\n placeholder=\"Enter custom parameter value\"\n [(ngModel)]=\"tabular.cta.parameters[param.name]\">\n }\n </label>\n }\n }\n @if (tabular.cta) {\n <mat-radio-group [(ngModel)]=\"tabular.cta.windowLocation\">\n <mat-radio-button class=\"mr-4\" value=\"EXISTING\">Existing Window</mat-radio-button>\n <mat-radio-button value=\"_blank\">New Window/Tab</mat-radio-button>\n </mat-radio-group>\n }\n }\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'table') {\n <mat-tab label=\"Columns\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Table Column Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Apply specific cell formatting to each table column.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Select the column to format\n <select matNativeControl [(ngModel)]=\"tableCells.column\"\n (ngModelChange)=\"setColumn($event)\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n @if (tableCells[tableCells.column]) {\n <label class=\"mb-4\">\n Specify Max Column Width\n <div class=\"mt-1 relative rounded-md shadow-sm w-1/4\">\n <input type=\"number\" [(ngModel)]=\"tableCells[tableCells.column].maxWidth\"\n class=\"block w-full pl-7 pr-12 sm:text-sm border-gray-300 rounded-md\"\n placeholder=\"Enter width\">\n <div class=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n <span class=\"text-gray-500 sm:text-sm\"> px </span>\n </div>\n </div>\n </label>\n <label class=\"mb-2\">\n Column Format\n <select matNativeControl [(ngModel)]=\"tableCells[tableCells.column].type\"\n (ngModelChange)=\"setColumnFormat($event)\">\n <option [value]=\"undefined\">Automatic</option>\n @for (format of columnFormats; track format) {\n <option\n [value]=\"format.type\">\n {{format.title}}\n </option>\n }\n </select>\n </label>\n @if (tableCells[tableCells.column].type) {\n <ki-table-cell-formatter\n [type]=\"tableCells[tableCells.column].type\"\n [data]=\"tableCells[tableCells.column].data\"\n [openSide]=\"openSide\" [dataset]=\"dataset\"\n [currencies]=\"currencies\" [dashboards]=\"dashboards\"\n [sharedDashboards]=\"sharedDashboards\"\n [privateDashboards]=\"privateDashboards\"\n [actionEvents]=\"actionEvents\">\n </ki-table-cell-formatter>\n }\n }\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'metric') {\n <mat-tab label=\"Metric\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Metric Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Select which pieces of information to display.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"p-4 flex justify-between\">\n <div class=\"flex-grow p-4\">\n <label class=\"mb-4\">\n Main Metric\n <select [(ngModel)]=\"metric.main\" (ngModelChange)=\"updateMetricDataValues()\">\n <option value=\"\">-- Select Main Metric --</option>\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </select>\n </label>\n <hr>\n <label class=\"mb-4\">\n Sub Metric\n <select [(ngModel)]=\"metric.subMetric\" (ngModelChange)=\"updateMetricDataValues()\">\n <option value=\"\">-- Select Sub Metric --</option>\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </select>\n </label>\n <mat-slide-toggle [(ngModel)]=\"metric.showSubChange\" class=\"mb-4\"\n (ngModelChange)=\"updateMetricDataValues()\">\n Show Metric Change\n </mat-slide-toggle>\n </div>\n <div class=\"w-6/12 p-4\">\n <p><b>Preview</b></p>\n <div class=\"shadow p-4 flex items-center metric-preview\">\n <div class=\"w-full\">\n <dt class=\"text-base font-normal text-gray-900\">{{metric.title}}</dt>\n <dd class=\"mt-1 flex items-baseline justify-between md:block lg:flex\">\n <div class=\"flex items-baseline text-2xl font-semibold text-indigo-600\">\n {{metric.mainValue}}\n @if (metric.subMetric) {\n <span class=\"ml-2 text-sm font-medium text-gray-500\">from {{metric.subValue}}\n <span class=\"text-xs\">({{metric.subTitle}})</span></span>\n }\n </div>\n @if (metric.showSubChange) {\n <div\n class=\"inline-flex items-baseline px-2.5 py-0.5 rounded-full text-sm font-medium md:mt-2 lg:mt-0\"\n [class]=\"{'bg-green-100 text-green-800': metric.mainValue >= metric.subValue, 'bg-red-100 text-red-800': metric.mainValue < metric.subValue}\">\n <!-- Heroicon name: mini/arrow-up -->\n @if (metric.mainValue >= metric.subValue) {\n <svg\n class=\"-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center text-green-500\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M10 17a.75.75 0 01-.75-.75V5.612L5.29 9.77a.75.75 0 01-1.08-1.04l5.25-5.5a.75.75 0 011.08 0l5.25 5.5a.75.75 0 11-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0110 17z\"\n clip-rule=\"evenodd\"/>\n </svg>\n }\n @if (metric.mainValue < metric.subValue ) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n class=\"-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center text-red-500\">\n <path fill-rule=\"evenodd\"\n d=\"M10 3a.75.75 0 01.75.75v10.638l3.96-4.158a.75.75 0 111.08 1.04l-5.25 5.5a.75.75 0 01-1.08 0l-5.25-5.5a.75.75 0 111.08-1.04l3.96 4.158V3.75A.75.75 0 0110 3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n }\n {{metric.difference}}\n </div>\n }\n </dd>\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n }\n @if (chartTypes.indexOf(dashboardItemType.type) > -1) {\n <mat-tab label=\"Chart\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Chart Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Configure the chart data and display options.\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <a (click)=\"openSide.next(true)\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view help docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path\n d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n </div>\n <div class=\"p-4 flex justify-between\">\n <div class=\"flex-grow p-4\">\n <label class=\"mb-4\">\n Chart Type\n <select [(ngModel)]=\"dashboardItemType.type\">\n <option value=\"line\">Line</option>\n <option value=\"bar\">Bar</option>\n <option value=\"pie\">Pie</option>\n <option value=\"doughnut\">Doughnut</option>\n <option value=\"scatter\">Scatter</option>\n </select>\n </label>\n <label class=\"mb-4\">\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n X Axis Column\n }\n @if (dashboardItemType.type === 'pie' || dashboardItemType.type === 'doughnut') {\n Labels Column\n }\n <select [(ngModel)]=\"dashboardItemType.xAxis\" (ngModelChange)=\"setChartData()\">\n <option value=\"\">-- Select\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n X\n Axis Column\n }\n @if (dashboardItemType.type === 'pie' || dashboardItemType.type === 'doughnut') {\n Labels Column\n }\n --\n </option>\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </select>\n </label>\n <label class=\"mb-4\">\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n Y Axis Column\n }\n @if (dashboardItemType.type === 'pie' || dashboardItemType.type === 'doughnut') {\n Values Column\n }\n <select [(ngModel)]=\"dashboardItemType.yAxis\" (ngModelChange)=\"setChartData()\">\n <option value=\"\">-- Select\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n Y\n Axis Column\n }\n @if (dashboardItemType.type === 'pie' || dashboardItemType.type === 'doughnut') {\n Values Column\n }\n --\n </option>\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </select>\n </label>\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n <label class=\"mb-4\">\n Series Column\n <select [(ngModel)]=\"dashboardItemType.seriesColumn\" (ngModelChange)=\"setChartData()\">\n <option value=\"\">-- Select Series Column--</option>\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </select>\n </label>\n <label class=\"mb-4\">\n Trend Line Options\n <select [(ngModel)]=\"dashboardItemType.trendLine\" (ngModelChange)=\"setChartData()\">\n <option value=\"\">-- Select Trend Line Option--</option>\n <option value=\"average\">Average Line</option>\n <option value=\"linear\">Linear Line</option>\n <option value=\"exponential\">Exponential Line</option>\n <option value=\"logarithmic\">Logarithmic Line</option>\n <option value=\"power\">Power Line</option>\n <optgroup label=\"Use Column Data\">\n @for (field of filterFields; track field) {\n <option [value]=\"field.name\">\n {{field.title}}\n </option>\n }\n </optgroup>\n </select>\n <div class=\"mt-1 text-xs font-normal text-gray-400\">\n Select one of the options, or an existing column of data to plot an additional\n line on the graph.\n </div>\n </label>\n @if (dashboardItemType.trendLine) {\n <label class=\"flex-1\">\n Trend Line Colour\n <input type=\"color\" [(ngModel)]=\"dashboardItemType.trendLineColour\"\n (ngModelChange)=\"setChartData()\">\n </label>\n }\n }\n <div class=\"mt-4 mb-4 align-center justify-between\">\n <label class=\"flex-1\">\n Limit Results\n <input type=\"number\" [(ngModel)]=\"dashboardItemType.limit\">\n </label>\n <label class=\"ml-4 mt-4 flex-1\">\n <mat-checkbox [(ngModel)]=\"dashboardItemType.combineRemaining\">\n Combine remaining results\n </mat-checkbox>\n </label>\n </div>\n @if (dashboardItemType.combineRemaining) {\n <label class=\"mb-4\">\n Remaining results label\n <input type=\"text\" [(ngModel)]=\"dashboardItemType.combineRemaingingLabel\">\n </label>\n }\n @if (dashboardItemType.type !== 'pie' && dashboardItemType.type !== 'doughnut') {\n <label class=\"mb-4\">\n Y Axes Max value\n <input class=\"w-1/2\" type=\"number\" [(ngModel)]=\"dashboardItemType.maxValue\">\n </label>\n <mat-slide-toggle [(ngModel)]=\"dashboardItemType.beginAtZero\" class=\"block mb-4\">\n Start Y Axes at Zero\n </mat-slide-toggle>\n }\n <mat-slide-toggle [(ngModel)]=\"dashboardItemType.legend\" class=\"block mb-4\">Show Legend\n </mat-slide-toggle>\n @if (dashboardItemType.type === 'line') {\n <mat-slide-toggle\n [(ngModel)]=\"dashboardItemType.fill\"\n (ngModelChange)=\"setChartData()\" class=\"block mb-4\">Fill Background\n </mat-slide-toggle>\n }\n <label class=\"mb-4\">\n Colour Palette\n <select matNativeControl [compareWith]=\"paletteSelectOption\"\n [(ngModel)]=\"dashboardItemType.colourPalette\" (ngModelChange)=\"updateColourPalette()\">\n <option value=\"\">-- Select Colour Palette--</option>\n @for (palette of colourPalettes; track palette) {\n <option [ngValue]=\"palette\">\n {{palette.name}}\n </option>\n }\n </select>\n @if (!colourPalettes.length) {\n <div class=\"border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0 flex\">\n <span class=\"font-normal\">No colour palettes available.</span>\n <a [routerLink]=\"['/project-settings']\" target=\"_blank\" class=\"flex items-center ml-2 font-medium text-yellow-700 underline hover:text-yellow-600\">Manage palettes in project settings.<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"h-4 w-4\">\n <path d=\"M6.22 8.72a.75.75 0 0 0 1.06 1.06l5.22-5.22v1.69a.75.75 0 0 0 1.5 0v-3.5a.75.75 0 0 0-.75-.75h-3.5a.75.75 0 0 0 0 1.5h1.69L6.22 8.72Z\" />\n <path d=\"M3.5 6.75c0-.69.56-1.25 1.25-1.25H7A.75.75 0 0 0 7 4H4.75A2.75 2.75 0 0 0 2 6.75v4.5A2.75 2.75 0 0 0 4.75 14h4.5A2.75 2.75 0 0 0 12 11.25V9a.75.75 0 0 0-1.5 0v2.25c0 .69-.56 1.25-1.25 1.25h-4.5c-.69 0-1.25-.56-1.25-1.25v-4.5Z\" />\n </svg>\n </a>\n </p>\n </div>\n </div>\n </div>\n }\n </label>\n <!-- <button mat-flat-button color=\"accent\" (click)=\"resetDefaultColours()\">-->\n <!-- <div class=\"flex items-center\">-->\n <!-- Reset to Default Colours-->\n <!-- </div>-->\n <!-- </button>-->\n @if (dashboardItemType.type === 'line' || dashboardItemType.type === 'scatter') {\n @for (dataItem of chartData; track dataItem; let i = $index) {\n <div class=\"mt-4 align-center justify-between\">\n <label class=\"flex-1\">\n {{_.startCase(dataItem.label)}} Colour\n <input type=\"color\" [(ngModel)]=\"dashboardItemType.borderColor[i]\"\n (ngModelChange)=\"setChartData()\">\n </label>\n </div>\n }\n }\n @if (dashboardItemType.type !== 'line') {\n @if (!dashboardItemType.colourPalette) {\n <div class=\"mt-4 mb-4 flex items-end justify-between\">\n <label class=\"flex-1\">\n Background Colour Range\n <input type=\"color\" [(ngModel)]=\"dashboardItemType.backgroundColorFrom\"\n (ngModelChange)=\"backgroundColourUpdate()\">\n </label>\n <label class=\"flex-1\">\n &nbsp;\n <input type=\"color\" [(ngModel)]=\"dashboardItemType.backgroundColorTo\"\n (ngModelChange)=\"backgroundColourUpdate()\">\n </label>\n </div>\n }\n <div class=\"mt-4 mb-4 align-center justify-between\">\n <label class=\"flex-1\">\n Colour Generator Mode\n <mat-radio-group [(ngModel)]=\"dashboardItemType.colourMode\"\n (ngModelChange)=\"backgroundColourUpdate()\">\n <mat-radio-button class=\"mr-4\" value=\"repeat\">Repeat</mat-radio-button>\n <mat-radio-button class=\"mr-4\" value=\"lrgb\">Gradient</mat-radio-button>\n <mat-radio-button class=\"mr-4\" value=\"hsl\">HSL</mat-radio-button>\n <mat-radio-button value=\"lch\">LCH</mat-radio-button>\n </mat-radio-group>\n </label>\n </div>\n @if (Array.isArray(dashboardItemType.backgroundColor)) {\n @if (dashboardItemType.backgroundColor && dashboardItemType.backgroundColor.length) {\n <label\n >\n Set Individual Colours\n </label>\n }\n @for (backColour of dashboardItemType.backgroundColor; track backColour; let i = $index) {\n <div>\n @if (dataset && dataset.allData[i]) {\n @if (dataset && dataset.allData) {\n <div class=\"tracking-wider uppercase text-gray-500 text-xs mt-2\"\n >\n {{dataset.allData[i][dashboardItemType.xAxis]}}\n </div>\n }\n <input type=\"color\" (change)=\"updateChart($event.target.value, i)\"\n [name]=\"'colour' + i\" [value]=\"dashboardItemType.backgroundColor[i]\">\n }\n </div>\n }\n }\n }\n </div>\n <div class=\"w-6/12 p-4\">\n @if (chartData) {\n <canvas #chart baseChart class=\"sticky top-10\"\n [datasets]=\"chartData\"\n [labels]=\"dashboardItemType.labels\"\n [options]=\"{scales: {y: {beginAtZero: dashboardItemType.beginAtZero, max: dashboardItemType.maxValue || null}}, responsive: true}\"\n [legend]=\"!!dashboardItemType.legend\"\n [type]=\"dashboardItemType.type\"\n [plugins]=\"[]\">\n </canvas>\n }\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'words') {\n <mat-tab label=\"Word Cloud\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Word Cloud Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Adjust the settings for the Word Cloud generator.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-1/2\">\n <div class=\"p-4\">\n <label class=\"mb-2\">\n Use an indexed document data source to populate word cloud, or provide a string from a\n single column.\n <mat-radio-group [(ngModel)]=\"wordCloud.populationMethod\">\n <mat-radio-button value=\"WHOLE\">Word Frequencies</mat-radio-button>\n <mat-radio-button class=\"ml-4\" value=\"SINGLE\">Single String</mat-radio-button>\n </mat-radio-group>\n </label>\n @if (wordCloud.populationMethod === 'SINGLE') {\n <label class=\"mb-2\">\n Select which row to use for the word cloud\n <select matNativeControl [(ngModel)]=\"wordCloud.row\">\n <option [value]=\"undefined\">-- Select Row --</option>\n @if (dataset) {\n @for (row of dataset.allData; track row; let i = $index) {\n <option\n [value]=\"i\">\n {{_.values(row)[0]}}\n </option>\n }\n }\n </select>\n </label>\n <label class=\"mb-2\">\n Select the column to use for the word cloud\n <select matNativeControl [(ngModel)]=\"wordCloud.column\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n }\n @if (wordCloud.populationMethod === 'WHOLE') {\n <label class=\"mb-2\">\n Select the column to use for the words\n <select matNativeControl [(ngModel)]=\"wordCloud.column\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n <label class=\"mb-2\">\n Select the column to use for the frequency\n <select matNativeControl [(ngModel)]=\"wordCloud.frequency\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n </label>\n }\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'network') {\n <mat-tab label=\"Network Graph\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Network Graph Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Adjust the settings for the Network Graph.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex\">\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"font-medium mb-3 text-base\">Node Data</div>\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n ID Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.nodeIds\"\n (ngModelChange)=\"setNetworkChartData(true)\">\n <option value=\"\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">IDs must be unique</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Label Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.nodeLabels\"\n (ngModelChange)=\"setNetworkChartData(true)\">\n <option value=\"\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Group Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.nodeGroups\"\n (ngModelChange)=\"setNetworkChartData(true)\">\n <option value=\"\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">Set which group nodes belong to.</div>\n </label>\n </div>\n <hr class=\"py-2\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Global Node Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">Options defined here will apply to all nodes.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"addOption('nodeOptions')\">\n <div class=\"flex items-center\">\n Add Node Option\n </div>\n </button>\n </div>\n @for (nodeOption of networkData.nodeOptions; track nodeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.nodeOptions[i].key\">\n <option value=\"\">-- Select Option --</option>\n @for (option of availableNodeOptions; track option) {\n <option\n [disabled]=\"_.find(networkData.nodeOptions, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Option Value\n @if (networkData.nodeOptions[i].key && visNetworkOptions.nodes[networkData.nodeOptions[i].key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.nodes[networkData.nodeOptions[i].key].type\" [(ngModel)]=\"nodeOption.value\">\n }\n @if (networkData.nodeOptions[i].key && visNetworkOptions.nodes[networkData.nodeOptions[i].key].type === 'boolean') {\n <select [(ngModel)]=\"nodeOption.value\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/nodes.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n node options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n <button mat-icon-button color=\"warn\" (click)=\"networkData.nodeOptions.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"flex items-start justify-between\">\n <div class=\"font-medium mb-3 text-base\">Edge Data</div>\n <button mat-stroked-button color=\"primary\" (click)=\"pickNetworkEdgeDataset()\">\n <div class=\"flex items-center\">\n Select Edge Dataset\n </div>\n </button>\n </div>\n @if (networkData.edgeDatasetTitle) {\n <div class=\"bg-blue-50 p-4 mb-2\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"mb-0 text-sm text-blue-700\">\n You are currently using {{networkData.edgeDatasetTitle}} dataset\n </p>\n <p class=\"mb-0 mt-3 text-sm md:ml-6 md:mt-0\">\n <a (click)=\"clearEdgeDataset()\"\n class=\"whitespace-nowrap font-medium text-blue-700 hover:text-blue-600 hover:underline\">\n Clear Dataset\n </a>\n </p>\n </div>\n </div>\n </div>\n <div class=\"flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n From Node ID Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.fromIds\">\n <option value=\"\">-- Select Column --</option>\n @if (edgeDataset) {\n @for (column of edgeDataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n To Node ID Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.toIds\">\n <option value=\"\">-- Select Column --</option>\n @if (edgeDataset) {\n @for (column of edgeDataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n </div>\n }\n @if (!networkData.edgeDatasetTitle) {\n <div class=\"flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n From ID\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.fromIds\">\n <option value=\"\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n To ID\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.toIds\">\n <option value=\"\">-- Select Column --</option>\n @if (dataset) {\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n </div>\n }\n <hr class=\"py-2\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Global Edge Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">Options defined here will apply to all edges.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"addOption('edgeOptions')\">\n <div class=\"flex items-center\">\n Add Edge Option\n </div>\n </button>\n </div>\n @for (edgeOption of networkData.edgeOptions; track edgeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"networkData.edgeOptions[i].key\">\n <option value=\"\">-- Select Option --</option>\n @for (option of availableEdgeOptions; track option) {\n <option\n [disabled]=\"_.find(networkData.edgeOptions, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Option Value\n @if (networkData.edgeOptions[i].key && visNetworkOptions.edges[networkData.edgeOptions[i].key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.edges[networkData.edgeOptions[i].key].type\" [(ngModel)]=\"edgeOption.value\">\n }\n @if (networkData.edgeOptions[i].key && visNetworkOptions.edges[networkData.edgeOptions[i].key].type === 'boolean') {\n <select [(ngModel)]=\"edgeOption.value\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/edges.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n edge options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n <button mat-icon-button color=\"warn\" (click)=\"networkData.edgeOptions.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'network' && networkData.nodeGroups) {\n <mat-tab label=\"Groups\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Group Options</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Define the options for each group.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"font-medium mb-3 text-base\">Group Data</div>\n @for (nodeGroup of nodeGroups; track nodeGroup) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 ml-1\">\n Group Name\n <input type=\"text\" [value]=\"nodeGroup || ''\" disabled>\n </label>\n </div>\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Group Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">Set the options for this node.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"addGroupOption(nodeGroup)\">\n <div class=\"flex items-center\">\n Add Group Option\n </div>\n </button>\n </div>\n @if (networkData.nodeGroupOptions && networkData.nodeGroupOptions[nodeGroup]) {\n @for (groupOption of networkData.nodeGroupOptions[nodeGroup]?.options; track groupOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"groupOption.key\">\n <option value=\"\">-- Select Option --</option>\n @for (option of availableNodeOptions; track option) {\n <option\n [disabled]=\"_.find(networkData.nodeGroupOptions, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Option Value\n @if (groupOption.key && visNetworkOptions.nodes[groupOption.key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.nodes[groupOption.key].type\" [(ngModel)]=\"groupOption.value\">\n }\n @if (groupOption.key && visNetworkOptions.nodes[groupOption.key].type === 'boolean') {\n <select [(ngModel)]=\"groupOption.value\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/nodes.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n node options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n <button mat-icon-button color=\"warn\" (click)=\"networkData.nodeGroupOptions[nodeGroup]?.options.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n }\n <hr class=\"py-2\">\n }\n </div>\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'network' && datasetNodes.length) {\n <mat-tab label=\"Nodes\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Node Options</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Define the options for each node.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex\">\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Node Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">These options will be applied to all nodes\n based on the column or custom value provided.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"addOption('globalNodeOptions')\">\n <div class=\"flex items-center\">\n Add Node Option\n </div>\n </button>\n </div>\n @for (nodeOption of networkData.globalNodeOptions; track nodeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"nodeOption.key\">\n <option value=\"\">-- Select Option --</option>\n @for (option of availableNodeOptions; track option) {\n <option\n [disabled]=\"_.find(networkData.globalNodeOptions, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <div class=\"flex items-center\">\n <label class=\"flex-1 mb-2 ml-1\">\n Data Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"nodeOption.column\"\n (ngModelChange)=\"updateOptions(nodeOption, 'datasetNodes')\">\n <option value=\"\">-- Select Column --</option>\n @for (column of dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Custom Value\n @if (nodeOption.key && visNetworkOptions.nodes[nodeOption.key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.nodes[nodeOption.key].type\" [(ngModel)]=\"nodeOption.value\" (change)=\"updateOptions(nodeOption, 'datasetNodes')\">\n }\n @if (nodeOption.key && visNetworkOptions.nodes[nodeOption.key].type === 'boolean') {\n <select [(ngModel)]=\"nodeOption.value\" (change)=\"updateOptions(nodeOption, 'datasetNodes')\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/nodes.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n node options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"networkData.globalNodeOptions.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"font-medium mb-3 text-base\">Node Data</div>\n @for (node of datasetNodes; track node) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Node ID\n <input type=\"text\" [value]=\"node.id\" disabled>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Node Label\n <input type=\"text\" [value]=\"node.label\" disabled>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Node Group\n <input type=\"text\" [value]=\"node.group || ''\" disabled>\n </label>\n </div>\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Node Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">Set the options for this node.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"node.options.unshift({})\">\n <div class=\"flex items-center\">\n Add Node Option\n </div>\n </button>\n </div>\n @for (nodeOption of node.options; track nodeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"nodeOption.key\">\n <option [value]=\"undefined\">-- Select Column --</option>\n @for (option of availableNodeOptions; track option) {\n <option\n [disabled]=\"_.find(node.options, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Option Value\n @if (nodeOption.key && visNetworkOptions.nodes[nodeOption.key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.nodes[nodeOption.key].type\" [(ngModel)]=\"nodeOption.value\">\n }\n @if (nodeOption.key && visNetworkOptions.nodes[nodeOption.key].type === 'boolean') {\n <select [(ngModel)]=\"nodeOption.value\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/nodes.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n node options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n <button mat-icon-button color=\"warn\" (click)=\"node.options.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n <hr class=\"py-2\">\n }\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n }\n @if (dashboardItemType.type === 'network' && datasetEdges.length) {\n <mat-tab label=\"Edges\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Edge Options</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Define the options for each node.\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex\">\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Edge Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">These options will be applied to all edges\n based on the column or custom value provided.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"addOption('globalEdgeOptions')\">\n <div class=\"flex items-center\">\n Add Edge Option\n </div>\n </button>\n </div>\n @for (edgeOption of networkData.globalEdgeOptions; track edgeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"edgeOption.key\">\n <option [value]=\"undefined\">-- Select Option --</option>\n @for (option of availableEdgeOptions; track option) {\n <option\n [disabled]=\"_.find(networkData.globalEdgeOptions, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <div class=\"flex items-center\">\n <label class=\"flex-1 mb-2 ml-1\">\n Data Column\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"edgeOption.column\"\n (ngModelChange)=\"updateOptions(edgeOption, 'datasetEdges')\">\n <option value=\"\">-- Select Option --</option>\n @for (column of (edgeDataset && edgeDataset.columns) ? edgeDataset.columns : dataset.columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Custom Value\n @if (edgeOption.key && visNetworkOptions.edges[edgeOption.key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.edges[edgeOption.key].type\" [(ngModel)]=\"edgeOption.value\" (change)=\"updateOptions(edgeOption, 'datasetEdges')\">\n }\n @if (edgeOption.key && visNetworkOptions.edges[edgeOption.key].type === 'boolean') {\n <select [(ngModel)]=\"edgeOption.value\" (change)=\"updateOptions(edgeOption, 'datasetEdges')\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/nodes.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n node options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"networkData.globalEdgeOptions.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"flex-1 w-1/2\">\n <div class=\"p-4\">\n <div class=\"w-full bg-white p-4 border rounded\">\n <div class=\"font-medium mb-3 text-base\">Edge Data</div>\n @for (edge of datasetEdges; track edge) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n From Node\n <input type=\"text\" [value]=\"edge.from\" disabled>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n To Node\n <input type=\"text\" [value]=\"edge.to\" disabled>\n </label>\n </div>\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"font-medium text-base\">Edge Options</div>\n <div class=\"mb-3 text-xs text-gray-500\">Set the options for this edge.</div>\n </div>\n <button mat-stroked-button color=\"primary\" (click)=\"edge.options.unshift({})\">\n <div class=\"flex items-center\">\n Add Edge Option\n </div>\n </button>\n </div>\n @for (edgeOption of edge.options; track edgeOption; let i = $index) {\n <div class=\"mb-2 flex items-center justify-between\">\n <label class=\"flex-1 mb-2 mr-1\">\n Option\n <select class=\"w-full\" matNativeControl [(ngModel)]=\"edgeOption.key\">\n <option value=\"\">-- Select Option --</option>\n @for (option of availableEdgeOptions; track option) {\n <option\n [disabled]=\"_.find(edge.options, {key: option})\"\n [value]=\"option\">\n {{option}}\n </option>\n }\n </select>\n <div class=\"text-xs font-normal text-gray-500\">&nbsp;</div>\n </label>\n <label class=\"flex-1 mb-2 ml-1\">\n Option Value\n @if (edgeOption.key && visNetworkOptions.edges[edgeOption.key].type !== 'boolean') {\n <input [type]=\"visNetworkOptions.edges[edgeOption.key].type\" [(ngModel)]=\"edgeOption.value\">\n }\n @if (edgeOption.key && visNetworkOptions.edges[edgeOption.key].type === 'boolean') {\n <select [(ngModel)]=\"edgeOption.value\">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n }\n <div class=\"text-xs font-normal text-gray-500\">\n <a href=\"https://visjs.github.io/vis-network/docs/network/edges.html\"\n target=\"_blank\" class=\"text-secondary flex items-center hover:underline\">\n edge options documentation\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"h-3 w-3 ml-1\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n </a>\n </div>\n </label>\n <button mat-icon-button color=\"warn\" (click)=\"edge.options.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n <hr class=\"py-2\">\n }\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n }\n <mat-tab label=\"Alert\">\n <div class=\"relative\">\n @if (!canSetAlerts) {\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Dashboard Alerts are reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (canSetAlerts) {\n @if (showAlertWarning) {\n <div\n class=\"bg-white shadow sm:rounded-lg absolute top-4 left-0 right-0 w-96 mx-auto z-20\">\n <div class=\"px-4 py-5 sm:p-6 bg-gray-50\">\n <h3 class=\"text-lg leading-6 font-medium text-gray-900\" id=\"renew-subscription-label\">\n Turn on Dashboard Alerts\n </h3>\n <div class=\"mt-2 sm:flex sm:items-start sm:justify-between\">\n <div class=\"max-w-xl text-sm text-gray-500\">\n <p id=\"renew-subscription-description\">\n Alerts for this dashboard are currently <b>off</b>. Slide the toggle to turn\n them on and start receiving notifications.\n </p>\n </div>\n <div class=\"mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center\">\n <mat-slide-toggle [(ngModel)]=\"dashboard.alertsEnabled\"></mat-slide-toggle>\n </div>\n </div>\n <div class=\"flex items-center justify-between mt-2\">\n <button mat-stroked-button (click)=\"showAlertWarning = false\">Close</button>\n <div></div>\n </div>\n </div>\n </div>\n }\n <div [class]=\"{'filter blur-sm': showAlertWarning}\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">Alert Settings</h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Configure alerts and notifications for this widget.\n </p>\n </div>\n </div>\n <div class=\"flex flex-col-reverse justify-stretch\">\n <button mat-flat-button color=\"primary\" (click)=\"editAlert(null)\">\n <mat-icon>add</mat-icon>\n New Alert\n </button>\n </div>\n </div>\n </div>\n @if (dashboardDatasetInstance && dashboardDatasetInstance.alerts && dashboardDatasetInstance.alerts.length) {\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\"\n >\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Alert\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Configuration\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (alert of dashboardDatasetInstance.alerts; track alert; let i = $index) {\n <tr>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{alert.title}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500 capitalize\"\n [innerHTML]=\"getAlertDetails(alert)\"></td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editAlert(alert, i)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteAlert(i)\"> Delete</button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n @if (dashboardDatasetInstance && (!dashboardDatasetInstance.alerts || !dashboardDatasetInstance.alerts.length)) {\n <div class=\"p-4\"\n >\n <button type=\"button\" (click)=\"editAlert(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">notifications_active\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create New Alert</span>\n </button>\n </div>\n }\n </div>\n }\n\n </div>\n </mat-tab>\n</mat-tab-group>\n</rsz-layout>\n\n</div>\n\n<div class=\"configure-footer\">\n <div></div>\n <button mat-flat-button color=\"primary\" (click)=\"saveDashboard()\">\n <div class=\"flex items-center\">\n <mat-icon class=\"mr-1\">chevron_left</mat-icon>\n Back to Dashboard\n </div>\n </button>\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {DatasetService} from '../../../services/dataset.service';\nimport * as fileSaver from 'file-saver';\nimport * as lodash from 'lodash';\nimport {MatSnackBar} from '@angular/material/snack-bar';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-export-data',\n templateUrl: './export-data.component.html',\n styleUrls: ['./export-data.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ExportDataComponent implements OnInit {\n\n public exportDataset: any = {};\n\n constructor(public dialogRef: MatDialogRef<ExportDataComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasetService: DatasetService,\n private snackBar: MatSnackBar) {\n }\n\n ngOnInit(): void {\n this.exportDataset.dataSetInstanceSummary = this.data.datasetInstanceSummary;\n this.exportDataset.transformationInstances = [];\n this.exportDataset.parameterValues = [];\n this.exportDataset.limit = '100';\n this.exportDataset.offset = '0';\n this.exportDataset.exporterKey = 'sv';\n this.exportDataset.exporterConfiguration = {includeHeaderRow: true, separator: ','};\n }\n\n public exportData() {\n this.datasetService.exportDataset(this.exportDataset).then(res => {\n let fileType = 'txt';\n if (this.exportDataset.exporterKey === 'json') {\n fileType = 'json';\n } else if (this.exportDataset.exporterKey === 'sv' &&\n this.exportDataset.exporterConfiguration.separator === ',') {\n fileType = 'csv';\n }\n\n const filename = _.kebabCase(this.exportDataset.dataSetInstanceSummary.title) + '-' + Date.now();\n fileSaver.saveAs(res, filename + '.' + fileType);\n this.dialogRef.close();\n this.snackBar.open('Data Exported Successfully.', 'Close', {\n duration: 3000,\n verticalPosition: 'top'\n });\n });\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>\n Export Data\n </h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n <label class=\"mb-4\">\n Export Type\n <select [(ngModel)]=\"exportDataset.exporterKey\">\n <option value=\"sv\">Separated Value</option>\n <option value=\"json\">JSON</option>\n </select>\n </label>\n\n @if (exportDataset.exporterKey === 'sv') {\n <mat-checkbox class=\"mb-2\"\n [(ngModel)]=\"exportDataset.exporterConfiguration.includeHeaderRow\">\n Include header row\n </mat-checkbox>\n <label class=\"mb-2\">\n Separator\n <input type=\"text\" [(ngModel)]=\"exportDataset.exporterConfiguration.separator\">\n <small class=\"font-normal\">Enter the character used to separate the values.</small>\n </label>\n }\n\n <label class=\"mb-4\">\n Limit Results\n <select [(ngModel)]=\"exportDataset.limit\">\n <option value=\"1\">1</option>\n <option value=\"5\">5</option>\n <option value=\"10\">10</option>\n <option value=\"25\">25</option>\n <option value=\"50\">50</option>\n <option value=\"100\">100</option>\n <option value=\"250\">250</option>\n <option value=\"500\">500</option>\n <option value=\"1000\">1000</option>\n <option value=\"5000\">5000</option>\n <option value=\"10000\">10000</option>\n </select>\n </label>\n\n <label class=\"mb-4\">\n Offset Results\n <input type=\"number\" [(ngModel)]=\"exportDataset.offset\">\n </label>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"exportData()\"\n [disabled]=\"!exportDataset.exporterKey\">Export Data\n </button>\n </div>\n\n</div>\n\n\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnDestroy,\n Output,\n ViewChild\n} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {ConfigureItemComponent} from '../configure-item/configure-item.component';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {DatasetService} from '../../../services/dataset.service';\nimport {AlertService} from '../../../services/alert.service';\nimport {Subject, Subscription} from 'rxjs';\nimport {DashboardService} from '../../../services/dashboard.service';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport moment from 'moment';\nimport regression from 'regression';\nimport {Router} from '@angular/router';\nimport {\n EditDashboardAlertComponent\n} from '../configure-item/edit-dashboard-alert/edit-dashboard-alert.component';\nimport {ExportDataComponent} from '../../data-explorer/export-data/export-data.component';\nimport {Location} from '@angular/common';\nimport {ActionEvent} from '../../../objects/action-event';\nimport {ExternalService} from '../../../services/external.service';\nimport {ProjectService} from '../../../services/project.service';\nimport chroma from 'chroma-js';\nimport { DataSet, Network } from 'vis-network/standalone';\nimport visNetworkOptions from '../configure-item/vis-network-options.json';\nimport { AngularD3Cloud } from 'angular-d3-cloud';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatDividerModule} from '@angular/material/divider';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {NgChartsModule} from 'ng2-charts';\n\ndeclare var window: any;\n\n@Component({\n imports: [\n AngularD3Cloud,\n MatIconModule,\n MatMenuModule,\n MatButtonModule,\n MatDividerModule,\n MatSlideToggleModule,\n NgChartsModule\n ],\n selector: 'ki-item-component',\n templateUrl: './item-component.component.html',\n styleUrls: ['./item-component.component.sass'],\n standalone: true\n})\nexport class ItemComponentComponent implements AfterViewInit, OnDestroy {\n\n @Input() dashboardItemType: any;\n @Input() itemInstanceKey: any;\n @Input() dashboard: any;\n @Input() dashboardItem: any;\n @Input() dragItem: boolean;\n @Input() grid: any;\n @Input() actionEvents: ActionEvent[] = [];\n @Input() external = false;\n @Input() queryParams: any;\n @Input() editAlerts = false;\n\n @Output() duplicateItem: EventEmitter<any> = new EventEmitter<any>();\n\n @HostBinding('class.justify-center') configureClass = false;\n\n @ViewChild('textTemplate') textTemplate: ElementRef;\n\n public datasourceService: any;\n public datasetService: any;\n public alertService: any;\n public _ = _;\n public imageError = false;\n public Object = Object;\n public String = String;\n public dataset: any;\n public chartData: any;\n public dashboardDatasetInstance: any = {};\n public loadingItem = false;\n public filterFields: any = [];\n public dependencies: any = {};\n public metric: any = {};\n public textData: any = {};\n public networkData: any = {};\n public wordCloud: any = {};\n public imageData: any = {};\n public tabular: any = {};\n public tableCells: any = {};\n public hiddenColumns: any = {};\n public general: any = {};\n public callToAction: any = {};\n public actionItem: any = {};\n public alert = false;\n public alertData: any = [];\n public showAlertData = false;\n public admin: boolean;\n public viewOnly: boolean;\n public currencies = [\n {\n name: 'British Pound (£)',\n value: 'GBP',\n symbol: '£'\n },\n {\n name: 'US Dollar ($)',\n value: 'USD',\n symbol: '$'\n },\n {\n name: 'Euro (€)',\n value: 'EUR',\n symbol: '€'\n }\n ];\n public limit = 25;\n public page = 1;\n public offset = 0;\n public endOfResults = false;\n public itemLocked = false;\n public optimise = true;\n public optimiseSubject = new Subject<boolean>();\n public canExportData = false;\n public externalError = false;\n public quotaExceeded: string = null;\n public existingGridItem = false;\n public itemNoMove = false;\n public visNetworkOptions = visNetworkOptions;\n\n private itemLoadedSub: Subscription;\n private optimiseSub: Subscription;\n\n constructor(private dialog: MatDialog,\n private kiDatasourceService: DatasourceService,\n private kiDatasetService: DatasetService,\n private kiAlertService: AlertService,\n private dashboardService: DashboardService,\n private sanitizer: DomSanitizer,\n private router: Router,\n private location: Location,\n private externalService: ExternalService,\n private projectService: ProjectService) {\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.canExportData = this.projectService.doesActiveProjectHavePrivilege('exportdata');\n\n const instanceElement = document.getElementById(this.itemInstanceKey);\n if (instanceElement) {\n const widget = instanceElement.closest('.grid-stack-item');\n this.itemNoMove = widget.getAttribute('gs-no-move') === 'true';\n }\n }, 50);\n }\n\n public async init(evaluate = false) {\n this.mapLayoutSettingsToComponentData();\n\n if (this.tabular && this.tabular.limit) {\n this.limit = this.tabular.limit;\n }\n\n if (this.general && this.general.limit) {\n this.limit = this.general.limit;\n this.offset = this.general.offset;\n }\n\n if (!this.datasourceService) {\n this.datasourceService = this.kiDatasourceService;\n }\n\n if (!this.datasetService) {\n this.datasetService = this.kiDatasetService;\n }\n\n if (!this.alertService) {\n this.alertService = this.kiAlertService;\n }\n\n if (this.dashboard &&\n this.dashboard.displaySettings.heading &&\n this.dashboard.displaySettings.heading[this.itemInstanceKey]) {\n this.dashboardItemType.headingValue = this.dashboard.displaySettings.heading[this.itemInstanceKey];\n }\n\n if (this.general.parameterBar && Object.keys(this.general.parameterBar).length) {\n if (!this.general.widgetParameters || Array.isArray(this.general.widgetParameters)) {\n this.general.widgetParameters = {};\n }\n\n Object.keys(this.general.parameterBar).forEach(paramKey => {\n if (this.general.parameterBar[paramKey] && !this.general.widgetParameters[paramKey]) {\n this.general.widgetParameters[paramKey] = _.cloneDeep(this.dashboard.layoutSettings.parameters[paramKey]);\n }\n if (!this.general.parameterBar[paramKey]) {\n delete this.general.widgetParameters[paramKey];\n }\n });\n }\n\n this.configureClass = true;\n if (this.dependencies.instanceKeys && this.dependencies.instanceKeys.length) {\n this.loadingItem = true;\n\n this.itemLoadedSub = this.dashboardService.dashboardItems.subscribe(async loaded => {\n const loadedInstances = Object.keys(loaded);\n const dependent = _.filter(loadedInstances, key => {\n return this.dependencies.instanceKeys.indexOf(key) > -1;\n });\n if (dependent.length === this.dependencies.instanceKeys.length) {\n if (this.itemLoadedSub) {\n this.itemLoadedSub.unsubscribe();\n }\n\n const allLoaded = _.every(this.dependencies.instanceKeys, key => {\n return this.dependencies[key].type === 'LOADED';\n });\n if (allLoaded) {\n this.evaluate();\n } else {\n const matches = _.filter(this.dependencies, {type: 'MATCH'});\n const allMatched = [];\n for (const dep of matches) {\n const selectedDatasetInstance = _.find(this.dashboard.datasetInstances, {instanceKey: dep.key});\n if (selectedDatasetInstance) {\n const mappedParams = this.getMappedParams(selectedDatasetInstance);\n\n const transformations = _.clone(selectedDatasetInstance.transformationInstances);\n transformations.push({type: 'filter', config: dep.filterJunction});\n\n const datasetInstanceSummary = {\n datasetInstanceId: selectedDatasetInstance.datasetInstanceId,\n datasourceInstanceKey: selectedDatasetInstance.datasourceInstanceKey,\n transformationInstances: transformations,\n parameterValues: mappedParams,\n parameters: selectedDatasetInstance.parameters\n };\n\n let data = null;\n if (this.external) {\n data = await this.externalService.evaluateDataset(\n this.dashboard.id,\n this.itemInstanceKey,\n selectedDatasetInstance.parameterValues,\n '0',\n '1',\n this.queryParams);\n } else {\n data = await this.datasetService.evaluateDataset(\n datasetInstanceSummary, '0', '1');\n }\n\n\n allMatched.push(data.allData.length === 1);\n }\n }\n if (_.every(allMatched)) {\n this.evaluate();\n } else {\n this.loadingItem = false;\n const itemElement: any = document.getElementById(this.itemInstanceKey).closest('.grid-stack-item');\n itemElement.classList.add('item-disabled');\n }\n }\n }\n });\n } else if (evaluate) {\n this.evaluate();\n }\n\n this.optimiseSub = this.optimiseSubject.subscribe(res => this.optimise = res);\n\n this.existingGridItem = !!_.find(this.dashboard.layoutSettings.grid, item => {\n return item.content.includes(this.itemInstanceKey);\n });\n }\n\n ngOnDestroy() {\n if (this.optimiseSub) {\n this.optimiseSub.unsubscribe();\n }\n if (this.itemLoadedSub) {\n this.itemLoadedSub.unsubscribe();\n }\n }\n\n public lockItem() {\n const itemElement = document.getElementById(this.itemInstanceKey);\n const widget = itemElement.closest('.grid-stack-item');\n this.itemNoMove = widget.getAttribute('gs-no-move') !== 'true';\n this.grid.update(widget, {noMove: this.itemNoMove});\n }\n\n public duplicate() {\n this.duplicateItem.emit(this.itemInstanceKey);\n }\n\n public configure() {\n if (this.dashboardItemType.type === 'heading') {\n this.dashboardItemType._editing = true;\n } else {\n const queryParams: any = {};\n if (this.admin) {\n queryParams.a = true;\n }\n this.router.navigate([window.location.pathname], {\n queryParams,\n fragment: _.kebabCase(this.dashboard.title)\n });\n const dialogRef = this.dialog.open(ConfigureItemComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n data: {\n grid: this.grid,\n dashboard: this.dashboard,\n dashboardDatasetInstance: this.dashboardDatasetInstance,\n itemInstanceKey: this.itemInstanceKey,\n dashboardItemType: this.dashboardItemType,\n admin: this.admin,\n actionEvents: this.actionEvents\n }\n });\n dialogRef.afterClosed().subscribe(dashboardDatasetInstance => {\n if (dashboardDatasetInstance) {\n this.dashboardDatasetInstance = dashboardDatasetInstance;\n this.location.back();\n this.init(true);\n }\n });\n }\n }\n\n public load() {\n // Check to see if any of the grid items are locked\n const grid = this.dashboard.layoutSettings.grid;\n const lockedItems = _.filter(grid, 'locked');\n this.itemLocked = !!_.find(lockedItems, lockedItem => {\n return lockedItem.content.includes(this.itemInstanceKey);\n });\n\n if (this.external) {\n this.itemLocked = true;\n }\n\n if (this.dashboardDatasetInstance) {\n return this.evaluate();\n }\n return Promise.resolve(true);\n }\n\n public removeWidget(event) {\n const message = 'Are your sure you would like to remove this item from your dashboard?';\n if (window.confirm(message)) {\n const itemElement = document.getElementById(this.itemInstanceKey);\n _.remove(this.dashboard.datasetInstances, {instanceKey: this.itemInstanceKey});\n const widget = itemElement.closest('.grid-stack-item');\n this.grid.removeWidget(widget);\n }\n }\n\n public triggerActionEvent(actionEvent, column, value) {\n const action: ActionEvent = _.find(this.actionEvents, {name: actionEvent});\n if (action) {\n action.event.next({key: column.name, value});\n }\n }\n\n public getActionEventTitle(actionEvent, column, value) {\n const action: ActionEvent = _.find(this.actionEvents, {name: actionEvent});\n\n let title = '';\n if (action) {\n title = this.isActionComplete(actionEvent, value) ? action.completeLabel : action.actionLabel;\n }\n return title;\n }\n\n public isActionComplete(actionEvent, value) {\n let complete = false;\n const action: ActionEvent = _.find(this.actionEvents, {name: actionEvent});\n\n if (action) {\n const findData = {};\n findData[action.comparisonField] = value;\n complete = _.find(action.data || [], findData);\n }\n\n return complete;\n }\n\n public editItemAlerts(alert, index?) {\n const dialogRef = this.dialog.open(EditDashboardAlertComponent, {\n width: '900px',\n height: '750px',\n data: {\n alert,\n filterFields: this.filterFields\n }\n });\n\n dialogRef.afterClosed().subscribe(alertItem => {\n if (alertItem) {\n if (!this.dashboardDatasetInstance.alerts) {\n this.dashboardDatasetInstance.alerts = [];\n }\n if (index >= 0) {\n this.dashboardDatasetInstance.alerts[index] = alertItem;\n } else {\n this.dashboardDatasetInstance.alerts.push(alertItem);\n }\n\n this.reloadAlert();\n }\n });\n }\n\n public removeAlert(event, alert, i) {\n const message = `Are you sure you would like to delete the \"${alert.title}\" Alert?`;\n if (window.confirm(message)) {\n this.dashboardDatasetInstance.alerts.splice(i, 1);\n this.reloadAlert();\n }\n }\n\n public exportData() {\n const datasetInstanceSummary = this.prepareDatasetInstanceSummaryForEvaluation();\n\n const dialogRef = this.dialog.open(ExportDataComponent, {\n width: '600px',\n height: '530px',\n data: {\n datasetInstanceSummary\n }\n });\n }\n\n public updateHeading(event) {\n if (!this.dashboard.displaySettings.heading) {\n this.dashboard.displaySettings.heading = {};\n }\n\n this.dashboard.displaySettings.heading[this.itemInstanceKey] = this.dashboardItemType.headingValue;\n this.dashboardItemType._editing = false;\n }\n\n public async setupNetworkChart() {\n const nodeData = this.dataset.allData;\n\n const datasetNodes: any = [];\n const datasetEdges: any = [];\n\n nodeData.forEach(item => {\n const nodeLevelItem: any = {};\n const nodeItem: any = {\n id: item[this.networkData.nodeIds],\n label: item[this.networkData.nodeLabels],\n group: item[this.networkData.nodeGroups]\n };\n\n if (this.networkData.nodes) {\n if (this.networkData.nodes[nodeItem.id]) {\n nodeItem.x = this.networkData.nodes[nodeItem.id].x;\n nodeItem.y = this.networkData.nodes[nodeItem.id].y;\n }\n }\n\n if (this.networkData.nodeLevelOptions && Object.keys(this.networkData.nodeLevelOptions).length &&\n this.networkData.nodeLevelOptions[nodeItem.id]) {\n this.networkData.nodeLevelOptions[nodeItem.id].forEach(option => {\n nodeLevelItem[option.key] = option.value;\n });\n }\n datasetNodes.push(Object.assign(nodeLevelItem, nodeItem));\n if (!this.networkData.edgeDatasetTitle) {\n datasetEdges.push({\n from: item[this.networkData.fromIds],\n to: item[this.networkData.toIds]\n });\n }\n });\n\n if (this.networkData.edgeDatasetTitle) {\n const datasetInstanceSummary = {\n datasetInstanceId: this.networkData.edgeDatasetId,\n datasourceInstanceKey: this.networkData.edgeDatasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: {}\n };\n\n const edgeDataset: any = await this.datasetService.evaluateDataset(\n datasetInstanceSummary,\n '0',\n '10000000'\n );\n edgeDataset.allData.forEach(item => {\n datasetEdges.push({\n from: item[this.networkData.fromIds],\n to: item[this.networkData.toIds]\n });\n });\n }\n\n datasetEdges.forEach(edge => {\n const edgeOptions = _.find(this.networkData.edgeLevelOptions, {from: edge.from, to: edge.to});\n if (edgeOptions && edgeOptions.options.length) {\n edgeOptions.options.forEach(option => {\n edge[option.key] = option.value;\n });\n }\n });\n\n // create an array with nodes\n const nodes = new DataSet(datasetNodes);\n\n // create an array with edges\n const edges = new DataSet(datasetEdges);\n\n // create a network\n const container = document.getElementById(this.itemInstanceKey + 'VIS');\n const data = {\n nodes,\n edges\n };\n const options: any = {\n nodes: {\n font: {\n multi: 'html'\n }\n },\n edges: {},\n groups: {},\n layout: {}\n };\n\n const mapOptionValue = (option: any, networkType: string) => {\n if (option && Object.keys(option).length) {\n const type = visNetworkOptions[networkType][option.key].type;\n let value = option.value;\n if (type === 'number') {\n value = Number(value);\n } else if (type === 'boolean') {\n value = value === 'true';\n }\n options[networkType][option.key] = value;\n }\n };\n\n if (this.networkData.nodeOptions) {\n this.networkData.nodeOptions.forEach(option => {\n mapOptionValue(option, 'nodes');\n });\n }\n\n if (this.networkData.edgeOptions) {\n this.networkData.edgeOptions.forEach(option => {\n mapOptionValue(option, 'edges');\n });\n }\n\n if (this.networkData.nodeGroupOptions && Object.keys(this.networkData.nodeGroupOptions).length) {\n Object.keys(this.networkData.nodeGroupOptions).forEach(groupKey => {\n this.networkData.nodeGroupOptions[groupKey].options.forEach(option => {\n if (!options.groups[groupKey]) {\n options.groups[groupKey] = {};\n }\n if (option && Object.keys(option).length) {\n options.groups[groupKey][option.key] = option.value;\n }\n });\n });\n }\n\n const network = new Network(container, data, options);\n this.networkData.network = network;\n }\n\n public evaluateTextData(textData) {\n let evaluatedTextData = '';\n const element: any = document.createElement('div');\n element.innerHTML = this.bindParametersInString(textData);\n\n const data: any = {\n dataSet: this.dataset.allData\n };\n _.forEach(this.dataset.allData[0] || [], (value, key) => {\n data[key] = value;\n });\n\n const Kinibind = window.Kinibind;\n Kinibind.config = {\n prefix: 'd',\n templateDelimiters: ['[[', ']]']\n };\n const bind = new Kinibind(element, data);\n const boundHTML = bind.boundContext.els[0].innerHTML;\n evaluatedTextData = this.sanitizer.sanitize(1, boundHTML);\n element.remove();\n return evaluatedTextData;\n }\n\n public async setChartData() {\n if (this.dashboardItemType.xAxis && this.dashboardItemType.yAxis) {\n let datasetData = this.dataset.allData;\n if (this.dashboardItemType.limit) {\n datasetData = datasetData.slice(0, this.dashboardItemType.limit);\n if (this.dashboardItemType.combineRemaining && !this.dashboardItemType.seriesColumn) {\n const remainingData = await this.evaluateDataset(10000000, 0);\n\n const combined = [];\n for (let i = 0; i < remainingData.allData.length; i++) {\n if (i > this.dashboardItemType.limit) {\n combined.push(remainingData.allData[i]);\n }\n }\n\n const pushObject = {};\n pushObject[this.dashboardItemType.xAxis] = this.dashboardItemType.combineRemaingingLabel || 'Remaining';\n pushObject[this.dashboardItemType.yAxis] = _.sumBy(combined, remainingItem => {\n return Number(remainingItem[this.dashboardItemType.yAxis]);\n });\n datasetData.push(pushObject);\n }\n }\n\n let data: any;\n\n if (!this.dashboardItemType.seriesColumn) {\n if (this.dashboardItemType.type !== 'pie' && this.dashboardItemType.type !== 'doughnut') {\n data = _.map(datasetData, item => {\n return {x: item[this.dashboardItemType.xAxis], y: item[this.dashboardItemType.yAxis]};\n });\n } else {\n data = _.map(datasetData, item => {\n return item[this.dashboardItemType.yAxis];\n });\n }\n\n this.chartData = [\n {\n data,\n label: _.find(this.filterFields, {name: this.dashboardItemType.xAxis}).title,\n fill: !!this.dashboardItemType.fill,\n borderColor: (this.dashboardItemType.type === 'pie' || this.dashboardItemType.type === 'doughnut') ? chroma('white').alpha(0.2).hex() : this.dashboardItemType.borderColor,\n backgroundColor: this.dashboardItemType.type === 'line' ?\n (Array.isArray(this.dashboardItemType.borderColor) ? _.map(this.dashboardItemType.borderColor, colour => {\n return chroma(colour || 'black').alpha(0.5).hex();\n }) : chroma(this.dashboardItemType.borderColor || 'black').alpha(0.5).hex()) : this.dashboardItemType.backgroundColor,\n tension: 0.2,\n pointBackgroundColor: this.dashboardItemType.borderColor ? this.dashboardItemType.borderColor[0] : null,\n pointBorderColor: this.dashboardItemType.borderColor ? this.dashboardItemType.borderColor[0] : null\n }\n ];\n this.dashboardItemType.labels = _.map(datasetData, item => {\n return item[this.dashboardItemType.xAxis];\n });\n } else {\n const chartData = [];\n const series = _.uniq(_.map(datasetData, this.dashboardItemType.seriesColumn));\n series.forEach((value, index) => {\n const seriesResults = _.filter(datasetData, allData => {\n return allData[this.dashboardItemType.seriesColumn] === value;\n });\n\n chartData.push({\n data: _.map(seriesResults, item => {\n return {x: item[this.dashboardItemType.xAxis], y: item[this.dashboardItemType.yAxis]};\n }),\n label: value,\n fill: !!this.dashboardItemType.fill,\n borderColor: this.dashboardItemType.borderColor,\n backgroundColor: this.dashboardItemType.type === 'line' ?\n (Array.isArray(this.dashboardItemType.borderColor) ? _.map(this.dashboardItemType.borderColor, colour => {\n return chroma(colour || 'black').alpha(0.5).hex();\n }) : chroma(this.dashboardItemType.borderColor || 'black').alpha(0.5).hex()) : this.dashboardItemType.backgroundColor[index],\n tension: 0.2,\n pointBackgroundColor: this.dashboardItemType.borderColor[index],\n pointBorderColor: this.dashboardItemType.borderColor[index]\n });\n });\n this.chartData = chartData;\n this.dashboardItemType.labels = _.uniq(_.map(datasetData, item => {\n return item[this.dashboardItemType.xAxis];\n }));\n }\n\n if (this.dashboardItemType.trendLine) {\n let trendLine = [];\n let trendLabel = 'Trend';\n if (this.dashboardItemType.trendLine === 'average') {\n trendLabel = 'Average';\n const trendData = [];\n this.chartData.forEach(dataItem => {\n trendData.push(_.map(dataItem.data, 'y'));\n });\n const average = _.flatMap(trendData).reduce((p, c) => p + c, 0) / _.flatMap(trendData).length;\n trendLine = _.fill(_.range(0, _.flatMap(trendData).length), average, 0, _.flatMap(trendData).length);\n } else if (this.dashboardItemType.trendLine === 'logarithmic' ||\n this.dashboardItemType.trendLine === 'linear' ||\n this.dashboardItemType.trendLine === 'power' ||\n this.dashboardItemType.trendLine === 'exponential') {\n\n const trendLineData = _.map(this.dataset.allData, (item, index) => {\n return {x: index + 1, y: item[this.dashboardItemType.yAxis]};\n }).filter(({x, y}) => {\n return (\n typeof x === typeof y && // filter out one string & one number\n !isNaN(x) && // filter out `NaN`\n !isNaN(y) &&\n Math.abs(x) !== Infinity &&\n Math.abs(y) !== Infinity\n );\n }).map(({x, y}) => {\n return [x, y];\n });\n\n const trendLineResults = regression[this.dashboardItemType.trendLine](trendLineData);\n trendLine = trendLineResults.points.map(([x, y]) => {\n return y;\n });\n } else {\n trendLine = _.map(this.dataset.allData, item => {\n return item[this.dashboardItemType.trendLine];\n });\n trendLabel = _.find(this.filterFields, {name: this.dashboardItemType.trendLine}).title;\n }\n\n this.chartData.push({\n type: 'line',\n data: trendLine,\n label: trendLabel,\n borderColor: this.dashboardItemType.trendLineColour,\n fill: false,\n order: -1,\n tension: 0.15,\n pointBackgroundColor: this.dashboardItemType.trendLineColour,\n pointBorderColor: this.dashboardItemType.trendLineColour\n });\n }\n }\n }\n\n public updateImageData() {\n this.imageData.source = this.imageData.column ? this.dataset.allData[0][this.imageData.column] : null;\n }\n\n public updateMetricDataValues() {\n if (this.metric.main) {\n this.metric.mainValue = _.isNaN(Number(this.dataset.allData[0][this.metric.main])) ? this.dataset.allData[0][this.metric.main] : Number(this.dataset.allData[0][this.metric.main]);\n this.metric.title = _.startCase(this.metric.main);\n }\n\n if (this.metric.subMetric) {\n this.metric.subValue = Number(this.dataset.allData[0][this.metric.subMetric]);\n this.metric.subTitle = _.startCase(this.metric.subMetric);\n }\n\n if (this.metric.showSubChange) {\n this.metric.difference = Math.abs(this.metric.mainValue - this.metric.subValue);\n }\n }\n\n public callToActionLink(cta, dataItem?) {\n let url: string = null;\n\n if (cta.type === 'dashboard') {\n const params = _.pickBy(cta.parameters, (value, key) => {\n return !_.startsWith(key, 'custom-');\n });\n\n const data = dataItem || this.dashboard.layoutSettings.parameters;\n\n Object.keys(params).forEach(paramKey => {\n let value = this.bindParametersInString(params[paramKey], data);\n // Check if we have any column eg. [[ ]] values needing mapping\n value = this.mapColumnToValue(value, data);\n\n params[paramKey] = value;\n });\n const urlParams = new URLSearchParams(params).toString();\n url = `/dashboards/view/${cta.value}${this.admin ? '?a=true&' : '?'}${urlParams}`;\n } else if (cta.type === 'custom') {\n url = cta.link;\n\n const data = dataItem || this.dashboard.layoutSettings.parameters;\n\n url = this.bindParametersInString(url, data);\n // Check if we have any column eg. [[ ]] values needing mapping\n url = this.mapColumnToValue(url, data);\n } else if (cta.type === 'feed') {\n url = `/dap-data-feeds/${cta.value}`;\n }\n\n if (url) {\n if (!cta.windowLocation || cta.windowLocation === 'EXISTING') {\n window.location.href = url;\n } else {\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('target', '_blank');\n a.setAttribute('rel', 'noopener noreferrer');\n a.click();\n }\n }\n }\n\n public bindParametersInString(searchString, data?) {\n if (!data) {\n data = this.dashboard.layoutSettings.parameters;\n }\n if (searchString) {\n const matches = searchString.match(/\\{\\{(.*?)\\}\\}/g) || [];\n matches.forEach(exp => {\n const expValue = exp.replace('{{', '').replace('}}', '');\n const parameter = data ? data[expValue] : null;\n if (parameter) {\n const value = _.isPlainObject(parameter) ? parameter.value : parameter;\n searchString = searchString.replace(exp, value);\n }\n });\n }\n\n return searchString;\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluate();\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluate();\n }\n\n public pageSizeChange(value) {\n this.limit = value;\n\n // If we change the table limit - we also want to save the dashboard automatically to keep the changes\n this.tabular.limit = this.limit;\n this.dashboardService.saveDashboard(this.dashboard);\n\n this.evaluate(true);\n }\n\n public sortHeader(columnObject) {\n const column = columnObject.name;\n let direction = '';\n\n const existingMultiSort = _.find(this.dashboardDatasetInstance.transformationInstances, {type: 'multisort'});\n\n let existingColumnIndex = -1;\n if (existingMultiSort) {\n existingColumnIndex = _.findIndex(existingMultiSort.config.sorts, {fieldName: column});\n }\n\n if (!existingMultiSort || existingColumnIndex === -1) {\n direction = 'asc';\n } else if (existingColumnIndex >= 0 && existingMultiSort.config.sorts[existingColumnIndex].direction === 'asc') {\n direction = 'desc';\n } else if (existingColumnIndex >= 0 && existingMultiSort.config.sorts[existingColumnIndex].direction === 'desc') {\n direction = '';\n } else if (existingColumnIndex >= 0 && !existingMultiSort.config.sorts[existingColumnIndex].direction) {\n direction = 'asc';\n }\n\n columnObject.direction = direction;\n\n if (existingMultiSort) {\n const existingIndex = _.findIndex(existingMultiSort.config.sorts, {fieldName: column});\n if (direction) {\n if (existingIndex > -1) {\n existingMultiSort.config.sorts[existingIndex] = {fieldName: column, direction};\n } else {\n existingMultiSort.config.sorts.push({fieldName: column, direction});\n }\n } else {\n existingMultiSort.config.sorts.splice(existingIndex, 1);\n if (!existingMultiSort.config.sorts.length) {\n _.remove(this.dashboardDatasetInstance.transformationInstances, {type: 'multisort'});\n }\n }\n } else {\n if (direction) {\n this.dashboardDatasetInstance.transformationInstances.push(\n {\n type: 'multisort',\n config: {\n sorts: [{fieldName: column, direction}]\n }\n }\n );\n }\n }\n\n this.evaluate(true);\n }\n\n public changeDateType(event, parameter, value) {\n event.stopPropagation();\n event.preventDefault();\n parameter._dateType = value;\n this.reloadWidget();\n }\n\n public updatePeriodValue(value, period, parameter) {\n parameter.value = `${value}_${period}_AGO`;\n this.reloadWidget();\n }\n\n public booleanUpdate(event, parameter) {\n parameter.value = event.checked;\n this.reloadWidget();\n }\n\n public reloadWidget() {\n const parameterValues: any = {};\n _.forEach(this.general.widgetParameters, param => {\n parameterValues[param.name] = param.value;\n });\n\n this.evaluate();\n }\n\n private mapColumnToValue(searchString, data) {\n if (searchString) {\n const matches = searchString.match(/\\[\\[(.*?)\\]\\]/g) || [];\n matches.forEach(exp => {\n const expValue = exp.replace('[[', '').replace(']]', '');\n let value = data ? data[expValue] : null;\n if (value) {\n value = _.isPlainObject(value) ? value.initialValue : value;\n searchString = searchString.replace(exp, value);\n }\n });\n }\n\n return searchString;\n }\n\n private evaluate(resetPager?) {\n if (resetPager) {\n this.resetPager();\n }\n\n const itemElement = document.getElementById(this.itemInstanceKey);\n if (itemElement) {\n const parentElement = itemElement.closest('.grid-stack-item');\n parentElement.classList.remove('item-disabled');\n }\n\n if (this.grid && _.isFunction(this.grid.makeElement)) {\n setTimeout(() => {\n this.grid.makeElement(itemElement);\n }, 0);\n }\n\n this.loadingItem = true;\n this.hiddenColumns = {};\n\n return this.evaluateDataset().then(data => {\n if (Object.keys(this.tableCells).length) {\n Object.keys(this.tableCells).forEach(tableCell => {\n if (tableCell !== 'column') {\n data.allData.map((item, index) => {\n\n if (!_.isUndefined(item[tableCell])) {\n const cellData = this.tableCells[tableCell].data;\n switch (this.tableCells[tableCell].type) {\n case 'number':\n const cellNumber = parseFloat(String(item[tableCell]));\n item[tableCell] = {\n cellValue: cellNumber.toFixed(cellData.decimal),\n initialValue: item[tableCell]\n };\n break;\n case 'currency':\n let cellCurrency: any = parseFloat(String(item[tableCell]));\n\n if (cellData.thousandsSeparator && (cellData.currency && cellData.currency.value)) {\n cellCurrency = cellCurrency.toLocaleString('en-GB', {\n style: 'currency',\n currency: cellData.currency.value,\n minimumFractionDigits: cellData.decimal || 0\n });\n } else {\n cellCurrency = cellCurrency.toFixed(cellData.decimal);\n if (cellData.thousandsSeparator) {\n cellCurrency = Number(cellCurrency).toLocaleString('en-GB', {\n minimumFractionDigits: cellData.decimal || 0\n });\n }\n if (cellData.currency && cellData.currency.value) {\n cellCurrency = `${cellData.currency.symbol}${cellCurrency}`;\n }\n }\n\n item[tableCell] = {cellValue: cellCurrency, initialValue: item[tableCell]};\n break;\n case 'percentage':\n let cellPercent: any = Number(item[tableCell]);\n const formatter = new Intl.NumberFormat('en-GB', {\n style: 'percent',\n minimumFractionDigits: cellData.decimal || 0\n });\n cellPercent = formatter.format(cellPercent);\n\n if (!cellData.thousandsSeparator) {\n cellPercent = cellPercent.replace(',', '');\n }\n\n item[tableCell] = {cellValue: cellPercent, initialValue: item[tableCell]};\n break;\n case 'datetime':\n const dateMoment = moment(item[tableCell]);\n const dateFormat = cellData.dateFormat === 'null' ? '' : cellData.dateFormat;\n const timeFormat = cellData.timeFormat === 'null' ? '' : cellData.timeFormat;\n\n item[tableCell] = {\n cellValue: dateMoment.format(dateFormat + ' ' + timeFormat),\n initialValue: item[tableCell]\n };\n break;\n case 'comparison':\n const comparisonColumn = this.tableCells[tableCell].data.comparisonColumn;\n const initialValue = _.isPlainObject(item[tableCell]) ? item[tableCell].initialValue : item[tableCell];\n const comparisonValue = _.isPlainObject(data.allData[index][comparisonColumn]) ? data.allData[index][comparisonColumn].initialValue : data.allData[index][comparisonColumn];\n let difference: any = Number(initialValue) - Number(comparisonValue);\n let cellValue = `<div class=\"flex items-center space-between\"><span class=\"font-medium\">${initialValue}</span>`;\n if (difference === 0) {\n cellValue += `<span class=\"ml-1 text-blue-500 font-medium text-lg\">&#61;</span>`;\n }\n if (difference > 0) {\n if (cellData.comparisonPercentage) {\n const compareFormatter = new Intl.NumberFormat('en-GB', {\n style: 'percent',\n minimumFractionDigits: cellData.comparisonDecimals || 0\n });\n difference = compareFormatter.format(difference / comparisonValue);\n }\n cellValue += `<span class=\"ml-1 text-green-500 font-medium text-lg\">&#8593;</span><span class=\"text-sm text-green-500\">${difference}</span>`;\n }\n if (difference < 0) {\n if (cellData.comparisonPercentage) {\n const compareFormatter = new Intl.NumberFormat('en-GB', {\n style: 'percent',\n minimumFractionDigits: cellData.comparisonDecimals || 0\n });\n difference = compareFormatter.format(difference / comparisonValue);\n }\n cellValue += `<span class=\"ml-1 text-red-500 font-medium text-lg\">&#8595;</span><span class=\"text-sm text-red-500\">${difference}</span>`;\n }\n cellValue += `<span class=\"ml-2 text-xs text-gray-400\">from ${comparisonValue}</span></div>`;\n item[tableCell] = {cellValue, initialValue};\n break;\n case 'link':\n let linkValue = cellData.customLink;\n let anchor = '';\n if (cellData.linkType === 'custom') {\n const dataItem = data.allData[index] || this.dashboard.layoutSettings.parameters;\n\n linkValue = this.bindParametersInString(linkValue, dataItem);\n // Check if we have any column eg. [[ ]] values needing mapping\n linkValue = this.mapColumnToValue(linkValue, dataItem);\n anchor = `<a href=\"${linkValue}\" target=\"_blank\" class=\"text-cta hover:underline flex items-center\">${item[tableCell]}</a>`;\n } else if (cellData.linkType === 'dashboard') {\n const params = {};\n const dashboardLink = cellData.dashboardLink;\n const dataItem = data.allData[index] || this.dashboard.layoutSettings.parameters;\n\n Object.keys(cellData.dashboardLinkParams).forEach(paramKey => {\n let value = this.bindParametersInString(cellData.dashboardLinkParams[paramKey], dataItem);\n // Check if we have any column eg. [[ ]] values needing mapping\n value = this.mapColumnToValue(value, dataItem);\n\n params[paramKey] = value;\n\n });\n const urlParams = new URLSearchParams(params).toString();\n linkValue = `${this.router.url.split('/')[0]}/dashboards/view/${dashboardLink.value}${this.admin ? '?a=true&' : '?'}${urlParams}`;\n anchor = `<a href=\"${linkValue}\" class=\"text-cta hover:underline flex items-center\">${item[tableCell]}</a>`;\n } else {\n linkValue = linkValue.includes('http') ? linkValue : `http://${linkValue}`;\n anchor = `<a href=\"${linkValue}\" target=\"_blank\" class=\"text-cta hover:underline flex items-center\">${item[tableCell]}</a>`;\n }\n\n item[tableCell] = {\n cellValue: anchor,\n initialValue: linkValue\n };\n break;\n case 'custom':\n const element: any = document.createElement('div');\n const originalValue = item[tableCell];\n element.innerHTML = this.bindParametersInString(cellData.customText);\n\n const kData: any = {\n dataSet: data.allData\n };\n _.forEach(data.allData[index] || [], (value, key) => {\n kData[key] = value;\n });\n const Kinibind = window.Kinibind;\n Kinibind.config = {\n prefix: 'd',\n templateDelimiters: ['[[', ']]']\n };\n const bind = new Kinibind(element, kData);\n const boundHTML = bind.boundContext.els[0].innerHTML;\n item[tableCell] = {\n cellValue: this.sanitizer.sanitize(1, boundHTML),\n initialValue: originalValue\n };\n element.remove();\n break;\n case 'hide':\n this.hiddenColumns[tableCell] = true;\n break;\n }\n }\n return item;\n });\n }\n });\n }\n this.dataset = data;\n const returnedDataLength = this.dataset.allData.length;\n\n const existingMultiSort = _.find(this.dashboardDatasetInstance.transformationInstances, {type: 'multisort'});\n\n if (existingMultiSort && existingMultiSort.config.sorts.length) {\n existingMultiSort.config.sorts.forEach(sort => {\n const column = _.find(this.dataset.columns, {name: sort.fieldName});\n if (column) {\n column.direction = sort.direction;\n }\n });\n }\n\n this.filterFields = _.map(this.dataset.columns, column => {\n return {\n title: column.title,\n name: column.name\n };\n });\n if (this.dashboard.layoutSettings.metric) {\n this.updateMetricDataValues();\n }\n\n if (this.dashboard.layoutSettings.imageData) {\n this.updateImageData();\n }\n\n if (Object.keys(this.textData).length) {\n this.textData.safeTextData = this.evaluateTextData(this.textData.value);\n }\n\n if (Object.keys(this.general).length) {\n this.general.evaluatedName = this.general.name ? this.evaluateTextData(this.general.name) : '';\n this.general.evaluatedDescription = this.general.description ? this.evaluateTextData(this.general.description) : '';\n this.general.evaluatedFooter = this.general.footer ? this.evaluateTextData(this.general.footer) : '';\n }\n\n setTimeout(() => {\n if (this.dashboardItemType.type === 'network') {\n this.setupNetworkChart();\n }\n\n const element = document.getElementById(this.itemInstanceKey);\n for (const child of Array.from(element ? element.children : []) as any[]) {\n if (child.classList.contains('item-container')) {\n this.wordCloud.width = child.clientWidth - 40;\n this.wordCloud.height = child.clientHeight - 40;\n }\n }\n if (Object.keys(this.wordCloud).length) {\n if (this.wordCloud.populationMethod === 'SINGLE') {\n const rowData = this.dataset.allData[this.wordCloud.row];\n if (rowData) {\n const words = _.words(rowData[this.wordCloud.column]);\n const count = _.countBy(words, _.identity);\n\n const max = _.max(_.values(count));\n const fontSize = ((this.wordCloud.height) * (this.wordCloud.width)) / 1000;\n\n this.wordCloud.data = _.orderBy(_.uniq(words).map(word => {\n return {text: word, value: ((count[word] / max) * _.min([fontSize, 120]))};\n }), ['value'], ['desc']).slice(0, 100);\n }\n } else if (this.wordCloud.populationMethod === 'WHOLE') {\n const maxFreq = _.maxBy(this.dataset.allData, item => {\n return Number(item[this.wordCloud.frequency]);\n })[this.wordCloud.frequency];\n const maxWordWidth: number = _.max(_.map(this.dataset.allData, item =>\n item[this.wordCloud.column].length * item[this.wordCloud.frequency] / maxFreq\n ));\n const fontSize = ((this.wordCloud.height) * (this.wordCloud.width)) / 3000;\n this.wordCloud.data = _.orderBy(this.dataset.allData.map(item => {\n const text = item[this.wordCloud.column];\n const itemFrequency = item[this.wordCloud.frequency];\n\n return {\n text,\n value: ((8 / maxWordWidth) * (Number(itemFrequency) / Number(maxFreq)) * _.min([fontSize, 400]))\n };\n }), ['value'], ['desc']).slice(0, 100);\n }\n\n }\n }, 50);\n\n\n this.loadingItem = false;\n this.configureClass = false;\n this.setChartData();\n\n if (this.dashboard.alertsEnabled && !this.external) {\n if (this.dashboardDatasetInstance.alerts && this.dashboardDatasetInstance.alerts.length) {\n if (this.dashboard.layoutSettings.parameters && Object.keys(this.dashboard.layoutSettings.parameters).length) {\n if (Array.isArray(this.dashboardDatasetInstance.parameterValues)) {\n this.dashboardDatasetInstance.parameterValues = {};\n }\n _.forEach(this.dashboard.layoutSettings.parameters, parameter => {\n this.dashboardDatasetInstance.parameterValues[parameter.name] = parameter.value;\n });\n }\n const dashboardInstance = _.cloneDeep(this.dashboardDatasetInstance);\n dashboardInstance.parameterValues = this.getMappedParams(this.dashboardDatasetInstance);\n this.alertService.processAlertsForDashboardDatasetInstance(dashboardInstance)\n .then((res: any) => {\n if (res && res.length) {\n this.alert = true;\n this.alertData = res;\n if (itemElement) {\n itemElement.classList.add('alert');\n itemElement.parentElement.classList.add('alert');\n }\n } else {\n this.resetAlertData(itemElement);\n }\n });\n } else {\n this.resetAlertData(itemElement);\n }\n } else {\n this.resetAlertData(itemElement);\n }\n const existing = this.dashboardService.dashboardItems.getValue();\n existing[this.itemInstanceKey] = true;\n this.dashboardService.dashboardItems.next(existing);\n\n this.endOfResults = returnedDataLength < this.limit;\n\n return Promise.resolve(true);\n }).catch(err => {\n });\n }\n\n private getMappedParams(dashboardDatasetInstance) {\n const mappedParams = {};\n _.forEach(dashboardDatasetInstance.parameterValues, (value, key) => {\n if (_.isString(value) && value.includes('{{')) {\n const globalKey = value.replace('{{', '').replace('}}', '');\n if (this.dashboard.layoutSettings.parameters && this.dashboard.layoutSettings.parameters[globalKey]) {\n mappedParams[key] = this.dashboard.layoutSettings.parameters[globalKey].value;\n }\n } else {\n mappedParams[key] = value;\n }\n\n });\n return mappedParams;\n }\n\n private resetAlertData(itemElement) {\n this.alert = false;\n this.alertData = [];\n if (itemElement) {\n itemElement.classList.remove('alert');\n itemElement.parentElement.classList.remove('alert');\n }\n }\n\n private resetPager() {\n this.offset = 0;\n this.page = 1;\n }\n\n private mapLayoutSettingsToComponentData() {\n _.forEach(this.dashboard.layoutSettings, (data, key) => {\n if (key !== 'grid') {\n const defaultValue = _.isPlainObject(this[key]) ? {} : [];\n this[key] = Object.keys(data).length ? data[this.itemInstanceKey] || defaultValue : defaultValue;\n }\n });\n }\n\n private reloadAlert(save = true) {\n const thisEl = document.getElementById(this.itemInstanceKey).closest('.grid-stack-item');\n const existingGrid = _.find(this.dashboard.layoutSettings.grid, grid => {\n return grid.content.includes(`id=\"${this.itemInstanceKey}\"`);\n });\n if (thisEl && existingGrid) {\n this.grid.removeWidget(thisEl);\n this.grid.addWidget(existingGrid);\n }\n\n if (save) {\n this.dashboardService.saveDashboard(this.dashboard);\n }\n }\n\n private evaluateDataset(limit?, offset?) {\n const datasetInstanceSummary = this.prepareDatasetInstanceSummaryForEvaluation();\n\n this.hiddenColumns = {};\n\n this.externalError = false;\n this.quotaExceeded = null;\n\n if (this.external) {\n return this.externalService.evaluateDataset(\n this.dashboard.id,\n this.itemInstanceKey,\n datasetInstanceSummary.parameterValues,\n String(offset || this.offset),\n String(limit || this.limit),\n this.queryParams\n ).catch(e => {\n this.externalError = true;\n });\n } else {\n return this.datasetService.evaluateDataset(\n datasetInstanceSummary,\n String(offset || this.offset),\n String(limit || this.limit)\n ).catch(e => {\n if (e && e.error && e.error.message && e.error.message.includes('quota')) {\n this.quotaExceeded = e.error.message;\n } else {\n this.externalError = true;\n }\n });\n }\n }\n\n private prepareDatasetInstanceSummaryForEvaluation() {\n const mappedParams = this.getMappedParams(this.dashboardDatasetInstance);\n\n const datasetInstanceSummary = {\n datasetInstanceId: this.dashboardDatasetInstance.datasetInstanceId,\n datasourceInstanceKey: this.dashboardDatasetInstance.datasourceInstanceKey,\n transformationInstances: this.dashboardDatasetInstance.transformationInstances,\n parameterValues: mappedParams,\n parameters: this.dashboardDatasetInstance.parameters\n };\n\n if (this.dashboard.layoutSettings.parameters && Object.keys(this.dashboard.layoutSettings.parameters).length) {\n _.forEach(this.dashboard.layoutSettings.parameters, (param, name) => {\n let value = param.value;\n if (param.type === 'date' || param.type === 'datetime') {\n if (value && !value.includes('AGO')) {\n value = moment(value).format('YYYY-MM-DD HH:mm:ss');\n }\n }\n\n // Add in the widget specific parameter values if there are any\n if (this.general.widgetParameters && Object.keys(this.general.widgetParameters).length) {\n const widgetParam = _.find(this.general.widgetParameters, {name});\n if (widgetParam && widgetParam.value) {\n value = widgetParam.value;\n }\n }\n\n datasetInstanceSummary.parameterValues[name] = value;\n });\n }\n\n return datasetInstanceSummary;\n }\n}\n","@if (showAlertData) {\n <div class=\"alert-panel\" (click)=\"showAlertData = false\">\n <div class=\"align-center flex-col w-3/4 m-auto\">\n <mat-icon>notification_important</mat-icon>\n <h2 class=\"mb-0\">Alert Notification</h2>\n <p class=\"text-center\">The following alerts have been triggered based on the criteria set for this dashboard\n item...</p>\n @for (alertItem of alertData; track alertItem) {\n <div class=\"alert-item mb-2\"\n [innerHTML]=\"alertItem.notificationMessage\">\n </div>\n }\n </div>\n </div>\n}\n\n<div class=\"item-disabled\">\n <p>{{ general.name || dashboardItemType.label }}</p>\n <mat-icon>block</mat-icon>\n <p class=\"disabled-notice\">{{ dependencies.notice || 'No Data Available' }}</p>\n</div>\n\n@if (dragItem) {\n <span class=\"material-symbols-outlined\">{{ dashboardItemType.icon }}</span>\n <span [innerHTML]=\"dashboardItemType.label\"></span>\n}\n@if (alert) {\n <div class=\"alert-widget\" (click)=\"showAlertData = true;\">\n <button mat-icon-button>\n <mat-icon>notification_important</mat-icon>\n </button>\n <div class=\"alert-summaries\">\n @for (alertItem of alertData; track alertItem) {\n <span class=\"mr-2\">\n {{ alertItem.summaryMessage }}\n </span>\n }\n </div>\n </div>\n}\n\n@if (!dragItem && !dashboardDatasetInstance && !dashboardItemType.headingValue && !dashboardItemType._editing) {\n <button mat-stroked-button color=\"primary\" class=\"config-button\" (click)=\"configure()\">\n Configure {{ dashboardItemType.label }}\n </button>\n}\n\n@if (!dragItem && loadingItem && (chartData || dataset)) {\n <div class=\"absolute top-1 right-1 z-20\">\n <svg class=\"animate-spin h-5 w-5 text-secondary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n}\n\n@if (!viewOnly) {\n @if (!dragItem && this.itemNoMove) {\n <div class=\"absolute top-1 left-1 z-20 cursor-pointer\"\n (click)=\"lockItem()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\n class=\"h-5 w-5 text-gray-400\">\n <path fill-rule=\"evenodd\"\n d=\"M12 1.5a5.25 5.25 0 0 0-5.25 5.25v3a3 3 0 0 0-3 3v6.75a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3v-6.75a3 3 0 0 0-3-3v-3c0-2.9-2.35-5.25-5.25-5.25Zm3.75 8.25v-3a3.75 3.75 0 1 0-7.5 0v3h7.5Z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n }\n @if (!dragItem && !this.itemNoMove) {\n <div class=\"item-unlocked absolute top-1 left-1 z-20 cursor-pointer\"\n (click)=\"lockItem()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\n class=\"h-5 w-5 text-gray-400\">\n <path\n d=\"M18 1.5c2.9 0 5.25 2.35 5.25 5.25v3.75a.75.75 0 0 1-1.5 0V6.75a3.75 3.75 0 1 0-7.5 0v3a3 3 0 0 1 3 3v6.75a3 3 0 0 1-3 3H3.75a3 3 0 0 1-3-3v-6.75a3 3 0 0 1 3-3h9v-3c0-2.9 2.35-5.25 5.25-5.25Z\"/>\n </svg>\n </div>\n }\n}\n\n\n@if (!externalError && !quotaExceeded) {\n @if (!dragItem && loadingItem && !(chartData || dataset)) {\n <div class=\"loading-item\">\n <div class=\"mx-auto flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-full bg-gray-100 \">\n <svg class=\"animate-spin h-14 w-14 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <div class=\"px-4 text-center mt-4\">Loading {{ dashboardItemType.label }} ...</div>\n </div>\n }\n}\n\n@if (externalError) {\n <div class=\"loading-item\">\n <div class=\"mx-auto flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-full bg-red-100 \">\n <svg class=\"h-10 w-10 text-red-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </div>\n <div class=\"px-4 w-3/4 text-center mt-4\">There was a problem loading this item. Please try again later.</div>\n </div>\n}\n\n@if (quotaExceeded) {\n <div class=\"loading-item\">\n <div class=\"mx-auto flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-full bg-blue-100 \">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"h-10 w-10 text-blue-600\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"/>\n </svg>\n </div>\n <div class=\"px-4 w-3/4 text-center mt-4\">{{ quotaExceeded }}</div>\n </div>\n}\n\n@if (!itemLocked) {\n @if (!dragItem) {\n <button mat-mini-fab class=\"edit-widget bg-white text-gray-500 bg-opacity-90\"\n [matMenuTriggerFor]=\"editMenu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #editMenu=\"matMenu\">\n @if (!viewOnly) {\n <button mat-menu-item (click)=\"configure()\">\n <mat-icon>edit</mat-icon>\n Edit Item\n </button>\n @if (existingGridItem) {\n <button mat-menu-item (click)=\"duplicate()\">\n <mat-icon>copy_all</mat-icon>\n Duplicate Item\n </button>\n }\n @if (canExportData) {\n <button mat-menu-item (click)=\"exportData()\">\n <mat-icon>file_download</mat-icon>\n Export Data\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"removeWidget($event)\">\n <mat-icon class=\"text-red-600\">delete</mat-icon>\n Delete Item\n </button>\n }\n @if (viewOnly) {\n @if (canExportData) {\n <button mat-menu-item (click)=\"exportData()\">\n <mat-icon>file_download</mat-icon>\n Export Data\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"editItemAlerts(null)\">\n <mat-icon color=\"primary\">add</mat-icon>\n <span>New Alert</span>\n </button>\n @if (dashboardDatasetInstance) {\n @for (alert of dashboardDatasetInstance.alerts; track alert; let i = $index) {\n <div mat-menu-item class=\"flex items-center justify-between p-0 \"\n [class]=\"{'border border-t border-b-0 border-r-0 border-l-0 border-solid border-gray-200': i === 0}\"\n >\n <div class=\"px-4 flex items-center\" (click)=\"editItemAlerts(alert, i)\">\n <mat-icon>edit</mat-icon>\n <span>{{ alert.title }}</span>\n </div>\n <div class=\"flex items-center\">\n <div class=\"mx-2 divider\"></div>\n <button mat-icon-button (click)=\"removeAlert($event, alert, i)\">\n <mat-icon class=\"mx-2 text-red-600 m-0\">highlight_off</mat-icon>\n </button>\n </div>\n </div>\n }\n }\n }\n </mat-menu>\n }\n}\n\n@if (!dragItem && dashboardItemType.type === 'heading') {\n @if (!dashboardItemType._editing) {\n <div class=\"item-heading\">\n {{ bindParametersInString(dashboardItemType.headingValue) }}\n </div>\n }\n @if (dashboardItemType._editing) {\n <input type=\"text\" [(ngModel)]=\"dashboardItemType.headingValue\"\n (blur)=\"updateHeading($event)\" class=\"w-11/12\">\n }\n}\n\n@if (!dragItem && (chartData || dataset)) {\n @if (general.name) {\n <div class=\"item-title \" [innerHTML]=\"general.evaluatedName\"\n [class]=\"{'pb-4': !general.description, 'pb-2': general.description}\"></div>\n }\n @if (general.description) {\n <div class=\"item-description text-sm\"\n [innerHTML]=\"general.evaluatedDescription\"></div>\n }\n @if (general.widgetParameters && _.values(general.widgetParameters).length) {\n <div class=\"p-2 bg-gray-100 w-full flex flex-wrap\">\n @for (parameter of _.values(general.widgetParameters); track parameter; let i = $index) {\n <label class=\"widget-parameter\">\n {{ parameter.title }}\n <div class=\"parameter-input\">\n @if (parameter.type === 'text') {\n <input type=\"text\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadWidget()\" required autofocus>\n }\n @if (parameter.type === 'numeric') {\n <input type=\"number\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadWidget()\" required autofocus>\n }\n @if (parameter.type === 'date' || parameter.type === 'datetime') {\n @if (!parameter._dateType) {\n <div class=\"flex items-center\">\n <button (click)=\"changeDateType($event, parameter, 'picker')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n Date Picker\n </button>\n <button (click)=\"changeDateType($event, parameter, 'period')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n Time Period\n </button>\n </div>\n }\n @if (parameter._dateType === 'picker') {\n <input [type]=\"parameter.type === 'date' ? 'date' : 'datetime-local'\"\n placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadWidget()\" required autofocus>\n <a (click)=\"changeDateType($event, parameter, 'period')\"\n matTooltip=\"Time Period\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n </a>\n }\n @if (parameter._dateType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-16 mr-2\" min=\"0\" [value]=\"parameter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <select class=\"param-period-picker mr-2\" [value]=\"parameter._period || 'DAYS'\"\n #period\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div>Ago</div>\n </div>\n <a (click)=\"changeDateType($event, parameter, 'picker')\"\n matTooltip=\"Date Picker\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n </a>\n }\n }\n @if (parameter.type === 'boolean') {\n <mat-slide-toggle class=\"pr-4\" color=\"primary\"\n [checked]=\"parameter.value\" (change)=\"booleanUpdate($event, parameter)\"\n required></mat-slide-toggle>\n }\n </div>\n </label>\n }\n </div>\n }\n <div class=\"item-container\" [class]=\"{'flex justify-center': dashboardItemType.type === 'image',\n 'p-px': (dashboardItemType.type === 'table' || general.transparent), 'overflow-hidden': !!chartData,\n 'flex items-center': dashboardItemType.type === 'metric', 'cursor-pointer': (actionItem && Object.keys(actionItem).length)}\"\n (click)=\"(actionItem && Object.keys(actionItem).length) ? callToActionLink(actionItem): null\">\n @if (dashboardItemType.type === 'text' && textData.value) {\n @if (textData.safeTextData) {\n <div class=\"h-full\" [innerHTML]=\"textData.safeTextData\"></div>\n }\n }\n @if (dashboardItemType.type === 'metric') {\n <div class=\"w-full\">\n <dt class=\"text-base font-normal text-gray-900\">{{ metric.title }}</dt>\n <dd class=\"mt-1 flex items-baseline justify-between md:block lg:flex\">\n <div class=\"flex items-baseline text-2xl font-semibold text-indigo-600\">\n {{ metric.mainValue }}\n @if (metric.subMetric) {\n <span\n class=\"ml-2 text-sm font-medium text-gray-500\">from {{ metric.subValue }}\n <span class=\"text-xs\">({{ metric.subTitle }})</span></span>\n }\n </div>\n @if (metric.showSubChange) {\n <div\n class=\"inline-flex items-baseline px-2.5 py-0.5 rounded-full text-sm font-medium md:mt-2 lg:mt-0\"\n [class]=\"{'bg-green-100 text-green-800': metric.mainValue >= metric.subValue, 'bg-red-100 text-red-800': metric.mainValue < metric.subValue}\">\n <!-- Heroicon name: mini/arrow-up -->\n @if (metric.mainValue >= metric.subValue) {\n <svg\n class=\"-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center text-green-500\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M10 17a.75.75 0 01-.75-.75V5.612L5.29 9.77a.75.75 0 01-1.08-1.04l5.25-5.5a.75.75 0 011.08 0l5.25 5.5a.75.75 0 11-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0110 17z\"\n clip-rule=\"evenodd\"/>\n </svg>\n }\n @if (metric.mainValue < metric.subValue) {\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\"\n class=\"-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center text-red-500\">\n <path fill-rule=\"evenodd\"\n d=\"M10 3a.75.75 0 01.75.75v10.638l3.96-4.158a.75.75 0 111.08 1.04l-5.25 5.5a.75.75 0 01-1.08 0l-5.25-5.5a.75.75 0 111.08-1.04l3.96 4.158V3.75A.75.75 0 0110 3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n }\n {{ metric.difference }}\n </div>\n }\n </dd>\n </div>\n }\n @if (dashboardItemType.type === 'network') {\n <div class=\"w-full h-full\" [id]=\"itemInstanceKey + 'VIS'\"></div>\n }\n @if (dashboardItemType.type === 'image') {\n @if (imageData.source) {\n <div class=\"w-auto h-full\">\n <img [src]=\"imageData.source\" alt=\"\"\n (error)=\"imageError = true\">\n </div>\n }\n @if (!imageData.source || imageError) {\n <div class=\"h-full relative flex items-center justify-center\">\n <p class=\"z-10 text-lg\">No image</p>\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"filter blur-sm absolute w-auto h-full text-gray-300\"\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </div>\n }\n }\n @if (dashboardItemType.type === 'pie' || dashboardItemType.type === 'doughnut') {\n @if (chartData) {\n <canvas baseChart style=\"height: 200px\"\n [datasets]=\"chartData\"\n [labels]=\"dashboardItemType.labels\"\n [options]=\"{tooltips: { titleFontSize: 0 }, responsive:true, maintainAspectRatio: false}\"\n [legend]=\"!!dashboardItemType.legend\"\n [type]=\"dashboardItemType.type\"\n [plugins]=\"[]\">\n </canvas>\n }\n }\n @if (dashboardItemType.type === 'line' || dashboardItemType.type === 'bar' || dashboardItemType.type === 'scatter') {\n @if (chartData) {\n <canvas baseChart style=\"height: 200px\"\n [datasets]=\"chartData\"\n [labels]=\"dashboardItemType.labels\"\n [options]=\"{tooltips: { titleFontSize: 0 }, scales: {y: {beginAtZero: dashboardItemType.beginAtZero, max: dashboardItemType.maxValue || null}}, responsive:true, maintainAspectRatio: false}\"\n [legend]=\"!!dashboardItemType.legend\"\n [type]=\"dashboardItemType.type\"\n [plugins]=\"[]\">\n </canvas>\n }\n }\n @if (dashboardItemType.type === 'table') {\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-50 \">\n <tr>\n @for (column of dataset.columns; track column) {\n @if (!hiddenColumns[column.name]) {\n <th scope=\"col\" (click)=\"sortHeader(column)\"\n class=\"cursor-pointer sticky -top-px z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 p-3 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n @if (!tableCells[column.name] || tableCells[column.name].type !== 'action') {\n <div\n class=\"flex items-center \">\n {{ column.title }}\n @if (column.direction === 'asc') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\" class=\"stroke-3 text-secondary ml-1 w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M4.5 10.5L12 3m0 0l7.5 7.5M12 3v18\"/>\n </svg>\n }\n @if (column.direction === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"stroke-3 text-secondary ml-1 w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M19.5 13.5L12 21m0 0l-7.5-7.5M12 21V3\"/>\n </svg>\n }\n </div>\n }\n </th>\n }\n }\n </tr>\n </thead>\n <tbody class=\"bg-white \">\n @for (dataItem of optimise ? dataset.allData.slice(0, 10) : dataset.allData; track dataItem) {\n <tr\n [class]=\"{'hover:bg-gray-50 cursor-pointer ': (tabular.actionRows && tabular.cta)}\"\n (click)=\"(tabular.actionRows && tabular.cta) ? callToActionLink(tabular.cta, dataItem) : null\">\n @for (column of dataset.columns; track column; let i = $index) {\n @if (!hiddenColumns[column.name]) {\n <td\n [title]=\"(tableCells[column.name] && tableCells[column.name].maxWidth) ? dataItem[column.name] : ''\"\n class=\"border-b border-gray-200 px-3 py-2 text-sm text-gray-500 relative\"\n [class]=\"{'whitespace-nowrap': !tabular.expandRows, 'font-medium text-gray-900': i === 0}\"\n [style]=\"{'width': '', 'max-width': (tableCells[column.name] && tableCells[column.name].maxWidth) ? tableCells[column.name].maxWidth + 'px' : null, 'overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'hidden' : null, 'text-overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'ellipsis' : null}\">\n @if (tableCells[column.name] && tableCells[column.name].type === 'action') {\n @if (tableCells[column.name].data.actionEvent) {\n <button type=\"button\"\n [class]=\"{'bg-orange-50 border-orange-200 hover:bg-orange-100': isActionComplete(tableCells[column.name].data.actionEvent, dataItem[column.name])}\"\n (click)=\"triggerActionEvent(tableCells[column.name].data.actionEvent, column, dataItem[column.name])\"\n class=\"text-gray-600 inline-flex items-center rounded border border-primary bg-gray-50 px-2.5 py-1.5 text-xs font-medium hover:bg-gray-100\">\n {{ getActionEventTitle(tableCells[column.name].data.actionEvent, column, dataItem[column.name]) }}\n </button>\n }\n }\n @if (!tableCells[column.name] || tableCells[column.name].type !== 'action') {\n @if (tabular.expandRows) {\n @if (!_.isPlainObject(dataItem[column.name])) {\n <div\n [innerHTML]=\"dataItem[column.name]\"></div>\n }\n @if (_.isPlainObject(dataItem[column.name])) {\n <div\n [innerHTML]=\"dataItem[column.name].cellValue\"></div>\n }\n }\n @if (!tabular.expandRows && _.isPlainObject(dataItem[column.name])) {\n <div [innerHTML]=\"dataItem[column.name].cellValue\"\n [style]=\"{'max-width': (tableCells[column.name] && tableCells[column.name].maxWidth) ? tableCells[column.name].maxWidth + 'px' : null, 'overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'hidden' : null, 'text-overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'ellipsis' : null}\"></div>\n }\n @if (!tabular.expandRows && !_.isPlainObject(dataItem[column.name])) {\n @if (dataItem[column.name] && String(dataItem[column.name]).length <= 100) {\n {{ dataItem[column.name] }}\n }\n @if (dataItem[column.name] && String(dataItem[column.name]).length > 100) {\n <div\n [style]=\"{'max-width': (tableCells[column.name] && tableCells[column.name].maxWidth) ? tableCells[column.name].maxWidth + 'px' : null, 'overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'hidden' : null, 'text-overflow': (tableCells[column.name] && tableCells[column.name].maxWidth) ? 'ellipsis' : null}\"\n [title]=\"dataItem[column.name]\">{{ dataItem[column.name].substring(0, 100) + '...' }}\n </div>\n }\n @if (!dataItem[column.name]) {\n {{ dataItem[column.name] }}\n }\n }\n }\n </td>\n }\n }\n </tr>\n }\n @if (optimise && dataset.allData.length > 10) {\n <tr>\n <td class=\"pl-3 text-gray-900 font-medium bg-gray-200\" [colSpan]=\"dataset.columns.length\">\n Results limited during editing for enhanced performance.\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (!dataset.allData.length) {\n <div\n class=\"no-table-records text-sm text-gray-500 flex m-0 justify-center items-center\">\n No records to show\n </div>\n }\n }\n @if (dashboardItemType.type === 'words') {\n @if (wordCloud.data) {\n <angular-d3-cloud\n [data]=\"wordCloud.data\"\n [width]=\"wordCloud.width\"\n [height]=\"wordCloud.height\"\n [padding]=\"5\"\n font=\"serif\"\n [rotate]=\"0\"\n [autoFill]=\"true\"\n ></angular-d3-cloud>\n }\n }\n </div>\n @if (!optimise && dashboardItemType.type === 'table' && !tabular.hidePager) {\n <div\n class=\"table-pager flex items-center justify-between px-2 border-t border-gray-200 h-12 bg-gray-50 w-full\">\n <div class=\"text-xs text-gray-400\">\n Showing {{ offset + 1 }} - {{ (page * limit) - (limit - dataset.allData.length) }}\n </div>\n <div class=\"flex items-center justify-center\">\n <button mat-icon-button (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1 mx-2\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n }\n @if (general.footer) {\n <div class=\"footer w-full bg-gray-50 px-2 py-1 text-gray-600 border-b border-gray-200 text-xs\"\n [class]=\"{'border-b': callToAction && Object.keys(callToAction).length}\"\n [innerHTML]=\"general.evaluatedFooter\"></div>\n }\n @if (callToAction && Object.keys(callToAction).length) {\n <div class=\"call-to-action w-full bg-gray-50 px-5 py-3\">\n <div class=\"text-sm\">\n <a class=\"font-medium text-cta flex items-center\"\n (click)=\"callToActionLink(callToAction)\">\n {{ callToAction.label }}\n <mat-icon>chevron_right</mat-icon>\n </a>\n </div>\n </div>\n }\n}\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {DashboardService} from '../../../services/dashboard.service';\nimport {ProjectService} from '../../../services/project.service';\n\n@Component({\n selector: 'ki-dashboard-settings',\n templateUrl: './dashboard-settings.component.html',\n styleUrls: ['./dashboard-settings.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class DashboardSettingsComponent implements OnInit {\n\n public dashboard: any;\n public refreshInterval = 0;\n public externalURL: string;\n public apiKeys: any;\n public canManageFeeds = false;\n\n constructor(public dialogRef: MatDialogRef<DashboardSettingsComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dashboardService: DashboardService,\n private projectService: ProjectService) {\n }\n\n ngOnInit(): void {\n this.canManageFeeds = this.projectService.doesActiveProjectHavePrivilege('feedmanage');\n this.dashboard = this.data.dashboard;\n\n if (!this.dashboard.externalSettings || Array.isArray(this.dashboard.externalSettings)) {\n this.dashboard.externalSettings = {};\n }\n\n this.refreshInterval = this.dashboard.externalSettings.refreshInterval || 0;\n }\n\n public setRefreshInterval(interval) {\n this.dashboard.externalSettings.refreshInterval = interval;\n this.refreshInterval = interval;\n }\n\n public async saveSettings() {\n this.dashboardService.saveDashboard(this.dashboard);\n this.dialogRef.close();\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Dashboard Settings</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n\n @if (dashboard) {\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Configure Dashboard</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Edit additional settings for the\n dashboard.</p>\n </div>\n @if (!canManageFeeds) {\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n External Dashboards are only available to our Partners. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (canManageFeeds) {\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n External Dashboard\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\" [(ngModel)]=\"dashboard.external\">\n Make dashboard external\n </mat-checkbox>\n <small class=\"font-normal\">Make this dashboard accessible externally outside of\n DAP.LIVE </small>\n </div>\n @if (dashboard.external) {\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n &nbsp;\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\"\n [(ngModel)]=\"dashboard.externalSettings.darkMode\">\n Set dark mode\n </mat-checkbox>\n </div>\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n &nbsp;\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\"\n [(ngModel)]=\"dashboard.externalSettings.showParameters\">\n Show parameters\n </mat-checkbox>\n <small class=\"font-normal\">Show any top level parameters for this\n dashboard.</small>\n </div>\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n &nbsp;\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n @if (refreshInterval) {\n <div class=\"text-gray-400 text-xs\">\n Refresh dashboard every {{refreshInterval / 60}} Minute(s)\n </div>\n }\n @if (!refreshInterval) {\n <div class=\"text-gray-400 text-xs\">\n Dashboard refresh off\n </div>\n }\n <button mat-flat-button color=\"primary\" class=\"w-3/4\" [matMenuTriggerFor]=\"menu\"\n matTooltip=\"Set refresh interval\">\n <mat-icon>autorenew</mat-icon>\n Set Refresh Interval\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"setRefreshInterval(0)\">Off</button>\n <button mat-menu-item (click)=\"setRefreshInterval(60)\">Every 1 Minute\n </button>\n <button mat-menu-item (click)=\"setRefreshInterval(300)\">Every 5 Minutes\n </button>\n <button mat-menu-item (click)=\"setRefreshInterval(600)\">Every 10 Minutes\n </button>\n <button mat-menu-item (click)=\"setRefreshInterval(1800)\">Every 30 Minutes\n </button>\n <button mat-menu-item (click)=\"setRefreshInterval(3600)\">Every 60 Minutes\n </button>\n </mat-menu>\n <small class=\"font-normal\">Determine how often you would like the dashboard to\n refresh.</small>\n </div>\n }\n </div>\n @if (dashboard.external) {\n <div>\n <div class=\"tracking-wider font-bold\">Example</div>\n <pre class=\"block bg-gray-800 text-gray-100 p-2 rounded whitespace-normal\">{{externalURL}}/external/dashboard/{{dashboard.id}}?apiKey=<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>&apiSecret=<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b></pre>\n </div>\n }\n @if (dashboard.external) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Caching Options\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\"\n [(ngModel)]=\"dashboard.externalSettings.cacheEnabled\">\n Enable API Caching\n </mat-checkbox>\n @if (dashboard.externalSettings.cacheEnabled) {\n <div class=\"flex mt-4\">\n <span\n class=\"inline-flex items-center px-3 rounded-l border border-r-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Cache time in seconds\n </span>\n <input type=\"number\" class=\"w-full rounded-l-none flex-1\"\n placeholder=\"time in seconds\"\n [(ngModel)]=\"dashboard.externalSettings.cacheTimeSeconds\">\n </div>\n }\n <small class=\"font-normal\">Enable caching to reduce requests to the server. Setting\n cache to zero will disable caching.</small>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n\n<div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveSettings()\">Save Settings\n </button>\n</div>\n\n</div>\n","import {\n AfterViewInit,\n ApplicationRef,\n Component,\n ComponentFactoryResolver,\n EmbeddedViewRef,\n HostBinding, HostListener,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport {GridItemHTMLElement, GridStack, GridStackNode} from 'gridstack';\n// THEN to get HTML5 drag&drop\nimport 'gridstack/dist/h5/gridstack-dd-native';\nimport {ItemComponentComponent} from './item-component/item-component.component';\nimport {\n ActivatedRoute,\n Router\n} from '@angular/router';\nimport {DashboardService} from '../../services/dashboard.service';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {\n DatasetAddParameterComponent\n} from '../dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport {AlertService} from '../../services/alert.service';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport moment from 'moment';\nimport {ActionEvent} from '../../objects/action-event';\nimport {\n DashboardSettingsComponent\n} from './dashboard-settings/dashboard-settings.component';\nimport {ComponentCanDeactivate} from '../../../lib/guards/dashboard-changes.guard';\nimport * as sha512 from 'js-sha512' ;\nimport {DatasetService} from '../../services/dataset.service';\n\n@Component({\n selector: 'ki-dashboard-editor',\n templateUrl: './dashboard-editor.component.html',\n styleUrls: ['./dashboard-editor.component.sass'],\n encapsulation: ViewEncapsulation.None,\n standalone: false\n})\nexport class DashboardEditorComponent implements ComponentCanDeactivate, OnInit, AfterViewInit, OnDestroy {\n\n @Input() sidenavService: any;\n @Input() accountId: any;\n @Input() actionEvents: ActionEvent[] = [];\n @Input() dashboardId: number;\n @Input() gridOnly = false;\n @Input() externalURL: string;\n @Input() apiKeys: any;\n\n @ViewChild('viewContainer', {read: ViewContainerRef}) viewContainer: ViewContainerRef;\n\n @HostBinding('class.p-4') get t() {\n return this.dashboard.displaySettings && this.dashboard.displaySettings.fullScreen;\n }\n\n public itemTypes: any = [\n {\n type: 'line',\n label: 'Line Chart',\n icon: 'show_chart',\n width: 4,\n height: 16,\n group: 'Charts'\n },\n {\n type: 'bar',\n label: 'Bar Chart',\n icon: 'bar_chart',\n width: 4,\n height: 16,\n group: 'Charts'\n },\n {\n type: 'pie',\n label: 'Pie Chart',\n icon: 'pie_chart',\n width: 4,\n height: 16,\n group: 'Charts'\n },\n {\n type: 'scatter',\n label: 'Scatter Chart',\n icon: 'scatter_plot',\n width: 4,\n height: 16,\n group: 'Charts'\n },\n {\n type: 'table',\n label: 'Table',\n icon: 'table_chart',\n width: 4,\n height: 20,\n group: 'Data'\n },\n {\n type: 'doughnut',\n label: 'Doughnut',\n icon: 'donut_large',\n width: 4,\n height: 16,\n group: 'Charts'\n },\n {\n type: 'metric',\n label: 'Metric',\n icon: 'trending_up',\n width: 3,\n height: 10,\n group: 'Text'\n },\n {\n type: 'heading',\n label: 'Heading',\n icon: 'text_format',\n width: 4,\n height: 8,\n group: 'Text'\n },\n {\n type: 'text',\n label: 'Template',\n icon: 'code',\n width: 4,\n height: 16,\n group: 'Text'\n },\n {\n type: 'image',\n label: 'Image',\n icon: 'image',\n width: 3,\n height: 20,\n group: 'Images'\n },\n {\n type: 'words',\n label: 'Word Cloud',\n icon: 'crossword',\n width: 3,\n height: 20,\n group: 'Data'\n },\n {\n type: 'network',\n label: 'Network',\n icon: 'hub',\n width: 6,\n height: 20,\n group: 'Charts'\n }\n ];\n public itemTypeGroups: string[] = [];\n public itemTypesByGroup: any = {};\n public dashboard: any = {};\n public activeSidePanel: string = null;\n public _ = _;\n public editDashboardTitle = false;\n public dashboardParameters = new BehaviorSubject(null);\n public darkMode = false;\n public fullScreen = false;\n public admin: boolean;\n public showEditPanel = false;\n public gridSpaces = [\n {\n label: 'Small',\n value: '2px'\n },\n {\n label: 'Medium',\n value: '5px'\n },\n {\n label: 'Large',\n value: '10px'\n }\n ];\n public clonedDashboard: any;\n public grid: GridStack;\n public optimise = true;\n public optimiseSubject = new Subject<boolean>();\n\n private queryParams: any = {};\n private routeURL: string;\n private initialGrid: any;\n private itemComponents: ItemComponentComponent[] = [];\n private dashboardHash: string;\n private dashboardClone: any;\n private unsavedChanges = true;\n\n public static myClone(event) {\n return event.target.cloneNode(true);\n }\n\n @HostListener('window:beforeunload')\n canDeactivate(): Observable<boolean> | boolean {\n // insert logic to check if there are pending changes here;\n // returning true will navigate without confirmation\n // returning false will show a confirm dialog before navigating away\n return !this.unsavedChanges;\n }\n\n constructor(private componentFactoryResolver: ComponentFactoryResolver,\n private applicationRef: ApplicationRef,\n private injector: Injector,\n private route: ActivatedRoute,\n private dashboardService: DashboardService,\n private dialog: MatDialog,\n private snackBar: MatSnackBar,\n private router: Router,\n private alertService: AlertService,\n private datasetService: DatasetService) {\n }\n\n ngOnInit(): void {\n this.routeURL = _.filter(this.router.url.split('/'))[0];\n this.route.queryParams.subscribe(params => {\n const cloned = _.clone(params);\n this.admin = !!cloned.a;\n delete cloned.a;\n this.queryParams = cloned;\n });\n\n this.itemTypeGroups = _(this.itemTypes)\n .map('group')\n .uniq()\n .sortBy()\n .valueOf();\n\n this.itemTypeGroups.forEach(group => {\n this.itemTypesByGroup[group] = _.filter(this.itemTypes, {group});\n });\n }\n\n async ngAfterViewInit() {\n const options = {\n minRow: 1, // don't collapse when empty\n float: false,\n cellHeight: 20,\n minW: 768,\n disableOneColumnMode: false,\n dragIn: '.draggable-toolbar .grid-stack-item', // add draggable to class\n dragInOptions: {\n revert: 'invalid',\n scroll: false,\n appendTo: 'body',\n helper: DashboardEditorComponent.myClone\n },\n acceptWidgets: (el) => {\n el.className += ' grid-stack-item';\n return true;\n }\n };\n this.grid = GridStack.init(options);\n\n this.grid.on('added', async (event: Event, newItems: GridStackNode[]) => {\n for (const item of newItems) {\n let dashboardItemType = null;\n let itemElement: any = item.el.firstChild;\n let instanceId = null;\n\n if (item.content) {\n itemElement = document.createRange().createContextualFragment(item.content);\n dashboardItemType = itemElement.firstChild.dataset.dashboardItemType ?\n JSON.parse(itemElement.firstChild.dataset.dashboardItemType) : null;\n\n instanceId = itemElement.firstChild.id;\n }\n\n while (item.el.firstChild.firstChild) {\n item.el.firstChild.firstChild.remove();\n }\n\n await this.addComponentToGridItem(item.el.firstChild, instanceId,\n dashboardItemType || _.clone(this.itemTypesByGroup[item.el.dataset.group][item.el.dataset.index]), !!dashboardItemType);\n }\n\n if (this.dashboard.displaySettings.inset) {\n this.updateGridSpacing(this.dashboard.displaySettings.inset, false);\n }\n });\n\n const dashboardId = this.dashboardId || this.route.snapshot.params.dashboard;\n const routeData: any = this.route.snapshot.data;\n const editType = routeData ? routeData.type : null;\n\n if (editType === 'copy') {\n this.dashboard = await this.dashboardService.copyDashboard(dashboardId);\n this.dashboard.title = this.dashboard.title + ' copy';\n } else if (editType === 'extend') {\n this.dashboard = await this.dashboardService.extendDashboard(dashboardId);\n } else {\n this.dashboard = await this.dashboardService.getDashboard(dashboardId);\n }\n\n if (!this.dashboard.title) {\n this.dashboard.title = 'New Dashboard';\n this.editDashboardTitle = true;\n }\n\n if (this.dashboard.layoutSettings?.parameters && Object.keys(this.dashboard.layoutSettings.parameters).length) {\n _.forEach(this.dashboard.layoutSettings.parameters, param => {\n if (param.type === 'list') {\n param.list = [];\n this.loadListParameters(param);\n }\n });\n }\n\n // If we have any query params, check if they match any set out in the dashboard\n Object.keys(this.queryParams).forEach(key => {\n if (Object.keys(this.dashboard.layoutSettings.parameters).length) {\n if (this.dashboard.layoutSettings.parameters[key]) {\n if (this.dashboard.layoutSettings.parameters[key].type === 'date' ||\n this.dashboard.layoutSettings.parameters[key].type === 'datetime') {\n this.queryParams[key] = moment(this.queryParams[key]).format('YYYY-MM-DDTHH:mm');\n }\n this.dashboard.layoutSettings.parameters[key].value = this.queryParams[key];\n }\n }\n\n this.dashboard.datasetInstances.forEach(instance => {\n if (!_.values(instance.parameterValues).length) {\n instance.parameterValues = {};\n }\n instance.parameterValues[key] = this.queryParams[key];\n });\n });\n\n if (this.dashboard.displaySettings && (this.dashboard.displaySettings.length || Object.keys(this.dashboard.displaySettings).length)) {\n this.darkMode = !!this.dashboard.displaySettings.darkMode;\n this.optimise = this.dashboard.displaySettings.optimise !== undefined ? this.dashboard.displaySettings.optimise : true;\n this.setDarkModeOnBody();\n if (this.dashboard.displaySettings.fullScreen) {\n this.openFullScreen();\n this.fullScreen = true;\n }\n } else {\n this.dashboard.displaySettings = {};\n }\n if (this.dashboard.layoutSettings) {\n if (this.dashboard.layoutSettings.grid && this.dashboard.layoutSettings.grid.length) {\n this.grid.load(this.dashboard.layoutSettings.grid);\n }\n } else {\n this.dashboard.layoutSettings = {};\n }\n\n setTimeout(() => {\n this.showEditPanel = true;\n this.sidenavService.close();\n }, 0);\n }\n\n ngOnDestroy() {\n document.body.classList.remove('dark');\n this.sidenavService.open();\n }\n\n public booleanUpdate(event, parameter) {\n parameter.value = event.checked;\n this.reloadDashboard();\n }\n\n public togglePerformance() {\n this.optimise = !this.optimise;\n\n setTimeout(() => {\n this.dashboard.displaySettings.optimise = this.optimise;\n this.optimiseSubject.next(this.optimise);\n }, 0);\n\n }\n\n public changeDateType(event, parameter, value) {\n event.stopPropagation();\n event.preventDefault();\n parameter._dateType = value;\n }\n\n public updatePeriodValue(value, period, parameter) {\n parameter.value = `${value}_${period}_AGO`;\n }\n\n public editDashboardItems() {\n this.showEditPanel = !this.showEditPanel;\n if (this.showEditPanel) {\n this.sidenavService.close();\n } else {\n this.sidenavService.open();\n }\n }\n\n public openSettings() {\n const dialogRef = this.dialog.open(DashboardSettingsComponent, {\n width: '800px',\n height: '800px',\n data: {\n dashboard: this.dashboard\n }\n });\n }\n\n public openFullScreen() {\n this.save(false).then(() => {\n window.location.href = `/dashboards/${this.dashboard.id}/full${this.admin ? '?a=true&' : '?'}`;\n });\n }\n\n public updateGridSpacing(space, save = true) {\n this.dashboard.displaySettings.inset = space;\n document.querySelectorAll('.grid-stack-item-content')\n .forEach((el: any) => el.style.inset = space);\n }\n\n public toggleNotifications() {\n this.dashboard.alertsEnabled = !this.dashboard.alertsEnabled;\n this.reloadDashboard();\n }\n\n public async reloadDashboard() {\n for (const item of this.itemComponents) {\n if (item.dashboardDatasetInstance) {\n await item.init(true);\n }\n }\n }\n\n public addParameter(existingParameter?, parameterValueIndex?) {\n let clonedParameter = null;\n if (existingParameter) {\n clonedParameter = _.clone(existingParameter);\n }\n const dialogRef = this.dialog.open(DatasetAddParameterComponent, {\n width: '750px',\n height: '850px',\n data: {\n parameter: clonedParameter\n }\n });\n dialogRef.afterClosed().subscribe(parameter => {\n if (parameter) {\n if (!this.dashboard.layoutSettings) {\n this.dashboard.layoutSettings = {};\n }\n if (!this.dashboard.layoutSettings.parameters) {\n this.dashboard.layoutSettings.parameters = {};\n }\n if (!clonedParameter) {\n parameter.value = parameter.defaultValue || '';\n } else {\n if (!clonedParameter.value) {\n parameter.value = parameter.defaultValue || '';\n }\n }\n\n if (parameter.type === 'list') {\n this.loadListParameters(parameter);\n }\n\n this.dashboard.layoutSettings.parameters[parameter.name] = parameter;\n }\n });\n }\n\n public removeParameter(parameter) {\n const message = 'Are you sure you would like to remove this parameter. This may cause some dashboard items ' +\n 'to fail.';\n if (window.confirm(message)) {\n delete this.dashboard.layoutSettings.parameters[parameter.name];\n }\n }\n\n public async loadListParameters(parameter: any) {\n if (parameter.settings && parameter.settings.datasetInstance) {\n return this.datasetService.evaluateDataset(parameter.settings.datasetInstance, '0', '100000')\n .then((data: any) => {\n const list = _.map(data.allData, item => {\n return {label: item[parameter.settings.labelColumn], value: item[parameter.settings.valueColumn]};\n });\n parameter.list = _.uniqWith(list, _.isEqual);\n });\n }\n }\n\n public save(showSaved = true) {\n for (const networkData of _.values(this.dashboard.layoutSettings.networkData)) {\n if (networkData.network) {\n const nodes = {};\n networkData.network.storePositions();\n for (const nodeKey of Object.keys(networkData.network.body.nodes)) {\n nodes[nodeKey] = {\n x: networkData.network.body.nodes[nodeKey].x,\n y: networkData.network.body.nodes[nodeKey].y,\n };\n }\n\n networkData.nodes = nodes;\n delete networkData.network;\n }\n }\n\n this.dashboard.layoutSettings.grid = this.grid.save(true);\n this.dashboard.layoutSettings.grid.forEach(gridItem => {\n const itemElement = document.createRange().createContextualFragment(gridItem.content);\n try {\n itemElement.children.item(0).innerHTML = '';\n } catch (e) {\n }\n gridItem.content = itemElement.children.item(0).outerHTML;\n });\n\n this.dashboard.datasetInstances = _.filter(this.dashboard.datasetInstances);\n\n return this.dashboardService.saveDashboard(this.dashboard, this.accountId).then((dashboardId) => {\n if (showSaved) {\n this.snackBar.open('Dashboard successfully saved.', 'Close', {\n verticalPosition: 'top',\n duration: 3000\n });\n }\n if (!this.dashboard.id) {\n this.unsavedChanges = false;\n window.location.href = `/${this.routeURL}/${dashboardId}${this.admin ? '?a=true' : ''}`;\n }\n return this.dashboard;\n });\n }\n\n private async addComponentToGridItem(element, instanceId?, dashboardItemType?, load?) {\n if (!this.dashboard.layoutSettings) {\n this.dashboard.layoutSettings = {};\n }\n if (!this.dashboard.displaySettings) {\n this.dashboard.displaySettings = {};\n }\n // create a component reference\n const componentRef = this.componentFactoryResolver.resolveComponentFactory(ItemComponentComponent)\n .create(this.injector);\n\n // get DOM element from component\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n domElem.dataset.dashboardItemType = JSON.stringify(dashboardItemType || {});\n\n element.appendChild(domElem);\n\n element.firstChild.id = instanceId ? instanceId : 'i' + Date.now().toString();\n instanceId = element.firstChild.id;\n\n componentRef.instance.admin = this.admin;\n componentRef.instance.grid = this.grid;\n componentRef.instance.dashboard = this.dashboard;\n componentRef.instance.actionEvents = this.actionEvents;\n componentRef.instance.optimiseSubject = this.optimiseSubject;\n componentRef.instance.optimise = this.optimise;\n\n const chartDetails = this.dashboard.layoutSettings.charts ? this.dashboard.layoutSettings.charts[instanceId] : null;\n\n componentRef.instance.dashboardDatasetInstance = _.find(this.dashboard.datasetInstances, {instanceKey: instanceId}) || null;\n componentRef.instance.dashboardItemType = chartDetails || (dashboardItemType || {});\n componentRef.instance.itemInstanceKey = instanceId;\n componentRef.instance.configureClass = !load;\n await componentRef.instance.init();\n if (load) {\n if (this.dashboard.layoutSettings.dependencies) {\n const dependencies = this.dashboard.layoutSettings.dependencies[instanceId] || {};\n if (!dependencies.instanceKeys || !dependencies.instanceKeys.length) {\n componentRef.instance.load();\n }\n } else {\n componentRef.instance.load();\n }\n }\n\n // attach component to the appRef so that it will be dirty checked.\n this.applicationRef.attachView(componentRef.hostView);\n\n const generalSettings = this.dashboard.layoutSettings.general ? this.dashboard.layoutSettings.general[instanceId] : null;\n if (generalSettings && generalSettings.transparent) {\n element.classList.add('bg-transparent');\n element.classList.remove('bg-white', 'shadow');\n } else {\n element.classList.add('bg-white', 'shadow');\n element.classList.remove('bg-transparent');\n }\n\n this.itemComponents.push(componentRef.instance);\n\n componentRef.instance.duplicateItem.subscribe(instanceKey => {\n const newInstanceKey = 'i' + Date.now().toString();\n const existingGrid = _.find(this.dashboard.layoutSettings.grid, item => {\n return item.content.includes(instanceKey);\n });\n if (existingGrid) {\n const existingDatasourceInstance = _.find(this.dashboard.datasetInstances, {instanceKey});\n const newDatasourceInstance = _.cloneDeep(existingDatasourceInstance);\n newDatasourceInstance.instanceKey = newInstanceKey;\n this.dashboard.datasetInstances.push(newDatasourceInstance);\n\n _.forEach(this.dashboard.layoutSettings, (item: any, key: string) => {\n if (key !== 'grid' && item[instanceKey]) {\n item[newInstanceKey] = _.cloneDeep(item[instanceKey]);\n }\n });\n\n const newElement = document.createElement('ki-item-component');\n newElement.id = newInstanceKey;\n newElement.dataset.dashboardItemType = JSON.stringify(dashboardItemType || {});\n this.grid.addWidget({\n w: existingGrid ? existingGrid.w : 3,\n h: existingGrid ? existingGrid.h : 3,\n x: existingGrid ? existingGrid.x : 0,\n y: existingGrid ? existingGrid.y : 0,\n content: newElement.outerHTML\n });\n }\n\n });\n\n return componentRef;\n }\n\n private setDarkModeOnBody() {\n if (this.darkMode) {\n document.body.classList.add('dark');\n } else {\n document.body.classList.remove('dark');\n }\n }\n\n}\n\n","@if (true) {\n <div class=\"align-center justify-between flex-wrap bg-white px-2 border-b border-gray-200\">\n @if (editDashboardTitle) {\n <div class=\"align-center ml-2\">\n <input type=\"text\" class=\"title-input py-1.5\" placeholder=\"Enter dashboard title\"\n [(ngModel)]=\"dashboard.title\"\n [class]=\"{'border-red-600': !dashboard.title || dashboard.title === 'New Dashboard'}\">&nbsp;\n </div>\n }\n @if (!editDashboardTitle) {\n <div class=\"align-center ml-2\">\n <h2 class=\"dashboard-title\">{{ dashboard.title }}</h2>&nbsp;\n <button mat-icon-button (click)=\"editDashboardTitle = true;\">\n <span class=\"material-symbols-outlined\">edit</span>\n </button>\n </div>\n }\n <div class=\"data-actions\">\n @if (admin) {\n <mat-radio-group class=\"dashboard-operations flex items-center text-sm\"\n aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Shared</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Private</mat-radio-button>\n </mat-radio-group>\n }\n @if (admin) {\n <div class=\"divider\"></div>\n }\n <button matTooltip=\"Toggle setting to enable/remove results limit\" (click)=\"togglePerformance()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n @if (optimise) {\n <span class=\"text-xl material-symbols-outlined\">check_circle</span>\n }\n @if (!optimise) {\n <span class=\"text-xl material-symbols-outlined\">unpublished</span>\n }\n optimise\n </button>\n <button matTooltip=\"Edit dashboard settings\" (click)=\"openSettings()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">tune</span>\n settings\n </button>\n <button (click)=\"toggleNotifications()\" matTooltip=\"Edit default notification group\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n @if (!dashboard.alertsEnabled) {\n <span class=\"material-symbols-outlined text-xl\"\n title=\"Notifications for this dashboard are now off. Press to toggle on.\">notifications_off\n </span>\n }\n @if (dashboard.alertsEnabled) {\n <span class=\"material-symbols-outlined text-xl\"\n title=\"Notifications for this dashboard are on. Press to toggle off.\">notifications_active\n </span>\n }\n notifications\n </button>\n <button [matMenuTriggerFor]=\"spacingMenu\" matTooltip=\"Set dashboard item spacing\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">grid_view</span>\n spacing\n </button>\n <mat-menu #spacingMenu=\"matMenu\">\n @for (space of gridSpaces; track space) {\n <button mat-menu-item (click)=\"updateGridSpacing(space.value)\">\n {{ space.label }}\n </button>\n }\n </mat-menu>\n <button (click)=\"openFullScreen()\" matTooltip=\"View full screen\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">fullscreen</span>\n full screen\n </button>\n <button (click)=\"editDashboardItems()\" matTooltip=\"Show/hide dashboard widget panel\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">widgets</span>\n widgets\n </button>\n <div class=\"divider\"></div>\n <button (click)=\"reloadDashboard()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">sync</span>\n reload\n </button>\n <button (click)=\"save()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <span class=\"material-symbols-outlined text-xl\">save</span>\n save\n </button>\n </div>\n </div>\n @if (dashboard.layoutSettings) {\n <div class=\"dashboard-parameters flex-wrap bg-gray-50 px-4 py-0.5 border-b border-gray-200\">\n <div class=\"list-title\">\n Parameters\n </div>\n @for (parameter of _.values(dashboard.layoutSettings.parameters); track parameter; let i = $index) {\n <label>\n {{ parameter.title }}\n <div class=\"parameter-input\">\n @if (parameter.type === 'text') {\n <input type=\"text\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n }\n @if (parameter.type === 'numeric') {\n <input type=\"number\" placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n }\n @if (parameter.type === 'list') {\n <select class=\"pr-8 py-1.5 pl-1\" [(ngModel)]=\"parameter.value\"\n (change)=\"reloadDashboard()\" required autofocus>\n @for (item of parameter.list; track item) {\n <option [value]=\"item.value\">{{ item.label }}</option>\n }\n </select>\n }\n @if (parameter.type === 'date' || parameter.type === 'datetime') {\n @if (!parameter._dateType) {\n <div class=\"flex items-center\">\n <button (click)=\"changeDateType($event, parameter, 'picker')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded mr-2 bg-white flex items-center\">\n <span class=\"material-symbols-outlined text-base mx-1\">calendar_month</span>\n Date Picker\n </button>\n <button (click)=\"changeDateType($event, parameter, 'period')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded bg-white flex items-center\">\n <span class=\"material-symbols-outlined text-base mx-1\">restore</span>\n Time Period\n </button>\n </div>\n }\n @if (parameter._dateType === 'picker') {\n <input [type]=\"parameter.type === 'date' ? 'date' : 'datetime-local'\"\n placeholder=\"Enter {{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n <a (click)=\"changeDateType($event, parameter, 'period')\"\n matTooltip=\"Time Period\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <span class=\"material-symbols-outlined text-base ml-1.5 mr-1\">restore</span>\n </a>\n }\n @if (parameter._dateType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-16 mr-2\" min=\"0\" [value]=\"parameter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <select class=\"param-period-picker mr-2\" [value]=\"parameter._period || 'DAYS'\"\n #period\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div>Ago</div>\n </div>\n <a (click)=\"changeDateType($event, parameter, 'picker')\"\n matTooltip=\"Date Picker\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <span class=\"material-symbols-outlined text-base\">calendar_month</span>\n </a>\n }\n }\n @if (parameter.type === 'boolean') {\n <mat-slide-toggle class=\"pr-4\" color=\"primary\"\n [checked]=\"parameter.value\" (change)=\"booleanUpdate($event, parameter)\"\n required></mat-slide-toggle>\n }\n @if (!parameter._locked) {\n <button mat-icon-button [matMenuTriggerFor]=\"paramMenu\">\n <span class=\"material-symbols-outlined\">settings</span>\n </button>\n <mat-menu #paramMenu=\"matMenu\">\n <button mat-menu-item (click)=\"addParameter(parameter, i)\">Edit Parameter</button>\n <button mat-menu-item (click)=\"removeParameter(parameter)\">Remove Parameter</button>\n </mat-menu>\n }\n </div>\n </label>\n @if (_.values(dashboard.layoutSettings.parameters).length) {\n <div class=\"divider ml-2\"></div>\n }\n }\n <button mat-icon-button color=\"primary\" class=\"mx-2\" (click)=\"addParameter()\">\n <span class=\"material-symbols-outlined\">add_circle</span>\n </button>\n @if (_.values(dashboard.layoutSettings.parameters).length) {\n <button mat-flat-button color=\"primary\" class=\"mr-2 leading-8\"\n (click)=\"reloadDashboard()\">\n Apply Parameters\n </button>\n }\n </div>\n }\n}\n<div class=\"grid-container flex justify-between\">\n <div class=\"grid-stack flex-1 h-full\"></div>\n <div class=\"right-panel bg-transparent\" [class]=\"{show: showEditPanel}\">\n <div class=\"flex items-center justify-between border-b mb-4\">\n <div class=\"pl-4 available-widgets\">Available Widgets</div>\n <button mat-icon-button color=\"primary\" (click)=\"editDashboardItems()\">\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </div>\n @for (group of itemTypeGroups; track group; let j = $index) {\n <div class=\"pl-4 uppercase text-xs text-gray-600 tracking-wider\">{{ group }}</div>\n <div class=\"draggable-toolbar\">\n @for (item of itemTypesByGroup[group]; track item; let i = $index) {\n <div class=\"grid-stack-item ui-draggable\" [attr.gs-w]=\"item.width\"\n [attr.gs-h]=\"item.height\" [attr.data-index]=\"i\" [attr.data-group]=\"group\">\n <div class=\"grid-stack-item-content shadow\" draggable=\"true\">\n <ki-item-component class=\"p-0 justify-center text-sm\" [dragItem]=\"true\"\n [dashboardItemType]=\"item\"></ki-item-component>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n</div>\n\n","import {Component, Input, OnInit, Output, EventEmitter, ViewChild} from '@angular/core';\nimport * as lodash from 'lodash';\nimport {NgForm} from '@angular/forms';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-task-time-periods',\n templateUrl: './task-time-periods.component.html',\n styleUrls: ['./task-time-periods.component.sass'],\n standalone: false\n})\nexport class TaskTimePeriodsComponent implements OnInit {\n\n @ViewChild('timeForm') timeForm: NgForm;\n\n @Input() taskTimePeriods: any = [];\n @Input() showTitle = true;\n\n @Output() taskTimePeriodsChange = new EventEmitter();\n\n public showNewTaskTimePeriod = false;\n public newTaskTimePeriod: any = {};\n public _ = _;\n public Object = Object;\n\n\n constructor() {\n }\n\n ngOnInit(): void {\n }\n\n public addScheduleTime() {\n this.showNewTaskTimePeriod = true;\n }\n\n public addTimePeriod() {\n this.taskTimePeriods.push(this.newTaskTimePeriod);\n this.showNewTaskTimePeriod = false;\n this.newTaskTimePeriod = {};\n this.taskTimePeriodsChange.next(this.taskTimePeriods);\n }\n\n public removeTime(index) {\n this.taskTimePeriods.splice(index, 1);\n if (!this.taskTimePeriods.length) {\n this.showNewTaskTimePeriod = true;\n this.newTaskTimePeriod = {};\n }\n }\n}\n","@if (showTitle) {\n <p><b>Time Periods</b></p>\n}\n\n@for (time of taskTimePeriods; track time; let i = $index) {\n <div class=\"time-period\">\n <div class=\"align-center justify-between\">\n <div>\n @for (key of Object.keys(time); track key) {\n @if (key !== 'id' && time[key]) {\n <span class=\"mr-2\"><span class=\"capitalize\"><b>{{_.startCase(key)}}:</b></span>&nbsp;<span>{{time[key]}}</span></span>\n }\n }\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeTime(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </div>\n}\n\n<button mat-button color=\"primary\" (click)=\"addScheduleTime()\">\n <mat-icon>more_time</mat-icon>&nbsp;Add scheduled time\n</button>\n\n@if (showNewTaskTimePeriod) {\n <div class=\"w-full bg-gray-50 p-4 mt-4\">\n <div class=\"mb-2 text-xs \">Enter the frequency for the desired time period then click\n <span class=\"font-medium\">Save time period</span></div>\n <form #timeForm=\"ngForm\" class=\"w-1/2\">\n <label class=\"mb-4\">\n Frequency\n <mat-select #frequency=\"ngModel\" [class]=\"{'border-red-600': frequency.invalid}\"\n [(ngModel)]=\"newTaskTimePeriod.frequency\" name=\"frequency\" required>\n <mat-option value=\"Monthly\">Monthly</mat-option>\n <mat-option value=\"Weekly\">Weekly</mat-option>\n <mat-option value=\"Daily\">Daily</mat-option>\n <mat-option value=\"Hourly\">Hourly</mat-option>\n </mat-select>\n </label>\n @if (['Monthly'].indexOf(newTaskTimePeriod.frequency) > -1) {\n <label class=\"mb-4\">\n Day of month\n <mat-select #month=\"ngModel\" [class]=\"{'border-red-600': month.invalid}\"\n [(ngModel)]=\"newTaskTimePeriod.dayInMonth\" name=\"month\" required>\n @for (day of _.range(1, 29); track day) {\n <mat-option [value]=\"day\">\n {{day}}\n </mat-option>\n }\n </mat-select>\n </label>\n }\n @if (['Weekly'].indexOf(newTaskTimePeriod.frequency) > -1) {\n <label class=\"mb-4\">\n Day of week\n <mat-select #week=\"ngModel\" [class]=\"{'border-red-600': week.invalid}\"\n [(ngModel)]=\"newTaskTimePeriod.dayOfWeek\" name=\"week\" required>\n <mat-option [value]=\"1\">Monday</mat-option>\n <mat-option [value]=\"2\">Tuesday</mat-option>\n <mat-option [value]=\"3\">Wednesday</mat-option>\n <mat-option [value]=\"4\">Thursday</mat-option>\n <mat-option [value]=\"5\">Friday</mat-option>\n <mat-option [value]=\"6\">Saturday</mat-option>\n <mat-option [value]=\"7\">Sunday</mat-option>\n </mat-select>\n </label>\n }\n @if (['Monthly', 'Weekly', 'Daily'].indexOf(newTaskTimePeriod.frequency) > -1) {\n <label class=\"mb-4\"\n >\n Hour\n <mat-select #hour=\"ngModel\" [class]=\"{'border-red-600': hour.invalid}\"\n [(ngModel)]=\"newTaskTimePeriod.hour\" name=\"hour\" required>\n @for (hour of _.range(0, 24); track hour) {\n <mat-option [value]=\"hour < 10 ? '0' + hour : hour\">\n {{hour < 10 ? '0' + hour : hour}}\n </mat-option>\n }\n </mat-select>\n </label>\n }\n @if (['Monthly', 'Weekly', 'Daily', 'Hourly'].indexOf(newTaskTimePeriod.frequency) > -1) {\n <label class=\"mb-4\"\n >\n Minute\n <mat-select #minute=\"ngModel\" [class]=\"{'border-red-600': minute.invalid}\"\n [(ngModel)]=\"newTaskTimePeriod.minute\" name=\"minute\" required>\n @for (minute of _.range(0, 60); track minute) {\n <mat-option [value]=\"minute < 10 ? '0' + minute : minute\">\n {{minute < 10 ? '0' + minute : minute}}\n </mat-option>\n }\n </mat-select>\n </label>\n }\n <div class=\"align-center justify-between\">\n <div></div>\n <button mat-flat-button color=\"primary\" (click)=\"addTimePeriod()\"\n [disabled]=\"timeForm.invalid\">Save time period\n </button>\n </div>\n </form>\n </div>\n }\n","import {Component, Inject, OnInit, ViewChild} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {DatasetService} from '../../../services/dataset.service';\nimport * as lodash from 'lodash';\nimport {MatSelect} from '@angular/material/select';\nimport {MatOption} from '@angular/material/core';\nimport {TaskTimePeriodsComponent} from '../../task-time-periods/task-time-periods.component';\nimport {NgForm, NgModel} from '@angular/forms';\nimport {DataProcessorService} from '../../../services/data-processor.service';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-snapshot-profile-dialog',\n templateUrl: './snapshot-profile-dialog.component.html',\n styleUrls: ['./snapshot-profile-dialog.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class SnapshotProfileDialogComponent implements OnInit {\n\n @ViewChild('selectKeyFields') selectKeyFields: MatSelect;\n @ViewChild('timePeriods') timePeriods: TaskTimePeriodsComponent;\n @ViewChild('timeLapseForm') timeLapseForm: NgForm;\n @ViewChild('selectModel') selectModel: NgModel;\n\n public snapshot: any;\n public columns: any = [];\n public newTimeLapse: any;\n public _ = _;\n public defaultOffsets = [\n {\n label: '1 Day Ago',\n value: 1\n },\n {\n label: '7 Days Ago',\n value: 7\n },\n {\n label: '30 Days Ago',\n value: 30\n },\n {\n label: '90 Days Ago',\n value: 90\n }\n ];\n public allSelected = false;\n public parameters: any = [];\n\n private datasetInstanceId;\n\n constructor(public dialogRef: MatDialogRef<SnapshotProfileDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasetService: DatasetService,\n private dataProcessorService: DataProcessorService) {\n }\n\n async ngOnInit() {\n this.columns = this.data.columns || [];\n\n this.snapshot = this.data.snapshot || {\n type: 'tabulardatasetsnapshot',\n taskTimePeriods: [],\n trigger: 'scheduled',\n config: {\n keyFieldNames: [],\n timeLapsedFields: [],\n createHistory: true,\n createLatest: true,\n indexes: [],\n parameterValues: {},\n readChunkSize: 50000\n }\n };\n\n if (!this.snapshot.config.indexes) {\n this.snapshot.config.indexes = [];\n }\n\n if (!this.snapshot.config.parameterValues || Array.isArray(this.snapshot.config.parameterValues)) {\n this.snapshot.config.parameterValues = {};\n }\n\n this.datasetInstanceId = this.data.datasetInstanceId || null;\n\n this.snapshot.relatedObjectType = 'DatasetInstance';\n this.snapshot.relatedObjectPrimaryKey = this.datasetInstanceId;\n\n if (this.data.datasetInstance) {\n this.parameters = await this.datasetService.getEvaluatedParameters(this.data.datasetInstance);\n _.forEach(this.parameters, parameter => {\n if (parameter.type === 'list') {\n this.loadListParameters(parameter);\n }\n this.snapshot.config.parameterValues[parameter.name] = (this.snapshot.config.parameterValues[parameter.name] || parameter.defaultValue) || '';\n });\n }\n\n if (!this.columns.length && this.datasetInstanceId) {\n const dataset = await this.datasetService.getDataset(this.datasetInstanceId);\n const res: any = await this.datasetService.evaluateDataset(dataset);\n this.columns = res.columns;\n }\n }\n\n public async loadListParameters(parameter: any) {\n if (parameter.settings && parameter.settings.datasetInstance) {\n return this.datasetService.evaluateDataset(parameter.settings.datasetInstance, '0', '100000')\n .then((data: any) => {\n const list = _.map(data.allData, item => {\n return {label: item[parameter.settings.labelColumn], value: item[parameter.settings.valueColumn]};\n });\n parameter.list = _.uniqWith(list, _.isEqual);\n });\n }\n }\n\n public removeIndex(index: number) {\n const message = 'Are you sure you would like to remove this Index?';\n if (window.confirm(message)) {\n this.snapshot.config.indexes.splice(index, 1);\n }\n }\n\n public selectAll(event) {\n event.preventDefault();\n this.allSelected = !this.allSelected;\n this.toggleAllSelection();\n }\n\n public toggleAllSelection() {\n if (this.allSelected) {\n this.selectKeyFields.options.forEach((item: MatOption) => item.select());\n } else {\n this.selectKeyFields.options.forEach((item: MatOption) => item.deselect());\n }\n }\n\n public keyFieldClick() {\n let newStatus = true;\n this.selectKeyFields.options.forEach((item: MatOption) => {\n if (!item.selected) {\n newStatus = false;\n }\n });\n this.allSelected = newStatus;\n }\n\n public updateCreateHistory(value) {\n if (value) {\n this.snapshot.config.createLatest = true;\n }\n }\n\n public removeTimeLapsedField(index) {\n const message = 'Are you sure you would like to remove this snapshot profile?';\n if (window.confirm(message)) {\n this.snapshot.config.timeLapsedFields.splice(index, 1);\n }\n }\n\n public addTimeLapsedField() {\n this.newTimeLapse = {};\n }\n\n public saveTimeLapse() {\n const cloned = _.clone(this.newTimeLapse);\n this.newTimeLapse = null;\n const customIndex = cloned.dayOffsets.indexOf('CUSTOM');\n if (customIndex > -1) {\n cloned.dayOffsets.splice(customIndex);\n cloned.dayOffsets.push(cloned.customDayOffsets);\n delete cloned.customDayOffsets;\n }\n\n this.snapshot.config.timeLapsedFields.push(cloned);\n }\n\n public async saveSnapshot() {\n if (this.timePeriods && this.timePeriods.timeForm && this.timePeriods.timeForm.valid) {\n this.timePeriods.addTimePeriod();\n }\n\n if (this.timeLapseForm && this.timeLapseForm.valid) {\n this.saveTimeLapse();\n }\n\n setTimeout(async () => {\n if (this.selectModel.valid) {\n await this.dataProcessorService.saveProcessor(this.snapshot);\n this.dialogRef.close(true);\n }\n }, 0);\n }\n\n protected readonly Object = Object;\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Snapshot Profile</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n @if (snapshot) {\n <div class=\"dialog-content\">\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Create a snapshot profile</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Enter the following information in order to\n configure your snapshot.</p>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Title<span class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" #snapshotTitle=\"ngModel\"\n [class]=\"{'border border-red-600': snapshotTitle.invalid}\"\n [(ngModel)]=\"snapshot.title\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n @if (snapshot.config.parameterValues && Object.keys(snapshot.config.parameterValues).length) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Parameter Values\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n @for (parameterKey of Object.keys(snapshot.config.parameterValues); track parameterKey) {\n <div class=\"text-gray-600 text-xs\">{{_.startCase(parameterKey)}}</div>\n @if (_.find(parameters, {name: parameterKey})?.type === 'text') {\n <input type=\"text\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n }\n @if (_.find(parameters, {name: parameterKey})?.type === 'numeric') {\n <input type=\"number\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n }\n @if (_.find(parameters, {name: parameterKey})?.type === 'list') {\n <select class=\"pr-8\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n @for (item of _.find(parameters, {name: parameterKey}).list; track item) {\n <option [value]=\"item.value\">\n {{item.label}}</option>\n }\n </select>\n }\n @if (_.find(parameters, {name: parameterKey})?.type === 'date') {\n <input type=\"date\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n }\n @if (_.find(parameters, {name: parameterKey})?.type === 'datetime') {\n <input type=\"datetime-local\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n }\n @if (_.find(parameters, {name: parameterKey})?.type === 'boolean') {\n <mat-slide-toggle class=\"pr-8\" color=\"primary\"\n [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n </mat-slide-toggle>\n }\n }\n </div>\n </div>\n }\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Trigger</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.trigger\">\n <mat-radio-button class=\"mr-4\" value=\"scheduled\">Scheduled</mat-radio-button>\n <mat-radio-button value=\"adhoc\">Ad hoc</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Processor</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.type\">\n <mat-radio-button class=\"mr-4\" value=\"tabulardatasetsnapshot\">Standard\n </mat-radio-button>\n <mat-radio-button value=\"tabulardatasetincrementalsnapshot\">Incremental\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n @if (snapshot.type === 'tabulardatasetincrementalsnapshot') {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Field Name\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesFieldName\"\n name=\"newerValuesFieldName\" required>\n @for (column of columns; track column) {\n <mat-option [value]=\"column.name\"\n >{{ column.title }}\n </mat-option>\n }\n </mat-select>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Rules\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesRules\"\n name=\"newerValuesRules\" required>\n <mat-option value=\"GREATER\">Greater Than</mat-option>\n <mat-option value=\"GREATER_OR_EQUAL\">Greater Than or Equal To</mat-option>\n <mat-option value=\"LESSER\">Lesser Than</mat-option>\n <mat-option value=\"LESSER_OR_EQUAL\">Lesser Than or Equal To</mat-option>\n </mat-select>\n </div>\n </div>\n }\n @if (snapshot.type === 'tabulardatasetsnapshot') {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Type</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0 flex flex-col\">\n <mat-checkbox [(ngModel)]=\"snapshot.config.createHistory\"\n (ngModelChange)=\"updateCreateHistory($event)\">\n Historical\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-4\">Create regular data snapshots based on the\n time periods below.\n </div>\n <mat-checkbox [(ngModel)]=\"snapshot.config.createLatest\"\n [disabled]=\"snapshot.config.createHistory\">\n Latest\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-2\">Save the latest data snapshot as it's own\n entity, separate from the history.\n </div>\n @if (!_.some([snapshot.config.createHistory, snapshot.config.createLatest])) {\n <div\n class=\"mt-6 border-l-4 border-red-600 bg-red-50 p-4\">\n <div class=\"flex items-center\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/exclamation-triangle -->\n <svg class=\"h-5 w-5 text-red-600\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"mb-0 text-sm text-red-700\">\n Please select one snapshot type.\n </p>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (snapshot.trigger === 'scheduled') {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Time Periods</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <ki-task-time-periods #timePeriods class=\"block\" [showTitle]=\"false\"\n [(taskTimePeriods)]=\"snapshot.taskTimePeriods\"></ki-task-time-periods>\n </div>\n </div>\n }\n @if (snapshot.config.createHistory && snapshot.type === 'tabulardatasetsnapshot') {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">Time Lapse\n Fields</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n @for (timeLapse of snapshot.config.timeLapsedFields; track timeLapse; let i = $index) {\n <div class=\"time-lapsed-field\"\n >\n <div>\n <div class=\"mb-1\"><b>Day Offsets:</b> {{ timeLapse.dayOffsets.join(', ') }}\n </div>\n <div><b>Field Names:</b> {{ timeLapse.fieldNames.join(', ') }}</div>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeTimeLapsedField(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n <button mat-button color=\"primary\" (click)=\"addTimeLapsedField()\">\n <mat-icon>date_range</mat-icon>&nbsp;Add time lapsed field\n </button>\n @if (newTimeLapse) {\n <div class=\"w-full bg-gray-50 p-4 mt-4\">\n <div class=\"mb-2 text-xs \">Select the desired offsets for the time lapse, along\n with field names then click\n <span class=\"font-medium\">Save time lapse</span></div>\n <form #timeLapseForm=\"ngForm\" class=\"w-1/2\">\n <label class=\"mb-4\">\n Day Offsets\n <mat-select [(ngModel)]=\"newTimeLapse.dayOffsets\"\n name=\"offsets\" required multiple>\n @for (offset of defaultOffsets; track offset) {\n <mat-option [value]=\"offset.value\"\n >{{ offset.label }}\n </mat-option>\n }\n <mat-option [value]=\"'CUSTOM'\">Custom period</mat-option>\n </mat-select>\n </label>\n @if (newTimeLapse.dayOffsets && newTimeLapse.dayOffsets.indexOf('CUSTOM') > -1) {\n <label class=\"mb-4\"\n >\n Custom Offset\n <div class=\"mt-1 flex custom-offset shadow-sm\">\n <input type=\"number\" name=\"custom-offset\"\n [(ngModel)]=\"newTimeLapse.customDayOffsets\"\n class=\"flex-1 block w-full sm:text-sm border-gray-300\">\n <span\n class=\"inline-flex items-center px-3 border border-l-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Days Ago\n </span>\n </div>\n </label>\n }\n <label class=\"mb-4\">\n Field Names\n <mat-select [(ngModel)]=\"newTimeLapse.fieldNames\" multiple name=\"names\">\n @for (column of columns; track column) {\n <mat-option\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n }\n </mat-select>\n </label>\n <div class=\"align-center justify-between\">\n <div></div>\n <button mat-flat-button color=\"primary\" (click)=\"saveTimeLapse()\"\n [disabled]=\"timeLapseForm.invalid\">Save time lapse\n </button>\n </div>\n </form>\n </div>\n }\n </div>\n </div>\n }\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Key Fields@if (snapshot.config.timeLapsedFields.length) {\n <span\n class=\"ml-1 text-red-600\">*</span>\n }\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select #selectModel=\"ngModel\" #selectKeyFields\n [required]=\"snapshot.config.timeLapsedFields.length > 0\"\n [(ngModel)]=\"snapshot.config.keyFieldNames\" multiple\n [class]=\"{'border-red-600': selectModel.invalid}\">\n <div class=\"px-4 py-3 font-normal flex items-center cursor-pointer\"\n (click)=\"selectAll($event)\">\n <mat-checkbox [(ngModel)]=\"allSelected\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"toggleAllSelection()\"></mat-checkbox>\n <span class=\"ml-2\">Select All</span>\n </div>\n @for (column of columns; track column) {\n <mat-option (click)=\"keyFieldClick()\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n }\n </mat-select>\n <div class=\"mt-2 text-xs \">\n Select the key fields for this data feed. <br>\n @if (snapshot.trigger === 'scheduled') {\n This required where <span class=\"font-medium\">Time Lapse Fields</span> have\n been\n specified.\n }\n </div>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Indexes\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n @for (snapshotIndex of snapshot.config.indexes; track snapshotIndex; let i = $index) {\n <div class=\"flex items-center justify-between\">\n <mat-select [class]=\"{'border-red-600': !snapshot.config.indexes[i].fieldNames.length}\"\n [(ngModel)]=\"snapshot.config.indexes[i].fieldNames\"\n multiple>\n @for (column of columns; track column) {\n <mat-option\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n }\n </mat-select>\n <button mat-icon-button color=\"warn\" (click)=\"removeIndex(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n <button mat-stroked-button color=\"primary\" class=\"mt-2 mr-2 bg-white\"\n (click)=\"snapshot.config.indexes.push({fieldNames: []})\">\n Add Indexes\n </button>\n <div class=\"mt-2 text-xs \">\n Select the fields you would like to set database indexes on. <br>\n </div>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Read chunk size\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\"\n [(ngModel)]=\"snapshot.config.readChunkSize\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n <div class=\"mt-2 text-xs \">\n Set the chunk size for reading data when generating this snapshot. This can be usefully\n overridden to larger values if the query is expected to be very slow or smaller values\n if the dataset is very wide.\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-footer\">\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"saveSnapshot()\"\n [disabled]=\"!snapshot.title || selectModel.invalid\">\n {{ snapshot.id ? 'Update' : 'Add' }} Snapshot Profile\n </button>\n </div>\n}\n\n</div>\n\n\n","import {Component, Inject, Input, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport { HttpClient } from '@angular/common/http';\n\n@Component({\n selector: 'ki-snapshot-api-access',\n templateUrl: './snapshot-api-access.component.html',\n styleUrls: ['./snapshot-api-access.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class SnapshotApiAccessComponent implements OnInit {\n\n @Input() apiKeys: any;\n\n public backendURL: string;\n\n public datasetInstance: any;\n public showApiAccessDetails = false;\n\n constructor(public dialogRef: MatDialogRef<SnapshotApiAccessComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private snackBar: MatSnackBar,\n private datasetService: DatasetService,\n private http: HttpClient) {\n }\n\n async ngOnInit() {\n this.backendURL = this.data.backendUrl;\n this.datasetInstance = this.data.datasetInstanceSummary;\n this.showApiAccessDetails = !!this.datasetInstance.managementKey;\n this.apiKeys = await this.http.get('/account/apikey/first/dataprocessormanage').toPromise();\n }\n\n public copied() {\n this.snackBar.open('Copied to Clipboard', null, {\n duration: 2000,\n verticalPosition: 'top'\n });\n }\n\n public examplePayload(): any {\n let payload = '{\"title\": \"New Snapshot\"';\n\n if (this.datasetInstance.parameters?.length) {\n let params = [];\n this.datasetInstance.parameters.forEach(parameter => {\n params.push('\"' + parameter.name + '\": \"' + parameter.type + '\"');\n });\n\n payload += ', \"parameterValues\": {' + params.join(\", \") + '}';\n }\n\n payload += \"}\";\n\n return payload;\n }\n\n\n public exampleResults() {\n\n let results = [];\n for (let i = 0; i < 3; i++) {\n results.push('{\"column1\": \"value1\", \"column2\": \"value2\"}');\n }\n\n return '[' + results.join(',') + ']';\n }\n\n\n public async saveDataset() {\n await this.datasetService.saveDataset(this.datasetInstance);\n this.showApiAccessDetails = !!this.datasetInstance.managementKey;\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>\n API Access\n </h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Management Key\n </div>\n\n <div class=\"mb-4\">\n <input class=\"mt-2 w-full\" type=\"text\" [(ngModel)]=\"datasetInstance.managementKey\">\n <small class=\"font-normal\">This will be used as part of API requests</small>\n </div>\n\n @if (showApiAccessDetails) {\n <div class=\"text-lg font-semibold mb-4\">\n Example API Usage\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">List Snapshots</div>\n <div class=\"text-sm mb-2\">\n List all snapshots associated with this query using the management key.\n </div>\n <div #listSnapshots class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span> -X <b>GET</b> <span class=\"text-secondary\">{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"listSnapshots.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Response</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n {{'[{\"key\":\"snapshot_1\",\"title\":\"Snapshot 1\",\"type\":\"STANDARD\",\"config\":{\"parameterValues\":[],\"keyFieldNames\":[],\"indexes\":[],\"timeLapsedFields\":[],\"createHistory\":false,\"createLatest\":true,\"readChunkSize\":null},\"trigger\":\"adhoc\",\"datasetManagementKey\":\"managementkey\",\"datasetTitle\":\"Test Query\",\"status\":\"COMPLETED\",\"lastRunTime\":\"22\\\\/03\\\\/2024 14:50:20\",\"nextRunTime\":null}]'}}\n </pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Get Single Snapshot</div>\n <div class=\"text-sm mb-2\">\n Get a single snapshot associated with this query using the management key and snapshot key as returned from a list or create operation.\n </div>\n <div #getSnapshot class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>GET</b> <span class=\"text-secondary\">{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}/SNAPSHOT_KEY</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"getSnapshot.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Response</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n {{'{\"key\":\"snapshot_1\",\"title\":\"Snapshot 1\",\"type\":\"STANDARD\",\"config\":{\"parameterValues\":[],\"keyFieldNames\":[],\"indexes\":[],\"timeLapsedFields\":[],\"createHistory\":false,\"createLatest\":true,\"readChunkSize\":null},\"trigger\":\"adhoc\",\"datasetManagementKey\":\"managementkey\",\"datasetTitle\":\"Test Query\",\"status\":\"COMPLETED\",\"lastRunTime\":\"22\\\\/03\\\\/2024 14:50:20\",\"nextRunTime\":null}'}}\n </pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Get data for snapshot</div>\n <div class=\"text-sm mb-2\">\n Return data for a snapshot for this query identified by management key and snapshot key. Optionally supply an offset and limit for paging the data.\n </div>\n <div #getSnapshotData class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>GET</b> <span class=\"text-secondary\">\"{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}/SNAPSHOT_KEY/data?limit=25&offset=0\"</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"getSnapshotData.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Response</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n {{exampleResults()}}\n </pre>\n </div>\n <div class=\"relative w-full mb-8\">\n <div class=\"text-base font-semibold\">Run a snapshot</div>\n <div class=\"text-sm mb-2\">\n Run a snapshot immediately - the results can be checked by calling the methods above.\n </div>\n <div #runSnapshot class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>PATCH</b> <span class=\"text-secondary\">\"{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}/SNAPSHOT_KEY\"</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"runSnapshot.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Create New Snapshot</div>\n <div class=\"text-sm mb-2\">\n Create a new snapshot for this query using the passed management key.\n </div>\n <div #createSnapshot class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-secondary\">{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"createSnapshot.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">\n {{examplePayload()}}\n </pre>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Response</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n {{'{\"snapshotKey\": \"NEW_SNAPSHOT_KEY\"}'}}\n </pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Update Existing Snapshot</div>\n <div class=\"text-sm mb-2\">\n Update an existing snapshot for this query using the passed management key and snapshot key.\n </div>\n <div #updateSnapshot class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>PUT</b> <span class=\"text-secondary\">{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}/SNAPSHOT_KEY</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"updateSnapshot.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">\n {{examplePayload()}}\n </pre>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Response</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n {{'{\"snapshotKey\": \"NEW_SNAPSHOT_KEY\"}'}}\n </pre>\n </div>\n <div class=\"relative w-full mb-8\">\n <div class=\"text-base font-semibold\">Remove snapshot</div>\n <div class=\"text-sm mb-2\">\n Delete a snapshot for a management key and snapshot key.\n </div>\n <div #removeSnapshot class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-secondary\">\"{{backendURL}}/api/snapshot/{{datasetInstance.managementKey}}/SNAPSHOT_KEY\"</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"removeSnapshot.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n }\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-flat-button color=\"primary\" (click)=\"saveDataset()\">\n Save\n </button>\n </div>\n\n</div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {DataProcessorService} from '../../../services/data-processor.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-edit-query-cache',\n templateUrl: './edit-query-cache.component.html',\n styleUrls: ['./edit-query-cache.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class EditQueryCacheComponent implements OnInit {\n\n public cache: any;\n public columns: any = [];\n public _ = _;\n\n constructor(public dialogRef: MatDialogRef<EditQueryCacheComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dataProcessorService: DataProcessorService) {\n }\n\n ngOnInit() {\n this.columns = this.data.columns || [];\n\n this.cache = this.data.cache || {\n type: 'querycaching',\n config: {\n sourceQueryId: this.data.datasetInstanceId,\n cacheExpiryDays: null,\n cacheExpiryHours: null,\n primaryKeyColumnNames: [],\n }\n };\n\n this.cache.relatedObjectType = 'DatasetInstance';\n this.cache.relatedObjectPrimaryKey = this.data.datasetInstanceId;\n }\n\n public async saveQueryCache() {\n await this.dataProcessorService.saveProcessor(this.cache, true);\n this.dialogRef.close(true);\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Query Caching</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n @if (cache) {\n <div class=\"dialog-content\">\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Create a query cache</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">\n Enter the following details to configure your caching data set.\n </p>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Title<span class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" #cacheTitle=\"ngModel\"\n [class]=\"{'border border-red-600': cacheTitle.invalid}\"\n [(ngModel)]=\"cache.title\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Cache Expiry Days\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"number\"\n [(ngModel)]=\"cache.config.cacheExpiryDays\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Cache Expiry Hours\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"number\"\n [(ngModel)]=\"cache.config.cacheExpiryHours\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Primary Key Column Names\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"cache.config.primaryKeyColumnNames\"\n name=\"primaryKeyColumnNames\" required [multiple]=\"true\">\n @for (column of columns; track column) {\n <mat-option [value]=\"column.name\"\n >{{ column.title }}\n </mat-option>\n }\n </mat-select>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-footer\">\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"saveQueryCache()\"\n [disabled]=\"!cache.title\">\n Save Query Cache\n </button>\n </div>\n }\n\n</div>\n\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {DataProcessorService, } from '../../../services/data-processor.service';\nimport * as lodash from 'lodash';\nimport {Router} from '@angular/router';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {MatDialog} from '@angular/material/dialog';\nimport {\n EditQueryCacheComponent\n} from '../../query-caching/edit-query-cache/edit-query-cache.component';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-query-cache-view',\n templateUrl: './query-cache-view.component.html',\n styleUrls: ['./query-cache-view.component.sass'],\n standalone: false\n})\nexport class QueryCacheViewComponent implements OnInit {\n\n @Input() admin: boolean;\n @Input() reload = new Subject();\n @Input() showPager = true;\n @Input() limit = 10;\n @Input() datasetInstance: number;\n\n public queries: any = [];\n public searchText = new BehaviorSubject('');\n\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n public _ = _;\n\n\n constructor(private dataProcessorService: DataProcessorService,\n private router: Router,\n private datasetService: DatasetService,\n private dialog: MatDialog) {\n }\n\n ngOnInit() {\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getQueries()\n )\n ).subscribe((queries: any) => {\n this.endOfResults = queries.length < this.limit;\n this.queries = queries;\n this.loading = false;\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public delete(cacheKey) {\n const message = 'Are you sure you would like to remove this Query Cache?';\n if (window.confirm(message)) {\n this.dataProcessorService.removeProcessor(cacheKey).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n public async editCache(cacheKey: string) {\n const cache: any = await this.dataProcessorService.getProcessor(cacheKey);\n\n const dataset = await this.datasetService.getDataset(cache.config.sourceQueryId);\n const data: any = await this.datasetService.evaluateDataset(dataset);\n const columns = data.columns;\n\n const dialogRef = this.dialog.open(EditQueryCacheComponent, {\n width: '900px',\n height: '900px',\n data: {\n cache,\n datasetInstanceId: cache.config.sourceQueryId,\n columns\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.reload.next(Date.now());\n }\n });\n }\n\n private getQueries() {\n if (this.datasetInstance) {\n return this.dataProcessorService.filterProcessorsByRelatedItem(\n 'querycaching',\n 'DatasetInstance',\n this.datasetInstance,\n false\n ).pipe(map((queries: any) => {\n return queries;\n })\n );\n } else {\n return this.dataProcessorService.filterProcessorsByType(\n 'querycaching',\n this.searchText.getValue() || '',\n this.limit.toString(),\n this.offset.toString()\n ).pipe(map((queries: any) => {\n return queries;\n })\n );\n }\n\n }\n\n}\n","<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search caching queries\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n @if (queries.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Cache\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Cache Expiry\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n @for (query of queries; track query) {\n <tbody class=\"hover:bg-gray-50\">\n <tr class=\"hover:bg-gray-50\">\n <td class=\"boder-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">\n {{query.title}}\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n @if (query.config.cacheExpiryDays) {\n <span class=\"mr-2\"><b>{{query.config.cacheExpiryDays}}</b> Day(s)</span>\n }\n @if (query.config.cacheExpiryHours) {\n <span><b>{{query.config.cacheExpiryHours}}</b> Hour(s)</span>\n }\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n <div class=\"flex items-center justify-end\">\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editCache(query.key)\">\n Edit Cache\n </button>\n <button mat-menu-item\n (click)=\"delete(query.key)\">\n Delete Cache\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n </tbody>\n }\n <tbody>\n @if (showPager) {\n <tr>\n <td colspan=\"5\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}} - {{(page * limit) - (limit - queries.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n }\n </tbody>\n }\n </table>\n </div>\n </div>\n </div>\n</div>\n","import {Component, ElementRef, Inject, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {DatasetNameDialogComponent} from '../dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component';\nimport {DatasetService} from '../../services/dataset.service';\nimport {Router} from '@angular/router';\nimport {\n SnapshotProfileDialogComponent\n} from '../data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';\nimport {ExportDataComponent} from './export-data/export-data.component';\nimport {ProjectService} from '../../services/project.service';\nimport * as lodash from 'lodash';\nimport {DataProcessorService} from '../../services/data-processor.service';\nimport {\n SnapshotApiAccessComponent\n} from './snapshot-api-access/snapshot-api-access.component';\nimport {\n EditQueryCacheComponent\n} from '../query-caching/edit-query-cache/edit-query-cache.component';\nimport {Subject} from 'rxjs';\nimport {CreateDatasetComponent} from '../dataset/create-dataset/create-dataset.component';\nimport {DatasetEditorComponent} from '../dataset/dataset-editor/dataset-editor.component';\nimport {ChangeSourceWarningComponent} from './change-source-warning/change-source-warning.component';\n\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-data-explorer',\n templateUrl: './data-explorer.component.html',\n styleUrls: ['./data-explorer.component.sass'],\n host: { class: 'configure-dialog' },\n standalone: false\n})\nexport class DataExplorerComponent implements OnInit, OnDestroy {\n\n @ViewChild('datasetEditorComponent') datasetEditorComponent: DatasetEditorComponent;\n\n @Input() datasetEditorReadonly = false;\n @Input() datasetEditorSimpleMode = false;\n @Input() datasetEditorNoTools: boolean = false;\n\n public _ = _;\n public backendUrl: string;\n public showChart = false;\n public chartData;\n public datasetInstanceSummary: any;\n public filters: any;\n public admin: boolean;\n public showSnapshots = false;\n public snapshotProfiles: any = [];\n public showQueryCache = false;\n public editTitle = false;\n public accountId: any;\n public newTitle: string;\n public newDescription: string;\n public breadcrumb: string;\n public canHaveSnapshots = false;\n public canExportData = false;\n public reloadCache = new Subject();\n\n private columns: any = [];\n private datasetTitle: string;\n private timer: number;\n\n constructor(public dialogRef: MatDialogRef<DataExplorerComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dialog: MatDialog,\n private datasetService: DatasetService,\n private router: Router,\n private projectService: ProjectService,\n private dataProcessorService: DataProcessorService) {\n }\n\n ngOnInit(): void {\n this.chartData = !!this.data.showChart;\n this.datasetInstanceSummary = this.data.datasetInstanceSummary;\n this.admin = !!this.data.admin;\n this.accountId = this.data.accountId;\n this.breadcrumb = this.data.breadcrumb;\n this.backendUrl = this.data.backendUrl;\n this.datasetEditorReadonly = !!this.data.datasetEditorReadonly;\n this.datasetEditorSimpleMode = !!this.data.datasetEditorSimpleMode;\n this.datasetEditorNoTools = !!this.data.datasetEditorNoTools;\n\n if (!this.datasetInstanceSummary.id) {\n this.datasetTitle = this.datasetInstanceSummary.title;\n }\n\n this.newTitle = this.data.newTitle;\n this.newDescription = this.data.newDescription;\n\n this.chartData = [\n {data: [1000, 1400, 1999, 2500, 5000]},\n ];\n\n this.canHaveSnapshots = this.projectService.doesActiveProjectHavePrivilege('snapshotaccess');\n this.canExportData = this.projectService.doesActiveProjectHavePrivilege('exportdata');\n }\n\n ngOnDestroy() {\n if (this.timer) {\n clearInterval(this.timer);\n }\n }\n\n public changeSource() {\n const dialogRef = this.dialog.open(CreateDatasetComponent, {\n width: '1200px',\n height: '800px',\n data: {\n admin: this.admin,\n accountId: this.accountId\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n const dialogRef2 = this.dialog.open(ChangeSourceWarningComponent, {\n width: '700px',\n height: '275px'\n });\n dialogRef2.afterClosed().subscribe(proceed => {\n if (proceed) {\n this.datasetInstanceSummary.datasetInstanceId = res.datasetInstanceId;\n this.datasetInstanceSummary.datasourceInstanceKey = res.datasourceInstanceKey;\n this.datasetInstanceSummary.source = {\n title: res.title,\n datasetInstanceId: res.datasetInstanceId,\n datasourceInstanceKey: res.datasourceInstanceKey,\n type: null\n };\n const transformation = this.datasetInstanceSummary.transformationInstances[0];\n if (transformation) {\n this.datasetEditorComponent.excludeUpstreamTransformations(transformation, true);\n } else {\n this.datasetEditorComponent.evaluateDataset(true);\n }\n }\n });\n }\n });\n }\n\n public dataLoaded(data) {\n this.columns = data.columns;\n }\n\n public async triggerSnapshot(snapshotKey) {\n await this.dataProcessorService.triggerProcessor(snapshotKey);\n this.snapshotProfiles = await this.loadProcessorItems('snapshot');\n this.timer = setInterval(async () => {\n this.snapshotProfiles = await this.loadProcessorItems('snapshot');\n }, 3000);\n }\n\n public apiAccess() {\n const dialogRef = this.dialog.open(SnapshotApiAccessComponent, {\n width: '800px',\n height: '530px',\n data: {\n datasetInstanceSummary: this.datasetInstanceSummary,\n backendUrl: this.backendUrl\n }\n });\n }\n\n public exportData() {\n const dialogRef = this.dialog.open(ExportDataComponent, {\n width: '600px',\n height: '530px',\n data: {\n datasetInstanceSummary: Object.assign({}, this.datasetInstanceSummary)\n }\n });\n }\n\n public async viewSnapshots() {\n this.showQueryCache = false;\n this.showSnapshots = !this.showSnapshots;\n if (this.showSnapshots) {\n this.snapshotProfiles = await this.loadProcessorItems('snapshot');\n }\n }\n\n public editSnapshot(snapshot) {\n const dialogRef = this.dialog.open(SnapshotProfileDialogComponent, {\n width: '900px',\n height: '900px',\n data: {\n snapshot,\n datasetInstanceId: this.datasetInstanceSummary.id,\n columns: this.columns,\n datasetInstance: this.datasetInstanceSummary\n }\n });\n dialogRef.afterClosed().subscribe(async res => {\n if (res) {\n this.snapshotProfiles = await this.loadProcessorItems('snapshot');\n }\n });\n }\n\n public async deleteSnapshot(snapshot) {\n const message = 'Are you sure you would like to remove this snapshot?';\n if (window.confirm(message)) {\n await this.dataProcessorService.removeProcessor(snapshot.key);\n this.snapshotProfiles = await this.loadProcessorItems('snapshot');\n }\n }\n\n public async viewQueryCaching() {\n this.showSnapshots = false;\n this.showQueryCache = !this.showQueryCache;\n }\n\n public editQueryCache(cache: any) {\n const dialogRef = this.dialog.open(EditQueryCacheComponent, {\n width: '900px',\n height: '900px',\n data: {\n cache,\n datasetInstanceId: this.datasetInstanceSummary.id,\n columns: this.columns,\n datasetInstance: this.datasetInstanceSummary\n }\n });\n dialogRef.afterClosed().subscribe(async res => {\n if (res) {\n this.reloadCache.next(Date.now());\n }\n });\n }\n\n public saveChanges() {\n if (!this.datasetInstanceSummary.id && (this.datasetInstanceSummary.title === this.datasetTitle)) {\n const dialogRef = this.dialog.open(DatasetNameDialogComponent, {\n width: '700px',\n height: '800px',\n data: {\n datasetInstanceSummary: this.datasetInstanceSummary\n }\n });\n dialogRef.afterClosed().subscribe(datasetInstanceSummary => {\n if (datasetInstanceSummary) {\n this.datasetInstanceSummary = datasetInstanceSummary;\n this.saveDataset();\n }\n });\n } else {\n this.saveDataset();\n }\n }\n\n private saveDataset() {\n this.datasetService.saveDataset(this.datasetInstanceSummary, this.accountId).then(() => {\n this.dialogRef.close(true);\n // this.router.navigate(['/dataset']);\n });\n }\n\n private async loadProcessorItems(type: string) {\n return await this.dataProcessorService.filterProcessorsByRelatedItem(\n type,\n 'DatasetInstance',\n this.datasetInstanceSummary.id\n );\n }\n\n}\n","<div class=\"bg-gray-50 configure-header border-b border-gray-200\">\n <div class=\"w-full flex items-center\">\n @if (datasetInstanceSummary && datasetInstanceSummary.title && !editTitle) {\n <div (click)=\"editTitle = !editTitle\">{{ datasetInstanceSummary.title }}</div>\n }\n @if (datasetInstanceSummary && editTitle) {\n <input type=\"text\" class=\"w-1/4 text-sm\"\n [(ngModel)]=\"datasetInstanceSummary.title\" (blur)=\"editTitle = false\">\n }\n @if (!datasetInstanceSummary || !datasetInstanceSummary.title) {\n Data Explorer\n }\n\n </div>\n\n <div class=\"flex items-center\">\n @if (admin) {\n <mat-radio-group class=\"flex items-center text-sm\"\n aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Data Feed</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Stored Query</mat-radio-button>\n </mat-radio-group>\n }\n </div>\n\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a [mat-dialog-close]=\"{breadcrumb: '/'}\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a [mat-dialog-close]=\"true\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n {{ breadcrumb }}</a>\n </div>\n </li>\n\n @if (datasetInstanceSummary) {\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{ datasetInstanceSummary.title || 'Data Explorer' }}\n </a>\n @if (datasetInstanceSummary && datasetInstanceSummary.source) {\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n @if (datasetInstanceSummary.source.datasourceInstanceKey) {\n @if (['custom', 'snapshot'].indexOf(datasetInstanceSummary.source.type) === -1) {\n <img\n src=\"/assets/favicon.png\" class=\"w-2.5 mx-1.5\">\n }\n @if (datasetInstanceSummary.source.type === 'custom') {\n <span\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n }\n @if (datasetInstanceSummary.source.type === 'snapshot') {\n <span\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n }\n }\n @if (!datasetInstanceSummary.source.datasourceInstanceKey) {\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n }\n &nbsp;{{ datasetInstanceSummary.source.title }}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n }\n </div>\n </li>\n }\n </ol>\n </nav>\n <div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"(showSnapshots || showQueryCache) ? ['bottom'] : ['none']\"\n [rFlex]=\"(showSnapshots || showQueryCache)\">\n\n <rsz-layout class=\"cell left no-p\" [directions]=\"showChart ? ['right'] : ['none']\" [rFlex]=\"true\"\n [style]=\"{'flex-basis': showChart ? '65%' : '100%'}\">\n <div class=\"cell-contents no-p\">\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"datasetInstanceSummary\"\n [accountId]=\"accountId\" [newTitle]=\"newTitle\" [newDescription]=\"newDescription\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\"\n [datasetEditorReadonly]=\"datasetEditorReadonly\"\n [datasetEditorSimpleMode]=\"datasetEditorSimpleMode\"\n [datasetEditorNoTools]=\"datasetEditorNoTools\"></ki-dataset-editor>\n </div>\n </rsz-layout>\n </rsz-layout>\n\n @if (showSnapshots || showQueryCache) {\n <rsz-layout class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\"\n [class]=\"{'overflow-y-scroll': showQueryCache}\">\n @if (showSnapshots) {\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Snapshot Profiles</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n A list of all the snapshots that have been created for this stored query.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"apiAccess()\"\n class=\"inline-flex items-center justify-center px-4 py-2 mr-3 border border-transparent text-sm font-medium rounded-md shadow-sm text-primary bg-gray-100 focus:outline-none\">\n API Access\n </button>\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n New Snapshot Profile\n </button>\n </div>\n </div>\n </div>\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n @if (snapshotProfiles.length) {\n <table\n class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Title\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (snapshot of snapshotProfiles; track snapshot; let i = $index) {\n <tr>\n <td>\n @if (snapshot.taskStatus !== 'RUNNING') {\n <button color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ snapshot.title }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [class]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n @if (snapshot.taskStatus === 'PENDING') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n @if (snapshot.taskStatus === 'COMPLETED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'FAILED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'TIMED_OUT') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n {{ _.startCase(snapshot.taskStatus) }}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskLastStartTime }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskNextStartTime }}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editSnapshot(snapshot)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteSnapshot(snapshot)\"> Delete\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n </div>\n </div>\n @if (!snapshotProfiles.length) {\n <div class=\"p-4\">\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">history\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Snapshot Profile</span>\n </button>\n </div>\n }\n }\n @if (showQueryCache) {\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Query Caching</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set up Query Caching on this data set.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"editQueryCache(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n Create Query Cache\n </button>\n </div>\n </div>\n </div>\n <ki-query-cache-view [limit]=\"100\" [showPager]=\"false\" [reload]=\"reloadCache\"\n [datasetInstance]=\"datasetInstanceSummary.id\"></ki-query-cache-view>\n }\n </rsz-layout>\n }\n</div>\n\n<div class=\"configure-footer\">\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">\n Cancel\n </button>\n <div class=\"align-center\">\n @if (canHaveSnapshots && !datasetEditorReadonly) {\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewQueryCaching()\">\n Query Caching\n </button>\n }\n @if (canHaveSnapshots && !datasetEditorReadonly) {\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewSnapshots()\">\n Manage Snapshots\n </button>\n }\n @if (canExportData) {\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\" (click)=\"exportData()\">\n Export Data\n </button>\n }\n @if (!datasetEditorReadonly) {\n <button mat-flat-button color=\"primary\" (click)=\"saveChanges()\">\n Save & Exit\n </button>\n }\n </div>\n\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from '../../services/project.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-metadata',\n templateUrl: './metadata.component.html',\n styleUrls: ['./metadata.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class MetadataComponent implements OnInit {\n\n public metadata: any = {};\n public categories: any = [];\n public metadataService: any;\n public newCategory: any = {};\n\n private projectKey = '';\n\n constructor(public dialogRef: MatDialogRef<MetadataComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n ngOnInit(): void {\n this.metadata = this.data.metadata;\n this.metadataService = this.data.service;\n this.projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n\n this.loadCategories();\n }\n\n public showSelected(o1: any, o2: any) {\n return o1 && o2 && o1.key === o2.key;\n }\n\n public addCategory() {\n\n this.newCategory.key = _.camelCase(this.newCategory.category);\n\n this.http.post('/account/metadata/category?projectKey=' + this.projectKey, this.newCategory).toPromise()\n .then(() => {\n this.loadCategories().then(() => {\n this.metadata.categories.push(this.newCategory);\n this.newCategory = {};\n });\n });\n }\n\n public saveMetadata() {\n this.metadataService.updateMetadata(this.metadata).then(res => {\n this.dialogRef.close(true);\n });\n }\n\n private loadCategories() {\n return this.http.get('/account/metadata/category?projectKey=' + this.projectKey, {\n params: {limit: '100'}\n }).toPromise().then(categories => this.categories = categories);\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Edit Metadata</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"my-4\">\n <p><b>Title</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter title\" [(ngModel)]=\"metadata.title\">\n </div>\n\n <div class=\"my-4\">\n <p><b>Summary</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter summary\" [(ngModel)]=\"metadata.summary\">\n </div>\n\n <div class=\"my-4\">\n <p><b>Description</b></p>\n <textarea [(ngModel)]=\"metadata.description\" placeholder=\"Enter description\" rows=\"5\"\n class=\"w-full\"></textarea>\n </div>\n\n <div class=\"my-4\">\n <p><b>Categories</b></p>\n\n <mat-selection-list [compareWith]=\"showSelected\" [(ngModel)]=\"metadata.categories\" >\n @for (category of categories; track category) {\n <mat-list-option checkboxPosition=\"before\" [value]=\"category\">\n {{category.category}}\n </mat-list-option>\n }\n </mat-selection-list>\n </div>\n\n <div class=\"my-4\">\n <p><b>Add New Category</b></p>\n\n <input class=\"full\" type=\"text\" placeholder=\"Enter name\" [(ngModel)]=\"newCategory.category\" required>\n <input class=\"full mt-4\" type=\"text\" placeholder=\"Enter description\" [(ngModel)]=\"newCategory.description\">\n <div class=\"flex items-center justify-between mt-4\">\n <div></div>\n <button mat-stroked-button color=\"primary\" [disabled]=\"!newCategory.category\" (click)=\"addCategory()\">Add Category</button>\n </div>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveMetadata()\">Save Metadata\n </button>\n </div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnDestroy, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, Subject, Subscription} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {DataExplorerComponent} from '../data-explorer/data-explorer.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport {TagService} from '../../services/tag.service';\nimport {ProjectService} from '../../services/project.service';\nimport {DatasetService} from '../../services/dataset.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {MetadataComponent} from '../metadata/metadata.component';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {CreateDatasetComponent} from './create-dataset/create-dataset.component';\nimport {Location} from '@angular/common';\n\n@Component({\n selector: 'ki-dataset',\n templateUrl: './dataset.component.html',\n styleUrls: ['./dataset.component.sass'],\n standalone: false\n})\nexport class DatasetComponent implements OnInit, OnDestroy {\n\n @Input() headingLabel: string;\n @Input() headingDescription: string;\n @Input() backendUrl: string;\n @Input() newTitle: string;\n @Input() newDescription: string;\n @Input() hideCreate: boolean;\n @Input() shared: boolean;\n @Input() admin: boolean;\n @Input() reload: Subject<any>;\n @Input() url: string;\n @Input() accountId: any;\n @Input() contactUs: string;\n @Input() tableHeading: string;\n @Input() listStyle = 'LIST';\n\n public datasets: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public categories: any = [];\n public filteredCategories: any = [];\n public Date = Date;\n public activeTagSub = new Subject();\n public projectSub = new Subject();\n public activeTag: any;\n public loading = true;\n public gridItems: any = {};\n public projectSettings: any = {};\n\n private tagSub: Subscription;\n private activeProject: any;\n private activeProjectSub: Subscription;\n\n constructor(private dialog: MatDialog,\n private tagService: TagService,\n private projectService: ProjectService,\n private datasetService: DatasetService,\n private router: Router,\n private route: ActivatedRoute,\n @Inject(KININTEL_CONFIG) public config: KinintelModuleConfig,\n private location: Location) {\n }\n\n async ngOnInit() {\n this.activeProject = this.projectService.activeProject.getValue();\n\n this.activeProjectSub = this.projectService.activeProject.subscribe(activeProject => {\n this.activeProject = activeProject;\n\n this.projectSettings = (this.activeProject && this.activeProject.settings) ? (Array.isArray(this.activeProject.settings) ? {\n hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: []\n } : this.activeProject.settings) : {\n hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: []\n };\n\n const listKey = this.getCurrentPathListKey();\n if (this.projectSettings[listKey]) {\n this.listStyle = this.projectSettings[listKey];\n }\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n\n const pagingValues = this.projectService.getDataItemPagingValues();\n this.limit = pagingValues.limit || 10;\n this.offset = pagingValues.offset || 0;\n this.page = pagingValues.page || 1;\n\n this.route.params.subscribe(param => {\n if (param.id) {\n this.view(param.id);\n }\n });\n\n if (!this.reload) {\n this.reload = new Subject();\n }\n\n if (this.tagService) {\n this.activeTagSub = this.tagService.activeTag;\n this.tagSub = this.tagService.activeTag.subscribe(tag => this.activeTag = tag);\n }\n\n if (this.projectService) {\n this.projectSub = this.projectService.activeProject;\n }\n\n this.getCategories();\n\n merge(this.searchText, this.activeTagSub, this.projectSub, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe((datasets: any) => {\n this.datasets = datasets;\n\n if (this.categories.length) {\n this.gridItems = {};\n this.categories.forEach(category => {\n const items = _.filter(datasets, dataset => {\n return !!_.find(dataset.categories, {key: category.key});\n });\n this.gridItems[category.key] = {\n key: category.key,\n title: category.category,\n list: items\n };\n });\n\n const otherItems = _.filter(datasets, dataset => {\n return !dataset.categories || !dataset.categories.length;\n });\n this.gridItems.other = {\n key: 'other',\n title: 'Other',\n list: otherItems\n };\n } else {\n this.listStyle = 'LIST';\n }\n this.loading = false;\n });\n }\n\n ngOnDestroy() {\n if (this.tagSub) {\n this.tagSub.unsubscribe();\n }\n }\n\n public view(datasetId) {\n this.datasetService.getDataset(datasetId).then(datasetInstanceSummary => {\n this.viewDataset(datasetInstanceSummary);\n });\n }\n\n public extend(id) {\n this.datasetService.getExtendedDataset(id).then(datasetInstanceSummary => {\n this.viewDataset(datasetInstanceSummary);\n });\n }\n\n public removeActiveTag() {\n this.tagService.resetActiveTag();\n }\n\n public updateListStyle() {\n if (!this.admin) {\n this.datasets = [];\n const listKey = this.getCurrentPathListKey();\n this.projectSettings[listKey] = this.listStyle;\n this.projectService.updateProjectSettings(this.activeProject.projectKey, this.projectSettings);\n }\n }\n\n public toggleCategory(event, category) {\n event.stopPropagation();\n category.checked = !category.checked;\n this.updateCategoryFilters();\n }\n\n public updateCategoryFilters() {\n this.offset = 0;\n this.page = 1;\n this.reload.next(Date.now());\n }\n\n public delete(datasetId) {\n const message = 'Are you sure you would like to remove this Dataset?';\n if (window.confirm(message)) {\n this.datasetService.removeDataset(datasetId).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public editMetadata(searchResult) {\n const dialogRef = this.dialog.open(MetadataComponent, {\n width: '700px',\n height: '900px',\n data: {\n metadata: _.clone(searchResult),\n service: this.datasetService\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.reload.next(Date.now());\n this.getCategories();\n }\n });\n }\n\n public create() {\n const dialogRef = this.dialog.open(CreateDatasetComponent, {\n width: '1200px',\n height: '800px',\n data: {\n admin: this.admin,\n accountId: this.accountId\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.viewDataset(res);\n }\n });\n }\n\n private viewDataset(datasetInstanceSummary) {\n this.router.navigate([this.url || '/dataset'], {fragment: _.kebabCase(datasetInstanceSummary.title)});\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n closeOnNavigation: true,\n data: {\n datasetInstanceSummary,\n backendUrl: this.backendUrl,\n showChart: false,\n admin: this.admin,\n newTitle: this.newTitle ? this.newTitle + ' Name' : null,\n newDescription: this.newDescription || null,\n accountId: this.accountId,\n breadcrumb: this.headingLabel || 'Datasets',\n url: this.url\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n if (res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n }\n this.router.navigate([this.url || '/dataset'], {fragment: null});\n this.reload.next(Date.now());\n }\n });\n }\n\n private getDatasets() {\n this.projectService.setDataItemPagingValue(this.limit, this.offset, this.page);\n\n const checkedCategories = _.filter(this.categories, 'checked');\n return this.datasetService.getDatasets(\n this.searchText.getValue() || '',\n this.listStyle === 'GRID' ? '1000' : this.limit.toString(),\n this.listStyle === 'GRID' ? '0' : this.offset.toString(),\n this.shared ? null : (!_.isNil(this.accountId) ? this.accountId : ''),\n '',\n _.map(checkedCategories, 'key')\n ).pipe(map((datasets: any) => {\n this.endOfResults = datasets.length < this.limit;\n return datasets;\n })\n );\n }\n\n private getCategories() {\n return this.datasetService.getDatasetCategories(this.shared).then(categories => this.categories = categories);\n }\n\n private getCurrentPathListKey() {\n const currentPath = this.location.path().replace('/', '-');\n return _.camelCase('listStyle' + currentPath);\n }\n\n protected readonly Object = Object;\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">\n <div>{{headingLabel || 'Datasets'}}</div>\n </h1>\n <p class=\"text-sm font-medium text-gray-500\">\n @if (headingDescription) {\n <span [innerHTML]=\"headingDescription\"></span>\n }\n @if (!headingDescription) {\n A list of all the <span class=\"lowercase\">{{headingLabel || 'datasets'}}</span> currently\n available.\n }\n </p>\n </div>\n </div>\n @if (!hideCreate) {\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button type=\"button\" (click)=\"create()\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create {{newTitle || 'Dataset'}}\n </button>\n </div>\n }\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative bg-white flex items-center flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search {{shared ? 'data feeds' : 'stored queries'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n\n <div class=\"border-b h-full\">\n <mat-button-toggle-group [disabled]=\"!categories.length\"\n class=\"list-switcher h-full rounded-none border-none\"\n [(ngModel)]=\"listStyle\" (ngModelChange)=\"updateListStyle()\">\n <mat-button-toggle value=\"GRID\" [class]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>grid_view</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"LIST\" [class]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>reorder</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n\n </div>\n </div>\n </div>\n @if (datasets.length && listStyle === 'LIST') {\n <table class=\"min-w-full border-separate\"\n style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n @if (datasets.length) {\n <tr class=\"border-t border-gray-200\">\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n <div class=\"w-full flex items-center justify-between\">\n <div>{{tableHeading || 'Datasets'}}</div>\n </div>\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-right text-xs font-semibold text-gray-900\">\n <button type=\"button\" [matMenuTriggerFor]=\"projectCategories\"\n [disabled]=\"!categories.length\"\n class=\"disabled:opacity-50 -ml-px relative inline-flex items-center py-3 px-4 border-l border-gray-300 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 focus:outline-none border-t-0 border-r-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-gray-400\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n <span class=\"ml-2\">Categories</span>\n <svg class=\"ml-2.5 -mr-1.5 h-5 w-5 text-gray-400\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </button>\n <mat-menu #projectCategories=\"matMenu\">\n @for (category of categories; track category) {\n <button (click)=\"toggleCategory($event, category)\"\n mat-menu-item>\n <div class=\"flex items-center\">\n @if (category.checked) {\n <mat-icon color=\"primary\">check_box</mat-icon>\n }\n @if (!category.checked) {\n <mat-icon>check_box_outline_blank</mat-icon>\n }\n {{category.category}}\n </div>\n </button>\n }\n </mat-menu>\n </th>\n </tr>\n @for (element of datasets; track element; let i = $index) {\n <tr class=\"hover:bg-gray-50\"\n [class]=\"{}\">\n <td class=\"border-gray-200 py-2 px-4 text-sm w-1/2 text-gray-900\"\n [class]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n <div class=\"flex flex-col\">\n @if (element.enabled || admin) {\n <div\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"shared ? extend(element.id) : view(element.id)\">\n {{element.title}}\n </div>\n }\n @if (!element.enabled && !admin) {\n <div\n class=\"item-title-select flex items-center font-medium\">\n {{element.title}}\n </div>\n }\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n @if (element.viewDescription && element.description) {\n <div class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n }\n </div>\n </td>\n <td class=\"border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [class]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n @if (element.categories.length) {\n <div class=\"inline-category\">\n @for (category of element.categories; track category) {\n <a>\n {{category.category}}\n </a>\n }\n </div>\n }\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [class]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1}\">\n @if ((element.enabled === undefined ? true : element.enabled) || admin) {\n <div\n class=\"flex items-center justify-end\">\n @if (!shared) {\n <button mat-button color=\"primary\" (click)=\"view(element.id)\">\n Edit\n </button>\n }\n @if (shared) {\n <button mat-button color=\"primary\" (click)=\"extend(element.id)\">\n Create {{newTitle || 'Dataset'}}\n </button>\n }\n @if (!shared) {\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(element.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(element)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(element.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n }\n </div>\n }\n @if ((element.enabled === undefined ? false : !element.enabled) && !admin) {\n <a [href]=\"'mailto:' + contactUs\"\n mat-button color=\"primary\">\n Contact Us\n </a>\n }\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"3\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasets.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n @if (datasets.length && listStyle === 'GRID') {\n <div class=\"my-4\">\n <div class=\"px-3\">\n <div class=\"mt-2 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n @for (item of Object.keys(gridItems); track item) {\n @if (gridItems[item].list.length) {\n <div class=\"bg-white overflow-hidden shadow rounded-lg flex flex-col\">\n <div class=\"px-5 py-4 bg-gray-50 \">\n <div class=\"flex items-center\">\n <div class=\"ml-1 text-base font-medium text-gray-500 truncate\">\n {{gridItems[item].title}}\n </div>\n </div>\n </div>\n <div class=\"flex-1 grid-item-container overflow-y-scroll\">\n <table class=\"table-fixed\">\n <tbody>\n @for (listItem of gridItems[item].list; track listItem) {\n <tr\n class=\"hover:bg-gray-50 cursor-pointer\">\n @if (listItem.enabled || admin) {\n <td\n [class]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n (click)=\"shared ? extend(listItem.id) : view(listItem.id)\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n }\n @if (!listItem.enabled && !admin) {\n <td\n [class]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n }\n <td class=\"w-1/3\">\n <div class=\"flex justify-end\">\n @if ((listItem.enabled === undefined ? true : listItem.enabled) || admin) {\n <div\n class=\"flex items-center justify-end\">\n @if (!shared) {\n <a class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"view(listItem.id)\">\n Edit\n </a>\n }\n @if (shared) {\n <a class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"extend(listItem.id)\">\n Create {{newTitle || 'Dataset'}}\n </a>\n }\n @if (!shared) {\n <div class=\"ml-2 divider\"></div>\n <a class=\"hover:underline flex items-center font-medium text-primary\" [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </a>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(listItem.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(listItem)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(listItem.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n }\n </div>\n }\n @if ((listItem.enabled === undefined ? false : !listItem.enabled) && !admin) {\n <a [href]=\"'mailto:' + contactUs\"\n class=\"hover:underline flex items-center font-medium text-primary\"\n >\n Contact Us\n </a>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <!-- <div class=\"bg-gray-50 px-5 py-3\">-->\n <!-- <div class=\"text-sm\">-->\n <!-- <a-->\n <!-- class=\"font-medium text-secondary capitalize flex items-center\">-->\n <!-- View all-->\n <!-- <mat-icon>chevron_right</mat-icon>-->\n <!-- </a>-->\n <!-- </div>-->\n <!-- </div>-->\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n</div>\n</div>\n</div>\n</div>\n\n@if (!datasets.length && !loading) {\n <div class=\"p-4\">\n @if (!hideCreate) {\n <button type=\"button\" (click)=\"create()\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">query_stats</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create {{newTitle || 'Dataset'}}</span>\n </button>\n }\n </div>\n}\n","import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core';\nimport {BehaviorSubject, merge, Subject, Subscription} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {MatDialog} from '@angular/material/dialog';\nimport {DataExplorerComponent} from '../data-explorer/data-explorer.component';\nimport {DatasourceService} from '../../services/datasource.service';\nimport {ProjectService} from '../../services/project.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-datasource',\n templateUrl: './datasource.component.html',\n styleUrls: ['./datasource.component.sass'],\n standalone: false\n})\nexport class DatasourceComponent implements OnInit, OnDestroy {\n\n @Input() admin: boolean;\n @Input() title: string;\n @Input() description: string;\n @Input() exploreText: string;\n @Input() hideNew: boolean;\n @Input() newDocumentURL = '/document-datasource';\n @Input() newTabularURL = '/import-data';\n @Input() datasourceURL = '/datasource';\n @Input() noProject = false;\n @Input() filterResults: any;\n\n\n public datasources: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public reload = new Subject();\n public isProjectAdmin = false;\n public canImportData = false;\n\n private projectSub: Subscription;\n\n constructor(private dialog: MatDialog,\n private datasourceService: DatasourceService,\n private projectService: ProjectService,\n private router: Router,\n private route: ActivatedRoute) {\n }\n\n ngOnInit(): void {\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n\n const pagingValues = this.projectService.getDataItemPagingValues();\n this.limit = pagingValues.limit || 10;\n this.offset = pagingValues.offset || 0;\n this.page = pagingValues.page || 1;\n\n this.isProjectAdmin = this.projectService.isActiveProjectAdmin();\n this.canImportData = this.projectService.doesActiveProjectHavePrivilege('customdatasourceaccess');\n\n this.projectSub = this.projectService.activeProject.subscribe(() => {\n this.isProjectAdmin = this.projectService.isActiveProjectAdmin();\n });\n\n if (this.canImportData) {\n this.route.params.subscribe(async param => {\n if (param.key) {\n const datasource = await this.datasourceService.getDatasource(param.key);\n this.explore(datasource);\n }\n });\n\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasources()\n )\n ).subscribe((sources: any) => {\n if (this.filterResults) {\n this.datasources = _.filter(sources, this.filterResults);\n } else {\n this.datasources = sources;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.projectSub.unsubscribe();\n }\n\n public createDatasource() {\n\n }\n\n public explore(datasource) {\n this.router.navigate([this.datasourceURL], {fragment: datasource.key});\n const datasetInstanceSummary = {\n datasetInstanceId: null,\n datasourceInstanceKey: datasource.key,\n transformationInstances: [],\n parameterValues: {},\n parameters: [],\n originDataItemTitle: datasource.title\n };\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n data: {\n datasetInstanceSummary,\n showChart: false,\n admin: this.admin,\n breadcrumb: this.title || 'Datasources'\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res && res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n }\n this.router.navigate([this.datasourceURL], {fragment: null});\n });\n }\n\n public async delete(key) {\n const message = 'Are you sure you would like to delete this item?';\n if (window.confirm(message)) {\n await this.datasourceService.deleteDatasource(key);\n this.reload.next(Date.now());\n }\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n private getDatasources() {\n this.projectService.setDataItemPagingValue(this.limit, this.offset, this.page);\n\n return this.datasourceService.getDatasources(\n this.searchText.getValue() || '',\n this.filterResults ? '1000' : this.limit.toString(),\n this.filterResults ? '0' : this.offset.toString(),\n this.noProject\n ).pipe(map((sources: any) => {\n this.endOfResults = sources.length < this.limit;\n return sources;\n })\n );\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900 capitalize\">{{title || 'Datasources'}}</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n {{description || 'A list of all the datasources currently available.'}}\n </p>\n </div>\n </div>\n @if (isProjectAdmin && !hideNew && canImportData) {\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button mat-flat-button color=\"primary\" [matMenuTriggerFor]=\"create\">\n Import Data\n <mat-icon>expand_more</mat-icon>\n </button>\n <mat-menu #create=\"matMenu\">\n <button mat-menu-item [routerLink]=\"[newTabularURL]\">\n New Tabular Datasource\n </button>\n <button mat-menu-item [routerLink]=\"[newDocumentURL]\">\n New Document Datasource\n </button>\n </mat-menu>\n </div>\n }\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n @if (!canImportData) {\n <div class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Imported Data is reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n }\n @if (canImportData) {\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"text-sm block w-full rounded-none pl-10 border-t-0 border-l-0 border-r-0 border-gray-300\"\n placeholder=\"Search {{title || 'datasources'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n @if (datasources.length) {\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"2\" scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 py-3.5 px-4 text-left text-xs font-semibold text-gray-900\">\n @if (!admin) {\n <span>Project&nbsp;</span>\n }{{title || 'Datasources'}}\n </th>\n </tr>\n @for (element of datasources; track element; let i = $index) {\n <tr class=\"hover:bg-gray-50\">\n <td class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [class]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex flex-col\">\n <div\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"explore(element)\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n @if (element.viewDescription && element.description) {\n <div class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n }\n </div>\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [class]=\"{'border-b-0': i === datasources.length - 1, 'border-b': i !== datasources.length - 1}\">\n <div class=\"flex items-center justify-end\">\n @if (isProjectAdmin) {\n @if (element.type === 'custom') {\n <button mat-button color=\"primary\"\n [routerLink]=\"[newTabularURL, element.key]\">\n Edit\n </button>\n }\n @if (element.type === 'document') {\n <button mat-button color=\"primary\"\n [routerLink]=\"[newDocumentURL, element.key]\">\n Edit\n </button>\n }\n @if (element.type === 'document' || element.type === 'custom') {\n <div class=\"divider\"></div>\n }\n }\n <button mat-button color=\"primary\"\n (click)=\"explore(element)\"> {{exploreText || 'Explore'}}</button>\n @if (element.type === 'document' || element.type === 'custom') {\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"delete(element.key)\">Delete</button>\n </mat-menu>\n }\n </div>\n </td>\n </tr>\n }\n @if (!filterResults) {\n <tr>\n <td colspan=\"2\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasources.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n</div>\n","import {Component, Inject, Input, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {ProjectService} from '../../services/project.service';\nimport {TagService} from '../../services/tag.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-project-picker',\n templateUrl: './project-picker.component.html',\n styleUrls: ['./project-picker.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ProjectPickerComponent implements OnInit {\n\n public projects: any = [];\n public addNew = false;\n public newName;\n public newDescription;\n public searchText = new BehaviorSubject<string>('');\n public reload = new Subject();\n public activeProject: any = {};\n public isAdmin = false;\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n\n private updateProject = '';\n\n constructor(public dialogRef: MatDialogRef<ProjectPickerComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private projectService: ProjectService,\n private tagService: TagService) {\n }\n\n ngOnInit(): void {\n this.isAdmin = !!this.data.isAdmin;\n this.activeProject = this.projectService.activeProject.getValue();\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n\n merge(this.searchText, this.reload).pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getProjects()\n )\n ).subscribe((projects: any) => {\n this.projects = projects;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public editProject(project: any) {\n this.newName = project.name;\n this.newDescription = project.description;\n this.addNew = true;\n this.updateProject = project.projectKey;\n }\n\n public createProject() {\n if (this.updateProject) {\n return this.projectService.updateProject(this.newName, this.newDescription, this.updateProject)\n .then(() => {\n this.newName = '';\n this.newDescription = '';\n this.addNew = false;\n this.updateProject = '';\n this.reload.next(Date.now());\n });\n }\n return this.projectService.createProject(this.newName, this.newDescription).then(() => {\n this.newName = '';\n this.newDescription = '';\n this.addNew = false;\n this.reload.next(Date.now());\n });\n }\n\n public removeProject(key: string) {\n const message = 'Are you sure you would like to remove this project?';\n if (window.confirm(message)) {\n this.projectService.removeProject(key).then(() => {\n if (this.projectService.activeProject.getValue() &&\n this.projectService.activeProject.getValue().projectKey === key) {\n this.projectService.resetActiveProject();\n }\n this.reload.next(Date.now());\n });\n }\n }\n\n public activateProject(project) {\n this.projectService.setActiveProject(project);\n this.tagService.resetActiveTag();\n this.dialogRef.close(project);\n }\n\n private getProjects() {\n return this.projectService.getProjects(\n this.searchText.getValue(),\n this.limit,\n this.offset\n ).pipe(map((projects: any) => {\n this.endOfResults = projects.length < this.limit;\n return projects;\n })\n );\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Projects</h2>\n @if (isAdmin) {\n <button mat-stroked-button color=\"primary\" (click)=\"addNew = !addNew\">\n <mat-icon>add</mat-icon>\n New Project\n </button>\n }\n @if (activeProject) {\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n }\n </div>\n\n <div class=\"dialog-content p-0\">\n\n <div class=\"h-full flex flex-col justify-between\">\n\n @if (!addNew) {\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div\n class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-1 border-l-0 border-r-0 border-gray-300\"\n placeholder=\"Search for a project\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n }\n\n <div class=\"h-full flex-1 overflow-y-scroll\">\n @if (!addNew) {\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Checked</span>\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Name\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Description\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Key\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (project of projects; track project) {\n <tr\n class=\"hover:bg-gray-50 cursor-pointer\">\n <td (click)=\"activateProject(project)\" class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm \">\n @if (activeProject && activeProject.projectKey === project.projectKey) {\n <mat-icon color=\"primary\"\n >\n check_circle\n </mat-icon>\n }\n </td>\n <td (click)=\"activateProject(project)\" class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ project.name }}\n </td>\n <td (click)=\"activateProject(project)\" class=\"border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ project.description }}\n </td>\n <td (click)=\"activateProject(project)\" class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ project.projectKey }}\n </td>\n <td class=\"w-16 relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button mat-icon-button color=\"primary\"\n (click)=\"editProject(project)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button color=\"warn\"\n (click)=\"removeProject(project.projectKey)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n <div class=\"p-4\">\n @if (isAdmin && !projects.length) {\n <p class=\"m-4 font-light text-lg text-center\">\n Please create a new project to begin.\n </p>\n }\n @if (!isAdmin && !projects.length) {\n <p class=\"m-4 font-light text-lg text-center\">\n You have not been granted access to any projects. Please contact the account administrator.\n </p>\n }\n </div>\n }\n\n @if (addNew) {\n <div class=\"p-4\">\n <div class=\"my-4\">\n <p><b>Project Name</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter project name\" [(ngModel)]=\"newName\">\n </div>\n <div class=\"my-4\">\n <p class=\"mt-1\"><b>Project Description</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter project description\"\n [(ngModel)]=\"newDescription\">\n </div>\n </div>\n }\n </div>\n\n @if (!addNew) {\n <div\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{ offset + 1 }}\n - {{ (page * limit) - (limit - projects.length) }}\n </div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n @if (!addNew && activeProject) {\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n }\n @if (addNew) {\n <button mat-button mat-stroked-button type=\"button\" (click)=\"addNew = false;\">Cancel</button>\n }\n\n @if (addNew) {\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"createProject()\" [disabled]=\"!newName || !newDescription\">Save Project\n </button>\n }\n </div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {TagService} from '../../services/tag.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\n\n@Component({\n selector: 'ki-tag-picker',\n templateUrl: './tag-picker.component.html',\n styleUrls: ['./tag-picker.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class TagPickerComponent implements OnInit {\n\n public tags: any = [];\n public addNew = false;\n public searchText = new BehaviorSubject<string>('');\n public reload = new Subject();\n public activeTag: any = {};\n public newName;\n public newDescription;\n\n constructor(public dialogRef: MatDialogRef<TagPickerComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private tagService: TagService,\n @Inject(KININTEL_CONFIG) public config: KinintelModuleConfig) {\n }\n\n ngOnInit(): void {\n\n this.activeTag = this.tagService.activeTag.getValue() || {};\n\n merge(this.searchText, this.reload).pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getTags()\n )\n ).subscribe((tags: any) => {\n this.tags = tags;\n });\n\n }\n\n public activateTag(tag) {\n this.tagService.setActiveTag(tag);\n this.dialogRef.close();\n }\n\n public removeTag(tagKey) {\n const message = `Are you sure you would like to remove this ${this.config.tagLabel}?`;\n if (window.confirm(message)) {\n this.tagService.removeTag(tagKey).then(() => {\n if (this.tagService.activeTag.getValue() &&\n this.tagService.activeTag.getValue().key === tagKey) {\n this.tagService.resetActiveTag();\n }\n this.reload.next(Date.now());\n });\n }\n }\n\n public createTag() {\n this.tagService.saveTag(this.newName, this.newDescription).then(() => {\n this.newName = '';\n this.newDescription = '';\n this.addNew = false;\n this.reload.next(Date.now());\n });\n }\n\n private getTags() {\n return this.tagService.getTags(\n this.searchText.getValue()\n ).pipe(map((tags: any) => {\n return tags;\n })\n );\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>{{config.tagMenuLabel || 'Tags'}}</h2>\n <button mat-stroked-button color=\"primary\" (click)=\"addNew = !addNew\">\n <mat-icon>add</mat-icon>\n New {{config.tagLabel || 'Tag'}}\n </button>\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n\n @if (!addNew) {\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div\n class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-1 border-l-0 border-gray-300\"\n placeholder=\"Search {{config.tagMenuLabel || 'tags'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Checked</span>\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Name\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Description\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Key\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (tag of tags; track tag) {\n <tr (click)=\"activateTag(tag)\"\n class=\"hover:bg-gray-50 cursor-pointer\">\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm \">\n @if (activeTag.key === tag.key) {\n <mat-icon color=\"primary\">check_circle</mat-icon>\n }\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{tag.tag}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{tag.description}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{tag.key}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button mat-icon-button color=\"warn\" (click)=\"removeTag(tag.key)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- <ng-template [ngIf]=\"!addNew\">-->\n <!-- <input class=\"full\" type=\"text\" placeholder=\"Search {{config.tagMenuLabel || 'tags'}}\" (keyup)=\"searchText.next($event.target.value)\">-->\n\n <!-- <table class=\"hover\">-->\n <!-- <thead>-->\n <!-- <tr>-->\n <!-- <th></th>-->\n <!-- <th>Name</th>-->\n <!-- <th>Description</th>-->\n <!-- <th>Key</th>-->\n <!-- <th></th>-->\n <!-- </tr>-->\n<!-- </thead>-->\n<!-- <tbody>-->\n<!-- <tr >-->\n<!-- <td>-->\n<!-- <mat-icon color=\"primary\" *ngIf=\"activeTag.key === tag.key\">check_circle</mat-icon>-->\n<!-- </td>-->\n<!-- <td>{{tag.tag}}</td>-->\n<!-- <td>{{tag.description}}</td>-->\n<!-- <td>{{tag.key}}</td>-->\n<!-- <td class=\"text-right\">-->\n<!-- <button mat-icon-button color=\"warn\" (click)=\"removeTag(tag.key)\">-->\n<!-- <mat-icon>clear</mat-icon>-->\n<!-- </button>-->\n<!-- </td>-->\n<!-- </tr>-->\n\n<!-- </tbody>-->\n<!-- </table>-->\n<!-- </ng-template>-->\n\n@if (addNew) {\n <div class=\"p-4\">\n <div class=\"my-4\">\n <p><b>{{config.tagLabel || 'Tag'}} Name</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter {{config.tagLabel || 'tag'}} name\" [(ngModel)]=\"newName\">\n </div>\n <div class=\"my-4\">\n <p class=\"mt-1\"><b>{{config.tagLabel || 'Tag'}} Description</b></p>\n <input class=\"full\" type=\"text\" placeholder=\"Enter {{config.tagLabel || 'Tag'}} description\" [(ngModel)]=\"newDescription\">\n </div>\n </div>\n}\n\n\n</div>\n\n<div class=\"dialog-footer\">\n @if (!addNew) {\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n }\n @if (addNew) {\n <button mat-button mat-stroked-button type=\"button\" (click)=\"addNew = false;\">Cancel</button>\n }\n\n @if (addNew) {\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"createTag()\" [disabled]=\"!newName || !newDescription\">Create {{config.tagLabel || 'Tag'}}\n </button>\n }\n</div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, Subject, Subscription} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {TagService} from '../../services/tag.service';\nimport {ProjectService} from '../../services/project.service';\nimport {DashboardService} from '../../services/dashboard.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\nimport {MatDialog} from '@angular/material/dialog';\nimport {MetadataComponent} from '../metadata/metadata.component';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-dashboards',\n templateUrl: './dashboards.component.html',\n styleUrls: ['./dashboards.component.sass'],\n standalone: false\n})\nexport class DashboardsComponent implements OnInit {\n\n @Input() headingLabel: string;\n @Input() shared: boolean;\n @Input() allowNew: boolean;\n @Input() admin: boolean;\n @Input() accountId: any;\n @Input() viewURL = '/dashboards/view/';\n @Input() editURL: string;\n\n public dashboards: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public activeTagSub = new Subject();\n public projectSub = new Subject();\n public categories: any = [];\n public filteredCategories: any = [];\n public Date = Date;\n public activeTag: any;\n public reload = new Subject();\n public loading = true;\n\n private tagSub: Subscription;\n\n constructor(private router: Router,\n private tagService: TagService,\n private projectService: ProjectService,\n private dashboardService: DashboardService,\n private dialog: MatDialog,\n @Inject(KININTEL_CONFIG) public config: KinintelModuleConfig) {\n }\n\n ngOnInit(): void {\n if (this.tagService) {\n this.activeTagSub = this.tagService.activeTag;\n this.tagSub = this.tagService.activeTag.subscribe(tag => this.activeTag = tag);\n }\n\n if (this.projectService) {\n this.projectSub = this.projectService.activeProject;\n }\n\n merge(this.searchText, this.activeTagSub, this.projectSub, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDashboards()\n )\n ).subscribe((dashboards: any) => {\n this.dashboards = dashboards;\n this.loading = false;\n });\n\n this.getCategories();\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n\n public edit(id) {\n const route = _.filter(this.router.url.split('/'))[0];\n this.router.navigateByUrl(`${this.editURL || route}/${id}${this.admin ? '?a=true' : ''}`);\n }\n\n public copy(id) {\n const route = _.filter(this.router.url.split('/'))[0];\n this.router.navigateByUrl(`${this.editURL || route}/copy/${id}${this.admin ? '?a=true' : ''}`);\n }\n\n public extend(id) {\n const route = _.filter(this.router.url.split('/'))[0];\n this.router.navigateByUrl(`${this.editURL || route}/extend/${id}${this.admin ? '?a=true' : ''}`);\n }\n\n public delete(id) {\n const message = 'Are you sure you would like to completely delete this Dashboard?';\n if (window.confirm(message)) {\n this.dashboardService.removeDashboard(id).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n public toggleCategory(event, category) {\n event.stopPropagation();\n category.checked = !category.checked;\n this.updateCategoryFilters();\n }\n\n public updateCategoryFilters() {\n this.offset = 0;\n this.page = 1;\n this.reload.next(Date.now());\n }\n\n public editMetadata(searchResult) {\n const dialogRef = this.dialog.open(MetadataComponent, {\n width: '700px',\n height: '900px',\n data: {\n metadata: _.clone(searchResult),\n service: this.dashboardService\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.reload.next(Date.now());\n this.getCategories();\n }\n });\n }\n\n public removeActiveTag() {\n this.tagService.resetActiveTag();\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n private getDashboards() {\n const checkedCategories = _.filter(this.categories, 'checked');\n return this.dashboardService.getDashboards(\n this.searchText.getValue() || '',\n this.limit.toString(),\n this.offset.toString(),\n this.shared ? null : (!_.isNil(this.accountId) ? this.accountId : ''),\n _.map(checkedCategories, 'key')\n ).pipe(map((dashboards: any) => {\n this.endOfResults = dashboards.length < this.limit;\n return dashboards;\n })\n );\n }\n\n private getCategories() {\n this.dashboardService.getDashboardCategories(this.shared).then(categories => this.categories = categories);\n }\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <div class=\"flex items-center\">\n <h1 class=\"text-2xl font-bold text-gray-900\">{{headingLabel || 'Dashboards'}}</h1>\n @if (activeTag) {\n <mat-chip-list class=\"overflow-hidden\">\n <mat-chip class=\"mb-4 ml-2 active-tag\" [removable]=\"true\" (removed)=\"removeActiveTag()\">\n <span><b>{{config.tagLabel || 'Tag'}}:&nbsp;</b>{{activeTag ? activeTag.tag : ''}}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-list>\n }\n </div>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the dashboards currently available.\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n @if (!shared) {\n <button mat-flat-button color=\"primary\" (click)=\"edit(0)\">\n Create New Dashboard\n </button>\n }\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search dashboards\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n @if (dashboards.length) {\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"2\" scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n <div class=\"w-full flex items-center justify-between\">\n Dashboards\n <button type=\"button\" [matMenuTriggerFor]=\"projectCategories\"\n [disabled]=\"!categories.length\"\n class=\"disabled:opacity-50 -ml-px relative inline-flex items-center py-3 px-4 border-l border-gray-300 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 focus:outline-none border-t-0 border-r-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-gray-400\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n <span class=\"ml-2\">Categories</span>\n <svg class=\"ml-2.5 -mr-1.5 h-5 w-5 text-gray-400\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </button>\n <mat-menu #projectCategories=\"matMenu\">\n @for (category of categories; track category) {\n <button (click)=\"toggleCategory($event, category)\"\n mat-menu-item>\n <div class=\"flex items-center\">\n @if (category.checked) {\n <mat-icon color=\"primary\">check_box</mat-icon>\n }\n @if (!category.checked) {\n <mat-icon>check_box_outline_blank</mat-icon>\n }\n {{category.category}}\n </div>\n </button>\n }\n </mat-menu>\n </div>\n </th>\n </tr>\n @for (element of dashboards; track element; let i = $index) {\n <tr class=\"hover:bg-gray-50\">\n <td class=\"border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [class]=\"{'border-b-0': i === dashboards.length - 1, 'border-b': i !== dashboards.length - 1}\">\n <div class=\"flex flex-col\">\n <div class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n [routerLink]=\"[viewURL + element.id]\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin w-2/3 overflow-ellipsis overflow-hidden whitespace-nowrap cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n @if (element.categories.length) {\n <div class=\"inline-category\">\n @for (category of element.categories; track category) {\n <a>\n {{category.category}}\n </a>\n }\n </div>\n }\n @if (element.viewDescription && element.description) {\n <div class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n }\n </div>\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [class]=\"{'border-b-0': i === dashboards.length - 1, 'border-b': i !== dashboards.length - 1}\">\n <div class=\"flex items-center justify-end\">\n <button mat-button color=\"primary\" [routerLink]=\"[viewURL + element.id]\"> View</button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"edit(element.id)\">Edit Dashboard</button>\n <button mat-menu-item (click)=\"copy(element.id)\">Copy Dashboard</button>\n <button mat-menu-item (click)=\"extend(element.id)\">Extend Dashboard</button>\n <button mat-menu-item (click)=\"editMetadata(element)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(element.id)\">Delete Dashboard</button>\n </mat-menu>\n </div>\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"2\"\n class=\"whitespace-nowrap border-b border-gray-200 py-3 px-4 text-sm font-medium text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\" class=\"mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n</div>\n\n@if (!dashboards.length && !loading) {\n <div class=\"p-4\">\n @if (!shared) {\n <button type=\"button\" (click)=\"edit(0)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">dashboard</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create New Dashboard</span>\n </button>\n }\n </div>\n}\n","import {Inject, Injectable} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../kinintel-config';\nimport {ProjectService} from './project.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n\n constructor(private http: HttpClient,\n @Inject(KININTEL_CONFIG) private config: KinintelModuleConfig,\n private projectService: ProjectService) {\n }\n\n public getNotificationGroups(limit = '10', offset = '0') {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.get(`${this.config.backendURL}/notification/group`, {\n params: {projectKey, limit, offset}\n });\n }\n\n public getNotificationGroup(id) {\n return this.http.get(`${this.config.backendURL}/notification/group/${id}`).toPromise();\n }\n\n public removeNotificationGroup(id) {\n return this.http.delete(`${this.config.backendURL}/notification/group/${id}`).toPromise();\n }\n\n public saveNotificationGroup(notification) {\n const projectKey = this.projectService.activeProject.getValue() ? this.projectService.activeProject.getValue().projectKey : '';\n\n return this.http.post(`${this.config.backendURL}/notification/group?projectKey=${projectKey}`, notification)\n .toPromise();\n }\n}\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {NotificationService} from '../../../services/notification.service';\nimport {COMMA, ENTER} from '@angular/cdk/keycodes';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {BehaviorSubject, merge, Observable, ObservableInput, Subject} from 'rxjs';\nimport {UserService} from 'ng-kiniauth';\nimport {MatAutocompleteSelectedEvent} from '@angular/material/autocomplete';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-edit-notification-group',\n templateUrl: './edit-notification-group.component.html',\n styleUrls: ['./edit-notification-group.component.sass'],\n standalone: false\n})\nexport class EditNotificationGroupComponent implements OnInit {\n\n public notification: any = {communicationMethod: 'email'};\n public externalMembers: any = [];\n public users: any = [];\n public notificationGroupMembers: any = [];\n public testSent = false;\n public selectable = true;\n public removable = true;\n public searchText = new BehaviorSubject<string>('');\n public _ = _;\n\n public readonly separatorKeysCodes = [ENTER, COMMA] as const;\n\n private reset = new Subject();\n\n constructor(private notificationService: NotificationService,\n private route: ActivatedRoute,\n private router: Router,\n private userService: UserService,\n public dialogRef: MatDialogRef<EditNotificationGroupComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n const id = this.route.snapshot.params.id || this.data.groupId;\n this.notificationService.getNotificationGroup(id).then((notification: any) => {\n this.notification = notification || {communicationMethod: 'email'};\n this.notificationGroupMembers = this.notification.members || [];\n });\n\n merge(this.searchText, this.reset)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getUsers() as unknown as ObservableInput<any>\n )\n )\n .subscribe((users: any) => {\n this.users = users;\n });\n }\n\n public search(searchTerm: string) {\n this.searchText.next(searchTerm);\n }\n\n public userSelected(event: MatAutocompleteSelectedEvent, searchInput) {\n const user = event.option.value;\n this.notificationGroupMembers.push({\n user: {id: user.id, name: user.name},\n });\n\n searchInput.value = '';\n this.reset.next(Date.now());\n }\n\n public addExternalMember(event) {\n const value = (event.target.value || '').trim();\n\n if (value) {\n this.notificationGroupMembers.push({\n memberData: value\n });\n }\n\n // Clear the input value\n event.target.value = '';\n }\n\n public cancel() {\n if (!this.data) {\n this.router.navigate(['/notification-groups']);\n } else {\n this.dialogRef.close(false);\n }\n }\n\n public save() {\n this.notification.members = [];\n this.notificationGroupMembers.forEach(member => {\n this.notification.members.push({\n user: member.user,\n memberData: member.memberData\n });\n });\n this.notificationService.saveNotificationGroup(this.notification).then(() => {\n if (!this.data) {\n this.router.navigate(['/notification-groups']);\n } else {\n this.dialogRef.close(true);\n }\n });\n }\n\n private getUsers() {\n return (this.userService.getAccountUsers(\n this.searchText.getValue(),\n '10',\n '0'\n ) as unknown as Observable<any>).pipe(map((data: any) => {\n return data.results;\n }));\n }\n}\n","<div class=\"container mx-auto max-w-screen-lg\">\n\n <h2>Notification Group</h2>\n\n\n <label class=\"mb-4\">\n Name\n <input type=\"text\" [(ngModel)]=\"notification.name\">\n </label>\n\n <label class=\"mb-4\">\n Type\n <select [(ngModel)]=\"notification.communicationMethod\">\n <option value=\"email\">Email</option>\n <option value=\"internal\">Internal</option>\n </select>\n </label>\n\n <label class=\"mb-8\">\n Select Users\n <input type=\"text\" #userSearch class=\"mb-2\"\n placeholder=\"Search for a user\"\n [matAutocomplete]=\"auto\"\n (keyup)=\"search($event.target.value)\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"userSelected($event, userSearch)\">\n @for (user of users; track user) {\n <mat-option [value]=\"user\">\n {{ user.name }}\n </mat-option>\n }\n </mat-autocomplete>\n <mat-chip-set>\n @for (member of _.filter(notificationGroupMembers, 'user'); track member) {\n <mat-chip\n [removable]=\"true\" (removed)=\"_.remove(notificationGroupMembers, {user: member})\">\n {{ member.user.name }}\n @if (removable) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip>\n }\n </mat-chip-set>\n </label>\n\n <label class=\"mb-8\">\n External Recipients\n <input type=\"text\" class=\"mb-2\"\n placeholder=\"Enter recipient data\"\n (keyup.enter)=\"addExternalMember($event)\">\n\n <mat-chip-set>\n @for (member of _.filter(notificationGroupMembers, 'memberData'); track member) {\n <mat-chip\n [removable]=\"true\"\n (removed)=\"_.remove(notificationGroupMembers, {memberData: member.memberData})\">\n {{ member.memberData }}\n @if (removable) {\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip>\n }\n </mat-chip-set>\n </label>\n\n @if (testSent) {\n <div class=\"test-sent\">\n <p>\n <mat-icon>check_circle</mat-icon>\n </p>\n <p>Test {{ notification.type }} has been sent to the following recipients:\n @for (recipient of notification.recipients; track recipient; let i = $index) {\n @if (i > 0) {\n <span>,&nbsp;</span>\n }<b>{{ recipient }}</b>\n }\n </p>\n </div>\n }\n\n <div class=\"py-4 align-center justify-between\">\n <button mat-stroked-button (click)=\"cancel()\">\n Cancel\n </button>\n <div>\n <button mat-stroked-button class=\"send-test\" color=\"primary\" [disabled]=\"false\">\n Send Test\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"save()\">\n Save Changes\n </button>\n </div>\n\n </div>\n\n\n</div>\n","import {Component, OnInit} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {NotificationService} from '../../services/notification.service';\nimport {EditNotificationGroupComponent} from '../notification-groups/edit-notification-group/edit-notification-group.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-notification-groups',\n templateUrl: './notification-groups.component.html',\n styleUrls: ['./notification-groups.component.sass'],\n standalone: false\n})\nexport class NotificationGroupsComponent implements OnInit {\n\n public notificationGroups = [];\n public limit = new BehaviorSubject(10);\n public offset = new BehaviorSubject(0);\n public page = 1;\n public endOfResults = false;\n public loading = true;\n\n private reload = new Subject();\n\n constructor(private notificationService: NotificationService,\n private router: Router,\n private matDialog: MatDialog) {\n }\n\n ngOnInit(): void {\n merge(this.limit, this.offset, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getNotificationGroups()\n )\n ).subscribe((groups: any) => {\n this.endOfResults = groups.length < this.limit.getValue();\n this.notificationGroups = groups;\n this.loading = false;\n });\n }\n\n public editNotification(id) {\n const dialogRef = this.matDialog.open(EditNotificationGroupComponent, {\n width: '800px',\n height: '575px',\n data: {\n groupId: id\n }\n });\n\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.reload.next(Date.now());\n }\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset.next((this.limit.getValue() * this.page) - this.limit.getValue());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset.next((this.limit.getValue() * this.page) - this.limit.getValue());\n }\n\n public pageSizeChange(value) {\n this.limit.next(value);\n }\n\n public removeNotification(id) {\n const message = 'Are you sure you would like to remove this notification group?';\n if (window.confirm(message)) {\n this.notificationService.removeNotificationGroup(id).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n private getNotificationGroups() {\n return this.notificationService.getNotificationGroups(\n this.limit.getValue().toString(),\n this.offset.getValue().toString()\n ).pipe(map((snapshots: any) => {\n return _.filter(snapshots, snapshot => {\n return snapshot.taskStatus !== 'PENDING';\n });\n })\n );\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Notification Groups</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the notification groups currently available.\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button type=\"button\" (click)=\"editNotification(0)\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create Notification Group\n </button>\n </div>\n </div>\n</div>\n\n@if (!notificationGroups.length && !loading) {\n <div class=\"p-4\">\n <button type=\"button\" (click)=\"editNotification(0)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">notifications\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Notification Group</span>\n </button>\n </div>\n}\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n @if (notificationGroups.length) {\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Name\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Type\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (element of notificationGroups; track element; let i = $index) {\n <tr\n class=\"cursor-pointer hover:bg-gray-50\">\n <td (click)=\"editNotification(element.id)\"\n [class]=\"{'border-b-0': i === notificationGroups.length - 1, 'border-b': i !== notificationGroups.length - 1}\"\n class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{element.name}}\n </td>\n <td (click)=\"editNotification(element.id)\"\n [class]=\"{'border-b-0': i === notificationGroups.length - 1, 'border-b': i !== notificationGroups.length - 1}\"\n class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-500 capitalize\">\n {{element.communicationMethod}}\n </td>\n <td (click)=\"editNotification(element.id)\"\n [class]=\"{'border-b-0': i === notificationGroups.length - 1, 'border-b': i !== notificationGroups.length - 1}\"\n class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm\">\n @if (element.default) {\n <mat-chip-list class=\"flex justify-end\">\n <mat-chip color=\"primary\" selected>Default</mat-chip>\n </mat-chip-list>\n }\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm\"\n [class]=\"{'border-b-0': i === notificationGroups.length - 1, 'border-b': i !== notificationGroups.length - 1}\">\n <button mat-icon-button class=\"text-gray-500\" (click)=\"removeNotification(element.id)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"5\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm font-medium text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset.getValue() + 1}} - {{(page * limit.getValue()) - (limit.getValue() - notificationGroups.length)}}</div>\n <select [value]=\"limit.getValue()\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n }\n </div>\n </div>\n </div>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {ProjectService} from '../../../lib/services/project.service';\nimport {AlertService} from '../../../lib/services/alert.service';\nimport moment from 'moment';\n\n@Component({\n selector: 'ki-alert-groups',\n templateUrl: './alert-groups.component.html',\n styleUrls: ['./alert-groups.component.sass'],\n standalone: false\n})\nexport class AlertGroupsComponent implements OnInit {\n\n @Input() routePath = '/alert-groups';\n\n public alertGroups: any = [];\n public searchText = new BehaviorSubject('');\n public limit = new BehaviorSubject(10);\n public offset = new BehaviorSubject(0);\n public projectSub = new Subject();\n public moment = moment;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n\n private reload = new Subject();\n\n constructor(private projectService: ProjectService,\n private alertService: AlertService) {\n\n }\n\n ngOnInit(): void {\n if (this.projectService) {\n this.projectSub = this.projectService.activeProject;\n }\n\n merge(this.searchText, this.limit, this.offset, this.projectSub, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getAlertGroups()\n )\n ).subscribe((alertGroups: any) => {\n this.endOfResults = alertGroups.length < this.limit.getValue();\n this.alertGroups = alertGroups;\n this.loading = false;\n });\n\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset.next((this.limit.getValue() * this.page) - this.limit.getValue());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset.next((this.limit.getValue() * this.page) - this.limit.getValue());\n }\n\n public pageSizeChange(value) {\n this.limit.next(value);\n }\n\n public delete(id) {\n const message = 'Are you sure you would like to delete this Alert Group?';\n if (window.confirm(message)) {\n this.alertService.deleteAlertGroup(id).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n private getAlertGroups() {\n return this.alertService.getAlertGroups(\n this.searchText.getValue() || '',\n this.limit.getValue().toString(),\n this.offset.getValue().toString()\n ).pipe(map((alertGroups: any) => {\n return alertGroups;\n })\n );\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Alert Groups</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the alert groups currently available.\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button type=\"button\" [routerLink]=\"[routePath, 0]\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create Alert Group\n </button>\n </div>\n </div>\n</div>\n\n@if (!alertGroups.length && !loading) {\n <div class=\"p-4\">\n <button type=\"button\" [routerLink]=\"[routePath, 0]\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">campaign</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Alert Group</span>\n </button>\n </div>\n}\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n @if (alertGroups.length) {\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search alert groups\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n }\n @if (alertGroups.length) {\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Name\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Run\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (element of alertGroups; track element; let i = $index) {\n <tr class=\"cursor-pointer hover:bg-gray-50\">\n <td [class]=\"{'border-b-0': i === alertGroups.length - 1, 'border-b': i !== alertGroups.length - 1}\"\n class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{element.title}}\n </td>\n <td [class]=\"{'border-b-0': i === alertGroups.length - 1, 'border-b': i !== alertGroups.length - 1}\"\n class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-900\">\n {{element.taskStatus}}\n </td>\n <td [class]=\"{'border-b-0': i === alertGroups.length - 1, 'border-b': i !== alertGroups.length - 1}\"\n class=\"whitespace-nowrap border-gray-200 py-2 px-4 text-sm text-gray-900\">\n {{moment.unix(element.taskNextStartTime.timestamp).format('DD/MM/YYYY HH:mm')}}\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm\"\n [class]=\"{'border-b-0': i === alertGroups.length - 1, 'border-b': i !== alertGroups.length - 1}\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" [routerLink]=\"[routePath, element.id]\"> Edit\n </button>\n <div class=\"divider\"></div>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"delete(element.id)\">Delete Alert Group</button>\n </mat-menu>\n </div>\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"5\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm font-medium text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <select [value]=\"limit.getValue()\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n }\n </div>\n </div>\n </div>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {NotificationService} from '../../../../lib/services/notification.service';\nimport {AlertService} from '../../../../lib/services/alert.service';\nimport {MatDialog} from '@angular/material/dialog';\nimport {EditNotificationGroupComponent} from '../../notification-groups/edit-notification-group/edit-notification-group.component';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {ActivatedRoute, Router} from '@angular/router';\n\n@Component({\n selector: 'ki-edit-alert-group',\n templateUrl: './edit-alert-group.component.html',\n styleUrls: ['./edit-alert-group.component.sass'],\n standalone: false\n})\nexport class EditAlertGroupComponent implements OnInit {\n\n @Input() routePath = '/alert-groups';\n\n public alertGroup: any = {};\n public notificationGroups: any = [];\n public showNewTaskTimePeriod = false;\n public newTaskTimePeriod: any = {};\n public _ = _;\n public Object = Object;\n\n constructor(private notificationService: NotificationService,\n private alertService: AlertService,\n private matDialog: MatDialog,\n private router: Router,\n private route: ActivatedRoute) {\n }\n\n ngOnInit(): void {\n const id = this.route.snapshot.params.id;\n this.alertService.getAlertGroup(id).then(alertGroup => {\n if (alertGroup) {\n this.alertGroup = alertGroup;\n }\n if (!this.alertGroup.taskTimePeriods || !this.alertGroup.taskTimePeriods.length) {\n if (!this.alertGroup.taskTimePeriods) {\n this.alertGroup.taskTimePeriods = [];\n }\n this.showNewTaskTimePeriod = true;\n }\n });\n this.loadNotificationGroups();\n }\n\n public notificationGroupDisplay(v1, v2) {\n return v1 && v2 && (v2.id === v2.id);\n }\n\n public createNotificationGroup() {\n const dialogRef = this.matDialog.open(EditNotificationGroupComponent, {\n width: '800px',\n height: '575px',\n data: {\n groupId: 0\n }\n });\n\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.loadNotificationGroups();\n }\n });\n }\n\n public save() {\n this.alertService.saveAlertGroup(this.alertGroup).then(() => {\n this.router.navigate([this.routePath]);\n });\n }\n\n private loadNotificationGroups() {\n this.notificationService.getNotificationGroups().toPromise().then(groups => {\n this.notificationGroups = groups;\n });\n }\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900 mb-0\">Alert Group</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n These details will be used to schedule alerts with the system.\n </p>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"space-y-8 divide-y divide-gray-200 p-6\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n <div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Name <span class=\"text-red-500\">*</span>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <input type=\"text\" name=\"title\" [(ngModel)]=\"alertGroup.title\"\n class=\"max-w-lg block w-full shadow-sm sm:max-w-xs sm:text-sm border-gray-300 rounded-md\">\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Time Periods <span class=\"text-red-500\">*</span>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <ki-task-time-periods [showTitle]=\"false\" [(taskTimePeriods)]=\"alertGroup.taskTimePeriods\"></ki-task-time-periods>\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Notification Groups <span class=\"text-red-500\">*</span>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <mat-select [(ngModel)]=\"alertGroup.notificationGroups\" multiple [compareWith]=\"notificationGroupDisplay\">\n @for (group of notificationGroups; track group) {\n <mat-option [value]=\"group\">{{group.name}}</mat-option>\n }\n </mat-select>\n <button mat-button color=\"primary\" (click)=\"createNotificationGroup()\">\n <mat-icon>group_add</mat-icon>&nbsp;Create new notification group\n </button>\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\"> Notification Title </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <input type=\"text\" name=\"notificationTitle\" [(ngModel)]=\"alertGroup.notificationTitle\"\n class=\"max-w-lg block w-full shadow-sm sm:max-w-xs sm:text-sm border-gray-300 rounded-md\">\n <p class=\"mt-2 text-sm text-gray-500\">Will be used as the subject for the notification</p>\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\"> Notification Prefix Text </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <textarea name=\"notificationPrefixText\" rows=\"3\" [(ngModel)]=\"alertGroup.notificationPrefixText\"\n class=\"max-w-lg shadow-sm block w-full sm:text-sm border border-gray-300 rounded-md\"></textarea>\n <p class=\"mt-2 text-sm text-gray-500\">Text to include at the beginning of the notification</p>\n </div>\n </div>\n\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\"> Notification Suffix Text </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <textarea name=\"notificationSuffixText\" rows=\"3\" [(ngModel)]=\"alertGroup.notificationSuffixText\"\n class=\"max-w-lg shadow-sm block w-full sm:text-sm border border-gray-300 rounded-md\"></textarea>\n <p class=\"mt-2 text-sm text-gray-500\">Text to include at the end of the notification</p>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n\n <div class=\"pt-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\" [routerLink]=\"[routePath]\"\n class=\"bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none\">Cancel</button>\n <button type=\"button\" (click)=\"save()\" [disabled]=\"!alertGroup.title || (!alertGroup.taskTimePeriods || !alertGroup.taskTimePeriods.length) || (!alertGroup.notificationGroups || !alertGroup.notificationGroups.length)\"\n class=\"disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-primary focus:outline-none\">\n Save Changes</button>\n </div>\n </div>\n</div>\n","import {Component, Inject, Input, OnDestroy, OnInit} from '@angular/core';\nimport {BehaviorSubject, interval, merge, Subject, Subscription} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport {DataExplorerComponent} from '../data-explorer/data-explorer.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport {TagService} from '../../services/tag.service';\nimport {ProjectService} from '../../services/project.service';\nimport {DatasetService} from '../../services/dataset.service';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\nimport * as lodash from 'lodash';\nimport {Router} from '@angular/router';\nimport {\n SnapshotProfileDialogComponent\n} from '../data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';\nimport {DataProcessorService} from '../../services/data-processor.service';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-snapshots',\n templateUrl: './snapshots.component.html',\n styleUrls: ['./snapshots.component.sass'],\n standalone: false\n})\nexport class SnapshotsComponent implements OnInit, OnDestroy {\n\n @Input() headingLabel: string;\n @Input() shared: boolean;\n @Input() admin: boolean;\n @Input() environment: any;\n\n public snapshots: any = {\n project: {\n data: [],\n limit: 10,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n categories: []\n },\n tag: {\n data: [],\n limit: 10,\n offset: 0,\n page: 1,\n endOfResults: false,\n shared: false,\n reload: new Subject(),\n categories: []\n }\n };\n public searchText = new BehaviorSubject('');\n public activeTagSub = new Subject();\n public activeTag: any;\n public _ = _;\n public canHaveSnapshots = false;\n\n private tagSub: Subscription;\n private reload = new Subject();\n private tagDataSub: Subscription;\n private projectChanges: Subscription;\n private tagChanges: Subscription;\n\n constructor(private dialog: MatDialog,\n private tagService: TagService,\n private projectService: ProjectService,\n private datasetService: DatasetService,\n private dataProcessorService: DataProcessorService,\n private router: Router,\n @Inject(KININTEL_CONFIG) public config: KinintelModuleConfig) {\n }\n\n ngOnInit(): void {\n this.canHaveSnapshots = this.projectService.doesActiveProjectHavePrivilege('snapshotaccess');\n\n if (this.canHaveSnapshots) {\n if (this.tagService) {\n this.activeTagSub = this.tagService.activeTag;\n this.tagSub = this.tagService.activeTag.subscribe(tag => {\n if (tag) {\n this.activeTag = tag;\n this.tagDataSub = merge(this.searchText, this.snapshots.tag.reload, this.projectService.activeProject, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getSnapshots(this.snapshots.tag)\n )\n ).subscribe((snapshots: any) => {\n this.snapshots.tag.data = snapshots;\n });\n\n this.tagChanges = interval(3000)\n .pipe(\n switchMap(() =>\n this.dataProcessorService.filterProcessorsByType(\n 'snapshot', this.searchText.getValue() || '', String(this.snapshots.tag.limit), String(this.snapshots.tag.offset)).pipe(\n map(result => {\n return result;\n }))\n )\n ).subscribe(snapshots => {\n this.snapshots.tag.data = snapshots;\n });\n } else {\n this.activeTag = null;\n if (this.tagDataSub) {\n this.tagDataSub.unsubscribe();\n }\n }\n\n });\n }\n\n merge(this.searchText, this.snapshots.project.reload, this.projectService.activeProject, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getSnapshots(this.snapshots.project, 'NONE')\n )\n ).subscribe((snapshots: any) => {\n this.snapshots.project.data = snapshots;\n });\n\n this.watchSnapshotChanges();\n\n this.searchText.subscribe(() => {\n _.forEach(this.snapshots, snapshot => {\n snapshot.page = 1;\n snapshot.offset = 0;\n });\n });\n }\n }\n\n ngOnDestroy() {\n if (this.tagSub) {\n this.tagSub.unsubscribe();\n }\n if (this.tagDataSub) {\n this.tagDataSub.unsubscribe();\n }\n this.stopSnapshotWatch();\n }\n\n public async triggerSnapshot(snapshotKey, snapshot) {\n await this.dataProcessorService.triggerProcessor(snapshotKey);\n snapshot.reload.next(Date.now());\n }\n\n public view(datasourceKey) {\n const datasetInstanceSummary = {\n datasetInstanceId: null,\n datasourceInstanceKey: datasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n };\n this.openDialogEditor(datasetInstanceSummary);\n }\n\n public viewParent(parentDatasetInstanceId) {\n this.datasetService.getDataset(parentDatasetInstanceId).then(datasetInstanceSummary => {\n this.openDialogEditor(datasetInstanceSummary);\n });\n }\n\n public removeActiveTag() {\n this.tagService.resetActiveTag();\n }\n\n public async editSnapshot(snapshotKey: string, project: any) {\n const snapshot: any = await this.dataProcessorService.getProcessor(snapshotKey);\n const datasetInstance = await this.datasetService.getDataset(snapshot.relatedObjectPrimaryKey);\n const dialogRef = this.dialog.open(SnapshotProfileDialogComponent, {\n width: '900px',\n height: '900px',\n data: {\n snapshot,\n datasetInstanceId: snapshot.relatedObjectPrimaryKey,\n datasetInstance\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n project.reload.next(Date.now());\n }\n });\n }\n\n public delete(snapshotProfileId, snapshot) {\n const message = 'Are you sure you would like to remove this Snapshot?';\n if (window.confirm(message)) {\n this.dataProcessorService.removeProcessor(snapshotProfileId).then(() => {\n snapshot.reload.next(Date.now());\n });\n }\n }\n\n public increaseOffset(snapshot) {\n snapshot.page = snapshot.page + 1;\n snapshot.offset = (snapshot.limit * snapshot.page) - snapshot.limit;\n snapshot.reload.next(Date.now());\n }\n\n public decreaseOffset(snapshot) {\n snapshot.page = snapshot.page <= 1 ? 1 : snapshot.page - 1;\n snapshot.offset = (snapshot.limit * snapshot.page) - snapshot.limit;\n snapshot.reload.next(Date.now());\n }\n\n public pageSizeChange(value, snapshot) {\n snapshot.page = 1;\n snapshot.offset = 0;\n snapshot.limit = value;\n snapshot.reload.next(Date.now());\n }\n\n private openDialogEditor(datasetInstanceSummary) {\n this.router.navigate(['/snapshots'], {fragment: _.kebabCase(datasetInstanceSummary.title || datasetInstanceSummary.datasourceInstanceKey)});\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n data: {\n datasetInstanceSummary,\n showChart: false,\n admin: this.admin,\n breadcrumb: 'Snapshots'\n }\n });\n this.stopSnapshotWatch();\n dialogRef.afterClosed().subscribe(res => {\n if (res && res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n } else {\n this.router.navigate(['/snapshots'], {fragment: null});\n }\n this.reload.next(Date.now());\n this.watchSnapshotChanges();\n });\n }\n\n private getSnapshots(snapshot, tags?) {\n return this.dataProcessorService.filterProcessorsByType(\n 'snapshot',\n this.searchText.getValue() || '',\n snapshot.limit.toString(),\n snapshot.offset.toString(),\n tags\n ).pipe(map((snapshots: any) => {\n snapshot.endOfResults = snapshots.length < snapshot.limit;\n return snapshots;\n })\n );\n }\n\n private watchSnapshotChanges() {\n this.projectChanges = interval(3000)\n .pipe(\n switchMap(() =>\n this.dataProcessorService.filterProcessorsByType(\n 'snapshot',\n this.searchText.getValue() || '', String(this.snapshots.project.limit), String(this.snapshots.project.offset), 'NONE').pipe(\n map(result => {\n return result;\n }))\n )\n ).subscribe(snapshots => {\n this.snapshots.project.data = snapshots;\n });\n }\n\n private stopSnapshotWatch() {\n if (this.projectChanges) {\n this.projectChanges.unsubscribe();\n }\n if (this.tagChanges) {\n this.tagChanges.unsubscribe();\n }\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <div class=\"flex items-center\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Snapshots</h1>\n @if (activeTag) {\n <mat-chip-list class=\"overflow-hidden\">\n <mat-chip class=\"mb-4 ml-2 active-tag\" [removable]=\"true\" (removed)=\"removeActiveTag()\">\n <span><b>{{config.tagLabel || 'Tag'}}:&nbsp;</b>{{activeTag ? activeTag.tag : ''}}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-list>\n }\n </div>\n\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the snapshots currently available.\n </p>\n </div>\n </div>\n </div>\n</div>\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n @if (!canHaveSnapshots) {\n <div class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Snapshots are reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n }\n @if (canHaveSnapshots) {\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search snapshots\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n @if (activeTag && snapshots.tag.data.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n {{environment.tagLabel}} Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (snapshot of snapshots.tag.data; track snapshot) {\n <tr>\n <td>\n @if (snapshot.taskStatus !== 'RUNNING') {\n <button color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/2 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.snapshotProfileTitle}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [class]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n @if (snapshot.taskStatus === 'PENDING') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n @if (snapshot.taskStatus === 'COMPLETED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'FAILED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'TIMED_OUT') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n }\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n @if (snapshot.config.createHistory) {\n <button mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n }\n @if (snapshot.config.createLatest) {\n <button mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n }\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.tag)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.tag)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"6\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.tag.offset + 1}} - {{(snapshots.tag.page * snapshots.tag.limit) - (snapshots.tag.limit - snapshots.tag.data.length)}}</div>\n <select [value]=\"snapshots.tag.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.tag)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n }\n @if (snapshots.project.data.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Project Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (snapshot of snapshots.project.data; track snapshot) {\n <tr>\n <td>\n @if (snapshot.taskStatus !== 'RUNNING') {\n <button color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/3 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.title}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [class]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED', 'bg-purple-500': snapshot.taskStatus === 'TIMED_OUT'}\">\n @if (snapshot.taskStatus === 'PENDING') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'RUNNING') {\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n }\n @if (snapshot.taskStatus === 'COMPLETED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'FAILED') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n }\n @if (snapshot.taskStatus === 'TIMED_OUT') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n }\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n @if (snapshot.config.createHistory) {\n <button mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n }\n @if (snapshot.config.createLatest) {\n <button mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n }\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.project)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.project)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n }\n <tr>\n <td colspan=\"6\"\n class=\"bg-gray-50 whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.project.offset + 1}} - {{(snapshots.project.page * snapshots.project.limit) - (snapshots.project.limit - snapshots.project.data.length)}}\n </div>\n <select [value]=\"snapshots.project.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.project)\"\n class=\"mr-8 p-2\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n }\n </table>\n </div>\n </div>\n }\n</div>\n</div>\n","import {\n AfterViewInit, ApplicationRef,\n Component, ComponentFactoryResolver, EmbeddedViewRef, HostBinding, Injector, Input, OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport {GridStack, GridStackNode} from 'gridstack';\n// THEN to get HTML5 drag&drop\nimport 'gridstack/dist/h5/gridstack-dd-native';\nimport {ItemComponentComponent} from '../../dashboard-editor/item-component/item-component.component';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {DashboardService} from '../../../services/dashboard.service';\nimport * as lodash from 'lodash';\nconst _ = lodash.default;\nimport {MatDialog} from '@angular/material/dialog';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport {AlertService} from '../../../services/alert.service';\nimport moment from 'moment';\nimport {Location} from '@angular/common';\nimport {ExternalService} from '../../../services/external.service';\nimport {Subject, Subscription} from 'rxjs';\nimport {DatasetService} from '../../../services/dataset.service';\n\n@Component({\n selector: 'ki-view-dashboard',\n templateUrl: './view-dashboard.component.html',\n styleUrls: ['./view-dashboard.component.sass'],\n encapsulation: ViewEncapsulation.None,\n standalone: false\n})\nexport class ViewDashboardComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild('viewContainer', {read: ViewContainerRef}) viewContainer: ViewContainerRef;\n\n @HostBinding('class.p-4') get t() {\n return this.dashboard.displaySettings && this.dashboard.displaySettings.fullScreen;\n }\n @HostBinding('class.dark-mode-dashboard') darkMode = false;\n\n @Input() dashboardService: any;\n @Input() alertService: any;\n @Input() datasetService: any;\n @Input() datasourceService: any;\n @Input() editAlerts: boolean;\n @Input() sidenavService: any;\n @Input() dashboardId: number;\n @Input() gridOnly = false;\n @Input() parameters: any;\n @Input() hideToolbar = false;\n @Input() actionEvents: any = [];\n @Input() external = false;\n @Input() reload: Subject<any>;\n @Input() cssGridSelector = 'view-grid-stack';\n\n public dashboard: any = {};\n public activeSidePanel: string = null;\n public _ = _;\n public editDashboardTitle = false;\n public fullScreen = false;\n public admin: boolean;\n public gridSpaces = [\n {\n label: 'Small',\n value: '2px'\n },\n {\n label: 'Medium',\n value: '5px'\n },\n {\n label: 'Large',\n value: '10px'\n }\n ];\n public refreshInterval = 0;\n public hideParameters = false;\n public fullOnly = false;\n\n private grid: GridStack;\n private queryParams: any = {};\n private itemComponents: ItemComponentComponent[] = [];\n private reloadSub: Subscription;\n\n constructor(private componentFactoryResolver: ComponentFactoryResolver,\n private applicationRef: ApplicationRef,\n private injector: Injector,\n private route: ActivatedRoute,\n private kiDashboardService: DashboardService,\n private dialog: MatDialog,\n private snackBar: MatSnackBar,\n private router: Router,\n private kiAlertService: AlertService,\n private location: Location,\n private externalService: ExternalService,\n private kiDatasetService: DatasetService) {\n }\n\n ngOnInit(): void {\n this.fullOnly = this.route.snapshot.data.full;\n if (this.fullOnly) {\n this.darkMode = localStorage.getItem('fullDashboardDarkMode') === 'true';\n this.refreshInterval = Number(localStorage.getItem('fullDashboardRefreshInterval') || 0);\n this.hideParameters = localStorage.getItem('fullDashboardHideParams') === 'true';\n }\n\n if (!this.dashboardService) {\n this.dashboardService = this.kiDashboardService;\n }\n\n if (!this.alertService) {\n this.alertService = this.kiAlertService;\n }\n\n if (!this.datasetService) {\n this.datasetService = this.kiDatasetService;\n }\n\n this.route.queryParams.subscribe(params => {\n const cloned = _.clone(params);\n this.admin = !!cloned.a;\n delete cloned.a;\n this.queryParams = cloned;\n });\n\n if (this.parameters) {\n _.forEach(this.parameters, (value, key) => {\n if (!this.queryParams[key]) {\n this.queryParams[key] = value;\n }\n });\n }\n\n if (this.reload) {\n this.reloadSub = this.reload.subscribe(res => {\n if (this.parameters) {\n _.forEach(this.parameters, (value, key) => {\n this.queryParams[key] = value;\n });\n\n Object.keys(this.queryParams).forEach(key => {\n if (Object.keys(this.dashboard.layoutSettings.parameters || {}).length) {\n if (this.dashboard.layoutSettings.parameters[key]) {\n if (this.dashboard.layoutSettings.parameters[key].type === 'date' ||\n this.dashboard.layoutSettings.parameters[key].type === 'datetime') {\n this.queryParams[key] = moment(this.queryParams[key]).format('YYYY-MM-DDTHH:mm');\n }\n this.dashboard.layoutSettings.parameters[key].value = this.queryParams[key];\n }\n }\n\n this.dashboard.datasetInstances.forEach(instance => {\n if (!_.values(instance.parameterValues).length) {\n instance.parameterValues = {};\n }\n instance.parameterValues[key] = this.queryParams[key];\n });\n });\n }\n this.reloadDashboard();\n });\n }\n }\n\n async ngAfterViewInit() {\n const options = {\n minRow: 1, // don't collapse when empty\n float: true,\n cellHeight: 20,\n minW: 768,\n disableOneColumnMode: false\n };\n this.grid = GridStack.init(options, '.' + this.cssGridSelector);\n this.grid.enableMove(false);\n this.grid.enableResize(false);\n\n this.grid.on('added', (event: Event, newItems: GridStackNode[]) => {\n newItems.forEach((item) => {\n let dashboardItemType = null;\n let itemElement: any = item.el.firstChild;\n let instanceId = null;\n\n if (item.content) {\n itemElement = document.createRange().createContextualFragment(item.content);\n dashboardItemType = itemElement.firstChild.dataset.dashboardItemType ?\n JSON.parse(itemElement.firstChild.dataset.dashboardItemType) : null;\n\n instanceId = itemElement.firstChild.id;\n }\n\n while (item.el.firstChild.firstChild) {\n item.el.firstChild.firstChild.remove();\n }\n\n this.addComponentToGridItem(item.el.firstChild, instanceId,\n dashboardItemType, !!dashboardItemType);\n });\n if (this.dashboard.displaySettings.inset) {\n this.updateGridSpacing(this.dashboard.displaySettings.inset, false);\n }\n });\n\n const dashboardId = this.dashboardId || this.route.snapshot.params.dashboard;\n\n if (this.external) {\n this.dashboard = await this.externalService.getDashboard(dashboardId, this.queryParams);\n\n this.darkMode = this.dashboard.externalSettings.darkMode;\n this.refreshInterval = this.dashboard.externalSettings.refreshInterval;\n this.hideParameters = !this.dashboard.externalSettings.showParameters;\n\n } else {\n this.dashboard = await this.dashboardService.getDashboard(dashboardId);\n }\n\n if (this.dashboard.layoutSettings?.parameters && Object.keys(this.dashboard.layoutSettings.parameters).length) {\n _.forEach(this.dashboard.layoutSettings.parameters, param => {\n if (param.type === 'list') {\n param.list = [];\n this.loadListParameters(param);\n }\n });\n }\n\n\n if (this.refreshInterval) {\n let count = 0;\n setInterval(() => {\n if (count > 10) {\n window.location.reload();\n } else {\n this.reloadDashboard();\n count++;\n }\n }, (this.refreshInterval * 1000));\n }\n\n Object.keys(this.queryParams).forEach(key => {\n if (Object.keys(this.dashboard.layoutSettings.parameters || {}).length) {\n if (this.dashboard.layoutSettings.parameters[key]) {\n if (this.dashboard.layoutSettings.parameters[key].type === 'date' ||\n this.dashboard.layoutSettings.parameters[key].type === 'datetime') {\n this.queryParams[key] = moment(this.queryParams[key]).format('YYYY-MM-DDTHH:mm');\n }\n this.dashboard.layoutSettings.parameters[key].value = this.queryParams[key];\n }\n }\n\n this.dashboard.datasetInstances.forEach(instance => {\n if (!_.values(instance.parameterValues).length) {\n instance.parameterValues = {};\n }\n instance.parameterValues[key] = this.queryParams[key];\n });\n });\n\n if (Object.keys(this.dashboard.layoutSettings.parameters || {}).length) {\n _.forEach(this.dashboard.layoutSettings.parameters, item => {\n item.locked = !!item.locked;\n });\n }\n\n if (!this.dashboard.displaySettings) {\n this.dashboard.displaySettings = {};\n }\n\n if (this.dashboard.layoutSettings) {\n if (this.dashboard.layoutSettings.grid && this.dashboard.layoutSettings.grid.length) {\n this.grid.load(this.dashboard.layoutSettings.grid);\n }\n } else {\n this.dashboard.layoutSettings = {};\n }\n\n if (this.sidenavService && !this.fullOnly) {\n setTimeout(() => {\n this.sidenavService.close();\n }, 0);\n }\n }\n\n ngOnDestroy() {\n document.body.classList.remove('dark');\n if (this.sidenavService) {\n this.sidenavService.open();\n }\n if (this.reloadSub) {\n this.reloadSub.unsubscribe();\n }\n }\n\n public back() {\n this.location.back();\n }\n\n public booleanUpdate(event, parameter) {\n parameter.value = event.checked;\n this.reloadDashboard();\n }\n\n public changeDateType(event, parameter, value) {\n event.stopPropagation();\n event.preventDefault();\n parameter._dateType = value;\n }\n\n public updatePeriodValue(value, period, parameter) {\n parameter.value = `${value}_${period}_AGO`;\n }\n\n public editNotifications() {\n this.editAlerts = !this.editAlerts;\n this.grid.removeAll();\n this.grid.load(this.dashboard.layoutSettings.grid);\n }\n\n public viewFullscreen() {\n const dashboardId = this.dashboardId || this.route.snapshot.params.dashboard;\n window.location.href = `/dashboards/${dashboardId}/full${this.admin ? '?a=true&' : '?'}`;\n }\n\n public toggleDarkMode() {\n this.darkMode = !this.darkMode;\n localStorage.setItem('fullDashboardDarkMode', String(this.darkMode));\n }\n\n public setRefreshInterval(intervalSeconds) {\n if (intervalSeconds) {\n localStorage.setItem('fullDashboardRefreshInterval', String(intervalSeconds));\n } else {\n localStorage.removeItem('fullDashboardRefreshInterval');\n }\n window.location.reload();\n }\n\n public toggleParameters() {\n this.hideParameters = !this.hideParameters;\n localStorage.setItem('fullDashboardHideParams', String(this.hideParameters));\n }\n\n public updateGridSpacing(space, save = true) {\n this.dashboard.displaySettings.inset = space;\n document.querySelectorAll('.grid-stack-item-content')\n .forEach((el: any) => el.style.inset = space);\n }\n\n public setParameterValue(parameter, value) {\n parameter.value = value;\n }\n\n public async loadListParameters(parameter: any) {\n if (parameter.settings && parameter.settings.datasetInstance) {\n return this.datasetService.evaluateDataset(parameter.settings.datasetInstance, '0', '100000')\n .then((data: any) => {\n const list = _.map(data.allData, item => {\n return {label: item[parameter.settings.labelColumn], value: item[parameter.settings.valueColumn]};\n });\n parameter.list = _.uniqWith(list, _.isEqual);\n });\n }\n }\n\n public async reloadDashboard() {\n for (const item of this.itemComponents) {\n if (item.dashboardDatasetInstance) {\n await item.init(true);\n }\n }\n }\n\n private addComponentToGridItem(element, instanceId?, dashboardItemType?, load?) {\n if (!this.dashboard.layoutSettings) {\n this.dashboard.layoutSettings = {};\n }\n if (!this.dashboard.displaySettings) {\n this.dashboard.displaySettings = {};\n }\n // create a component reference\n const componentRef = this.componentFactoryResolver.resolveComponentFactory(ItemComponentComponent)\n .create(this.injector);\n\n // get DOM element from component\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n domElem.dataset.dashboardItemType = JSON.stringify(dashboardItemType || {});\n\n element.appendChild(domElem);\n\n element.firstChild.id = instanceId ? instanceId : 'i' + Date.now().toString();\n instanceId = element.firstChild.id;\n\n componentRef.instance.viewOnly = true;\n componentRef.instance.admin = this.admin;\n componentRef.instance.grid = this.grid;\n componentRef.instance.dashboard = this.dashboard;\n componentRef.instance.editAlerts = this.editAlerts;\n componentRef.instance.actionEvents = this.actionEvents;\n componentRef.instance.external = !!this.external;\n componentRef.instance.queryParams = this.queryParams;\n componentRef.instance.optimise = false;\n\n const chartDetails = this.dashboard.layoutSettings.charts ? this.dashboard.layoutSettings.charts[instanceId] : null;\n\n const dashboardDatasetInstance = _.find(this.dashboard.datasetInstances, {instanceKey: instanceId}) || null;\n componentRef.instance.dashboardDatasetInstance = dashboardDatasetInstance;\n componentRef.instance.dashboardItemType = chartDetails || (dashboardItemType || {});\n componentRef.instance.itemInstanceKey = instanceId;\n componentRef.instance.configureClass = !load;\n componentRef.instance.init();\n if (load) {\n if (this.dashboard.layoutSettings.dependencies) {\n const dependencies = this.dashboard.layoutSettings.dependencies[instanceId] || {};\n if (!dependencies.instanceKeys || !dependencies.instanceKeys.length) {\n componentRef.instance.load();\n }\n } else {\n componentRef.instance.load();\n }\n }\n\n if (this.dashboard.alertsEnabled && !this.external) {\n if (dashboardDatasetInstance && dashboardDatasetInstance.alerts && dashboardDatasetInstance.alerts.length) {\n this.alertService.processAlertsForDashboardDatasetInstance(dashboardDatasetInstance)\n .then((res: any) => {\n if (res && res.length) {\n componentRef.instance.alert = true;\n componentRef.instance.alertData = res;\n const itemElement = document.getElementById(instanceId);\n itemElement.classList.add('alert');\n itemElement.parentElement.classList.add('alert');\n }\n });\n }\n }\n\n // attach component to the appRef so that it will be dirty checked.\n this.applicationRef.attachView(componentRef.hostView);\n\n const generalSettings = this.dashboard.layoutSettings.general ? this.dashboard.layoutSettings.general[instanceId] : null;\n if (generalSettings && generalSettings.transparent) {\n element.classList.add('bg-transparent');\n element.classList.remove('bg-white', 'shadow');\n } else {\n element.classList.add('bg-white', 'shadow');\n element.classList.remove('bg-transparent');\n }\n\n this.itemComponents.push(componentRef.instance);\n\n return componentRef;\n }\n\n private setDarkModeOnBody() {\n if (this.darkMode) {\n document.body.classList.add('dark');\n } else {\n document.body.classList.remove('dark');\n }\n }\n\n}\n","@if (!gridOnly) {\n @if (!hideToolbar) {\n <div class=\"dashboard-header align-center justify-between flex-wrap bg-white p-2 border-b border-gray-200\">\n <div class=\"flex items-center\">\n @if (fullOnly || external) {\n <button (click)=\"back()\" mat-icon-button class=\"mr-4\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n }\n <h2 class=\"dashboard-title ml-2\">{{dashboard.title}}</h2>\n </div>\n <div class=\"flex items-center\">\n @if (fullOnly) {\n @if (refreshInterval) {\n <div class=\"text-gray-400 text-xs\">every {{refreshInterval / 60}} Minutes</div>\n }\n <button mat-icon-button class=\"align-center\" [matMenuTriggerFor]=\"menu\"\n matTooltip=\"Set refresh interval\">\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"setRefreshInterval(0)\">Off</button>\n <button mat-menu-item (click)=\"setRefreshInterval(60)\">Every 1 Minute</button>\n <button mat-menu-item (click)=\"setRefreshInterval(300)\">Every 5 Minutes</button>\n <button mat-menu-item (click)=\"setRefreshInterval(600)\">Every 10 Minutes</button>\n <button mat-menu-item (click)=\"setRefreshInterval(1800)\">Every 30 Minutes</button>\n <button mat-menu-item (click)=\"setRefreshInterval(3600)\">Every 60 Minutes</button>\n </mat-menu>\n <button mat-icon-button class=\"align-center\" (click)=\"toggleParameters()\"\n matTooltip=\"Hide parameter bar\">\n <mat-icon>keyboard_hide</mat-icon>\n </button>\n <button mat-icon-button class=\"align-center\" matTooltip=\"Toggle between light/dark mode\"\n (click)=\"toggleDarkMode()\">\n @if (darkMode) {\n <mat-icon>light_mode</mat-icon>\n }\n @if (!darkMode) {\n <mat-icon>dark_mode</mat-icon>\n }\n </button>\n }\n @if (!fullOnly && !external) {\n <button mat-button class=\"align-center\" matTooltip=\"View full screen\"\n (click)=\"viewFullscreen()\">\n <mat-icon>fullscreen</mat-icon>\n </button>\n }\n </div>\n </div>\n }\n @if (!hideParameters) {\n @if (dashboard.layoutSettings && _.values(dashboard.layoutSettings.parameters).length) {\n <div class=\"dashboard-parameters flex-wrap bg-gray-50 px-4 py-0.5 border-b border-gray-200\"\n >\n @if (!external) {\n <div class=\"list-title\">\n Parameters\n </div>\n }\n @for (parameter of _.filter(dashboard.layoutSettings.parameters, {locked: false}); track parameter) {\n <label>\n {{parameter.title}}\n <div class=\"parameter-input\">\n @if (parameter.type === 'text') {\n <input type=\"text\" placeholder=\"{{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n }\n @if (parameter.type === 'numeric') {\n <input type=\"number\" placeholder=\"{{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n }\n @if (parameter.type === 'list') {\n <select class=\"pr-8 py-1.5 pl-1\" [(ngModel)]=\"parameter.value\"\n (change)=\"reloadDashboard()\" required autofocus>\n @for (item of parameter.list; track item) {\n <option [value]=\"item.value\">{{item.label}}</option>\n }\n </select>\n }\n @if (parameter.type === 'date' || parameter.type === 'datetime') {\n @if (!parameter._dateType) {\n <div class=\"flex items-center\">\n <button (click)=\"changeDateType($event, parameter, 'picker')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n Date Picker\n </button>\n <button (click)=\"changeDateType($event, parameter, 'period')\"\n class=\"hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-2 rounded bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n Time Period\n </button>\n </div>\n }\n @if (parameter._dateType === 'picker') {\n <input [type]=\"parameter.type === 'date' ? 'date' : 'datetime-local'\" placeholder=\"{{parameter.title}}\" [(ngModel)]=\"parameter.value\"\n (keyup.enter)=\"reloadDashboard()\" required autofocus>\n <a (click)=\"changeDateType($event, parameter, 'period')\"\n matTooltip=\"Time Period\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">restore</mat-icon>\n </a>\n }\n @if (parameter._dateType === 'period') {\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-16 mr-2\" min=\"0\" [value]=\"parameter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <select class=\"param-period-picker mr-2\" [value]=\"parameter._period || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, parameter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n <div>Ago</div>\n </div>\n <a (click)=\"changeDateType($event, parameter, 'picker')\"\n matTooltip=\"Date Picker\"\n class=\"text-center ml-2 hover:bg-gray-50 text-gray-800 border border-gray-300 py-0.5 pr-0.5 rounded mr-2 bg-white flex items-center\">\n <mat-icon class=\"text-base\">calendar_month</mat-icon>\n </a>\n }\n }\n @if (parameter.type === 'boolean') {\n <mat-slide-toggle class=\"pr-4\" color=\"primary\"\n [checked]=\"parameter.value\" (change)=\"booleanUpdate($event, parameter)\"\n required></mat-slide-toggle>\n }\n </div>\n </label>\n @if (_.filter(dashboard.layoutSettings.parameters, {locked: false}).length > 1) {\n <div class=\"divider\"></div>\n }\n }\n @if (_.values(dashboard.layoutSettings.parameters).length) {\n <button mat-flat-button color=\"primary\" class=\"mr-2 leading-8\"\n (click)=\"reloadDashboard()\">\n @if (!external) {\n Apply Parameters\n }\n @if (external) {\n Go\n }\n </button>\n }\n </div>\n }\n }\n}\n<div class=\"grid-stack\" [class]=\"cssGridSelector\"></div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FeedService} from '../../../services/feed.service';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {BehaviorSubject, merge} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {MatOptionSelectionChange} from '@angular/material/core';\n\n@Component({\n selector: 'ki-feed',\n templateUrl: './feed.component.html',\n styleUrls: ['./feed.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class FeedComponent implements OnInit {\n\n public feed: any = {};\n public datasets: any = [];\n public feedUrl: string;\n public searchText = new BehaviorSubject('');\n public feedDataset: any;\n public parameters: any = [];\n public error = '';\n public cacheEnabled = false;\n\n constructor(public dialogRef: MatDialogRef<FeedComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private feedService: FeedService,\n private datasetService: DatasetService) {\n }\n\n async ngOnInit() {\n this.feed = this.data.feed ? Object.assign({}, this.data.feed) : {};\n if (!this.feed.exporterConfiguration || Array.isArray(this.feed.exporterConfiguration)) {\n this.feed.exporterConfiguration = {includeHeaderRow: true, separator: ','};\n }\n\n if (this.feed.datasetInstanceId) {\n this.feedDataset = await this.datasetService.getDataset(this.feed.datasetInstanceId);\n this.parameters = await this.datasetService.getEvaluatedParameters(this.feedDataset);\n }\n\n this.feedUrl = this.data.feedUrl;\n\n if (!this.feed.cacheTimeSeconds) {\n this.feed.cacheTimeSeconds = 0;\n }\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe((datasets: any) => {\n this.datasets = datasets;\n });\n }\n\n public updateCacheEnabled(value) {\n if (!value) {\n this.feed.cacheTimeSeconds = 0;\n }\n }\n\n public displayFn(dataset): string {\n return dataset && dataset.title ? dataset.title : '';\n }\n\n public async updateFeedDataset(event: MatOptionSelectionChange) {\n const dataset = event.source.value;\n this.feed.datasetInstanceId = dataset.id;\n this.feed.datasetLabel = dataset;\n this.parameters = [];\n\n this.feedDataset = await this.datasetService.getDataset(this.feed.datasetInstanceId);\n this.parameters = await this.datasetService.getEvaluatedParameters(this.feedDataset);\n }\n\n public saveFeed() {\n this.feedService.saveFeed(this.feed).then(res => {\n this.dialogRef.close();\n }).catch(err => {\n const validationErrors = err.error ? (err.error.validationErrors || {}) : {};\n if (validationErrors.path && validationErrors.path.duplicatePath) {\n this.error = 'Path name is not available. Please enter a different path.';\n }\n });\n }\n\n private getDatasets() {\n return this.datasetService.getDatasets(\n this.searchText.getValue() || '',\n '10',\n '0'\n ).pipe(map((datasets: any) => {\n return datasets;\n })\n );\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>\n {{feed.id ? 'Edit API Connection' : 'Create API Connection'}}\n </h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Setup API Connection</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Enter the following information in order to\n configure your API endpoint.</p>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n API Path\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <div class=\"flex\">\n <span\n class=\"inline-flex items-center px-3 rounded-l border border-r-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n {{feedUrl}}\n </span>\n <input type=\"text\" class=\"w-full rounded-l-none\"\n [class]=\"{'border-red-600': !!error}\"\n placeholder=\"my-new-data-feed\" [(ngModel)]=\"feed.path\">\n </div>\n @if (!error) {\n <small class=\"font-normal\">The path used to identify this API\n Connection</small>\n }\n @if (error) {\n <small class=\"font-normal text-red-600\">{{error}}</small>\n }\n\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n API Data\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" class=\"w-full\" [matAutocomplete]=\"autoDatasets\"\n [value]=\"feed.datasetLabel ? feed.datasetLabel.title : ''\"\n (keyup)=\"searchText.next($event.target.value)\" placeholder=\"Search for a query\">\n <mat-autocomplete #autoDatasets=\"matAutocomplete\" [displayWith]=\"displayFn\">\n @for (dataset of datasets; track dataset) {\n <mat-option [value]=\"dataset\"\n (onSelectionChange)=\"updateFeedDataset($event)\">\n {{dataset.title}}\n </mat-option>\n }\n </mat-autocomplete>\n <small class=\"font-normal\">Start typing name to view available stored queries</small>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Caching Options\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\" [(ngModel)]=\"cacheEnabled\"\n (ngModelChange)=\"updateCacheEnabled($event)\">\n Enable API Caching\n </mat-checkbox>\n\n @if (cacheEnabled) {\n <div class=\"flex mt-4\">\n <span\n class=\"inline-flex items-center px-3 rounded-l border border-r-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Cache time in seconds\n </span>\n <input type=\"number\" class=\"w-full rounded-l-none flex-1\"\n placeholder=\"time in seconds\"\n [(ngModel)]=\"feed.cacheTimeSeconds\">\n </div>\n }\n <small class=\"font-normal\">Enable caching to reduce requests to the server. Setting\n cache to zero will disable caching.</small>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Export Type\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"feed.exporterKey\">\n <option value=\"sv\">Separated Value</option>\n <option value=\"json\">JSON</option>\n </select>\n\n @if (feed.exporterKey === 'sv') {\n <mat-checkbox class=\"mb-2\"\n [(ngModel)]=\"feed.exporterConfiguration.includeHeaderRow\">\n Include header row\n </mat-checkbox>\n <label class=\"mb-2\">\n Separator\n <input type=\"text\" [(ngModel)]=\"feed.exporterConfiguration.separator\">\n <small class=\"font-normal\">Enter the character used to separate the\n values.</small>\n </label>\n }\n </div>\n </div>\n\n @if (feedDataset && parameters.length) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Exposed Parameters\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-selection-list [(ngModel)]=\"feed.exposedParameterNames\">\n @for (param of parameters; track param) {\n <mat-list-option checkboxPosition=\"before\" [value]=\"param.name\"\n >\n {{param.title}}\n </mat-list-option>\n }\n </mat-selection-list>\n <small class=\"font-normal\">If selected, these parameters will be available to be\n supplied as request parameters with names matching the parameter names.</small>\n </div>\n </div>\n }\n\n @if (feedDataset) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Advanced Querying\n </label>\n <div class=\"flex flex-col mt-1 sm:col-span-2 sm:mt-0\">\n <mat-checkbox class=\"example-margin\" [(ngModel)]=\"feed.adhocFiltering\">\n Enable Adhoc Filtering\n </mat-checkbox>\n <small class=\"font-normal\">Adhoc filtering allows adhoc field filters to be supplied as\n request parameters\n in the format field_operator=value</small>\n <mat-checkbox class=\"example-margin mt-3\" [(ngModel)]=\"feed.advancedQuerying\">\n Enable Advanced Querying\n </mat-checkbox>\n @if (feed.advancedQuerying) {\n <div class=\"flex mt-4\">\n <span\n class=\"inline-flex items-center px-3 rounded-l border border-r-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Request Parameter Name\n </span>\n <input type=\"text\" class=\"w-full rounded-l-none flex-1\"\n placeholder=\"Parameter name\"\n [(ngModel)]=\"feed.advancedQueryParameterName\">\n </div>\n }\n <small class=\"font-normal\">Advanced querying allows for advanced queries to be supplied as a query string with nested\n boolean logic.</small>\n </div>\n </div>\n }\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <button mat-button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveFeed()\"\n [disabled]=\"!feed.path || !feed.datasetInstanceId || !feed.exporterKey\">Save API Connection\n </button>\n </div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnDestroy, OnInit} from '@angular/core';\nimport {FeedService} from '../../services/feed.service';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {MatDialog} from '@angular/material/dialog';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../kinintel-config';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {DataExplorerComponent} from '../data-explorer/data-explorer.component';\nimport {DatasetService} from '../../services/dataset.service';\nimport {FeedComponent} from './feed/feed.component';\nimport {Router} from '@angular/router';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport { HttpClient } from '@angular/common/http';\nimport {ProjectService} from '../../services/project.service';\n\n@Component({\n selector: 'ki-feeds',\n templateUrl: './feeds.component.html',\n styleUrls: ['./feeds.component.sass'],\n standalone: false\n})\nexport class FeedsComponent implements OnInit, OnDestroy {\n\n @Input() admin: boolean;\n @Input() feedUrl: string;\n\n public feeds: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n public apiKeys: any;\n public canHaveAPIConnections = false;\n\n private reload = new Subject();\n\n constructor(private dialog: MatDialog,\n private feedService: FeedService,\n private datasetService: DatasetService,\n private router: Router,\n @Inject(KININTEL_CONFIG) public config: KinintelModuleConfig,\n private snackBar: MatSnackBar,\n private http: HttpClient,\n private projectService: ProjectService) {\n }\n\n async ngOnInit() {\n\n this.canHaveAPIConnections = this.projectService.doesActiveProjectHavePrivilege('feedaccess');\n\n if (this.canHaveAPIConnections) {\n this.apiKeys = await this.http.get('/account/apikey/first/feedaccess').toPromise();\n\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getFeeds()\n )\n ).subscribe((feeds: any) => {\n this.endOfResults = feeds.length < this.limit;\n this.feeds = feeds;\n this.loading = false;\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n }\n\n ngOnDestroy() {\n\n }\n\n public async copy(text: string) {\n await navigator.clipboard.writeText(text.trim());\n this.copied();\n }\n\n public copied() {\n this.snackBar.open('Copied to Clipboard', null, {\n duration: 2000,\n verticalPosition: 'top'\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public editFeed(feed?) {\n const dialogRef = this.dialog.open(FeedComponent, {\n width: '900px',\n height: '650px',\n data: {feed, feedUrl: this.feedUrl}\n });\n dialogRef.afterClosed().subscribe(res => {\n this.reload.next(Date.now());\n });\n }\n\n public view(datasetId) {\n this.datasetService.getDataset(datasetId).then(datasetInstanceSummary => {\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n data: {\n datasetInstanceSummary,\n showChart: false,\n admin: this.admin,\n breadcrumb: 'Feeds'\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res && res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n }\n });\n });\n }\n\n public delete(feedId) {\n const message = 'Are you sure you would like to remove this Feed?';\n if (window.confirm(message)) {\n this.feedService.deleteFeed(feedId).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n private getFeeds() {\n return this.feedService.listFeeds(\n this.searchText.getValue() || '',\n this.limit.toString(),\n this.offset.toString()\n ).pipe(map((feeds: any) => {\n return feeds;\n })\n );\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">API Connections</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the API Connections that are currently available.\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n @if (canHaveAPIConnections) {\n <button type=\"button\" (click)=\"editFeed()\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create New API Connection\n </button>\n }\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n @if (!canHaveAPIConnections) {\n <div class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n API Connections are only available to our Partners. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n }\n @if (canHaveAPIConnections) {\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search api connections\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n @if (feeds.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Path\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Dataset\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Parameters\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n @for (feed of feeds; track feed) {\n <tbody class=\"hover:bg-gray-50\">\n <tr class=\"hover:bg-gray-50\">\n <td [class]=\"{'border-b': !feed._showExample, 'border-b-0': feed._showExample}\"\n class=\"border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">\n <div class=\"flex items-center\">\n {{feedUrl}}{{feed.path}}\n <mat-icon color=\"primary\" class=\"ml-2 text-sm cursor-pointer\"\n (click)=\"feed._showExample = !feed._showExample\">info_outline\n </mat-icon>\n </div>\n </td>\n <td [class]=\"{'border-b': !feed._showExample, 'border-b-0': feed._showExample}\"\n class=\"border-gray-200 px-4 py-2 text-sm text-gray-500\">\n <a class=\"primary hover:underline font-medium\"\n (click)=\"view(feed.datasetInstanceId)\">\n {{feed.datasetLabel ? feed.datasetLabel.title : ''}}</a>\n </td>\n <td [class]=\"{'border-b': !feed._showExample, 'border-b-0': feed._showExample}\"\n class=\"border-gray-200 px-4 py-2 text-sm text-gray-500\">\n {{feed.exposedParameterNames.join(', ')}}\n </td>\n <td [class]=\"{'border-b': !feed._showExample, 'border-b-0': feed._showExample}\"\n class=\"whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n <div class=\"flex items-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editFeed(feed)\"> Edit</button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"delete(feed.id)\">Delete Feed</button>\n </mat-menu>\n </div>\n </td>\n </tr>\n @if (feed._showExample) {\n <tr>\n <td class=\" px-4 pt-0\" colspan=\"4\">\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">cURL</div>\n <div class=\"text-sm mb-2\">\n This is the recommended approach for consuming the API.\n </div>\n <div #createCurl class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n curl -H <span class=\"text-secondary\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\">\n -X <b>GET</b> <span class=\"text-secondary\">{{feedUrl}}{{feed.path}}@for (param of feed.exposedParameterNames; track param; let i = $index) {\n {{i === 0 ? '?' : '&'}}{{param}}=<b>[[VALUE]]</b>\n }</span></pre>\n </div>\n <button mat-icon-button (click)=\"copy(createCurl.textContent)\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">HTTPS</div>\n <div class=\"text-sm mb-2\">\n We recommend only using this for testing the API endpoint.\n </div>\n <div #createHttps class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\"><pre class=\"whitespace-normal\">{{feedUrl}}{{feed.path}}<span class=\"text-secondary\">?apiKey=<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>&apiSecret=<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b></span>@for (param of feed.exposedParameterNames; track param) {\n <span class=\"text-secondary\">&{{param}}=<b>[[VALUE]]</b></span>\n }</pre></div>\n <button mat-icon-button (click)=\"copy(createHttps.textContent)\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n }\n <tbody>\n <tr>\n <td colspan=\"4\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}} - {{(page * limit) - (limit - feeds.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n }\n </table>\n </div>\n </div>\n }\n</div>\n</div>\n@if (!feeds.length && !loading) {\n <div class=\"p-4\">\n <button type=\"button\" (click)=\"editFeed()\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">api</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create New API Connection</span>\n </button>\n </div>\n}\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {Papa} from 'ngx-papaparse';\nimport {DatasourceService} from '../../../../services/datasource.service';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-import-data',\n templateUrl: './import-data.component.html',\n styleUrls: ['./import-data.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ImportDataComponent implements OnInit {\n\n public import: any = {headerRow: false, delimiter: ','};\n public columns: any = [];\n public importType = 1;\n public importingData = false;\n public datasourceUpdate: any;\n public rows: any = [];\n public datasourceInstanceKey: string;\n public reloadURL: string;\n public importErrors: any = [];\n public _ = _;\n public Object = Object;\n\n constructor(public dialogRef: MatDialogRef<ImportDataComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private papa: Papa,\n private datasourceService: DatasourceService) {\n }\n\n ngOnInit(): void {\n this.columns = this.data.columns;\n this.datasourceUpdate = this.data.datasourceUpdate || null;\n this.rows = this.data.rows || [];\n this.datasourceInstanceKey = this.data.datasourceInstanceKey || null;\n this.reloadURL = this.data.reloadURL;\n this.importType = !this.rows.length ? 1 : 3;\n\n if (!this.columns.length) {\n this.import.headerRow = true;\n this.import.replaceColumns = true;\n }\n\n if (this.columns.length) {\n this.import.columns = _.filter(this.columns, col => {\n return col.type !== 'id';\n });\n }\n }\n\n public fileUpload(event) {\n const fileList: FileList = event.target.files;\n if (fileList.length > 0) {\n const file: File = fileList[0];\n\n const reader = new FileReader();\n reader.onload = () => {\n const text: any = reader.result;\n this.import.fileName = file.name;\n this.import.data = this.papa.parse(text, {\n delimiter: this.import.delimiter,\n quoteChar: '\"',\n escapeChar: '\\\\'\n }).data;\n\n const preview = _.clone(this.import.data);\n const rows = preview.slice(0, 3);\n this.import.preview = rows.map(row => {\n return row.slice(0, 3);\n });\n };\n reader.readAsText(file);\n }\n }\n\n public async importData() {\n this.importingData = true;\n this.importErrors = [];\n\n if (!this.datasourceUpdate.title) {\n this.datasourceUpdate.title = this.import.fileName;\n }\n\n if (!this.columns.length || this.import.replaceColumns) {\n this.datasourceUpdate.fields = [\n {title: 'ID', name: 'id', type: 'id'}\n ];\n }\n\n\n if (this.import.headerRow) {\n if (!this.columns.length || this.import.replaceColumns) {\n this.columns = [];\n this.import.data[0].forEach((header: string, index: number) => {\n this.columns.push({\n title: header,\n name: _.snakeCase(header),\n type: 'string'\n });\n });\n\n this.import.columns = this.columns;\n\n this.columns.forEach(column => {\n this.datasourceUpdate.fields.push(column);\n });\n }\n\n this.import.data.shift();\n }\n\n\n const csvData = [];\n _.filter(this.import.data, item => {\n return _.some(item);\n }).forEach(row => {\n const rowData = {};\n this.import.columns.forEach((column: any, index: number) => {\n rowData[column.name] = (!_.isUndefined(row[index]) && row[index] !== '') ? row[index] : null;\n });\n csvData.push(rowData);\n });\n\n let result = null;\n\n if (this.importType === 1) {\n if (this.rows.length && this.datasourceInstanceKey) {\n await this.datasourceService.deleteFromDatasource(this.datasourceInstanceKey, []);\n }\n\n this.datasourceUpdate.adds = csvData;\n\n if (!this.datasourceInstanceKey) {\n result = this.datasourceInstanceKey = await this.datasourceService.createCustomDatasource(this.datasourceUpdate);\n } else {\n result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);\n }\n } else if (this.importType === 2) {\n this.datasourceUpdate.replaces = csvData;\n result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);\n } else if (this.importType === 3) {\n this.datasourceUpdate.adds = csvData;\n result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);\n }\n\n if (result && result.rejected > 0) {\n this.importErrors = Object.values(result.validationErrors)[0];\n } else {\n window.location.href = this.reloadURL + '/' + this.datasourceInstanceKey;\n }\n\n }\n\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"mb-2 text-sm font-thin\">Select how you would like to import your data.</div>\n\n <mat-radio-group class=\"mb-4 block\" [(ngModel)]=\"importType\">\n <mat-radio-button class=\"block mb-2\" [value]=\"1\">\n Replace whole dataset\n </mat-radio-button>\n @if (!_.some(columns, {type: 'id'})) {\n <mat-radio-button class=\"block mb-2\" [value]=\"2\" [disabled]=\"!rows.length\">\n Overwrite duplicates (with same unique key)\n </mat-radio-button>\n }\n <mat-radio-button class=\"block\" [value]=\"3\" [disabled]=\"!rows.length\">\n Add (will fail if duplicates exist with same key)\n </mat-radio-button>\n </mat-radio-group>\n\n <label class=\"mb-4\">\n Delimiting character\n <input class=\"w-12\" type=\"text\" [(ngModel)]=\"import.delimiter\" placeholder=\"Enter delimiting character\">\n </label>\n\n <label class=\"mb-4\">\n <input id=\"csvUpload\" type=\"file\" (change)=\"fileUpload($event)\">\n </label>\n\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"import.headerRow\" [disabled]=\"!columns.length\">\n File contains header row\n </mat-checkbox>\n @if (!columns.length) {\n <div class=\"text-xs text-gray-500\">\n File header row required as no columns have been defined.\n </div>\n }\n\n @if (import.headerRow && columns.length) {\n <mat-checkbox class=\"block mb-4\" [(ngModel)]=\"import.replaceColumns\">\n Replace Columns with Header Row\n </mat-checkbox>\n }\n\n <hr class=\"my-4\">\n\n @if (importErrors.length) {\n <div class=\"rounded-md bg-red-50 p-4 mb-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{importErrors.length}} lines with errors in your upload</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n @for (item of importErrors.slice(0, 10); track item) {\n <li>\n <span class=\"text-red-800\">Line {{item.itemNumber + 1}}: {{Object.values(item.validationErrors).join (', ')}}</span>\n </li>\n }\n </ul>\n @if (importErrors.length > 10) {\n <div class=\"mt-4\">* Showing first 10 invalid lines only</div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (import.preview) {\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Preview\n </div>\n <table class=\"preview-table w-full\">\n @if (import.headerRow && import.replaceColumns) {\n <thead>\n <tr>\n @for (header of import.preview[0]; track header) {\n <th>{{header}}</th>\n }\n </tr>\n </thead>\n <tbody>\n <tr>\n @for (col of import.preview[1]; track col) {\n <td>{{col}}</td>\n }\n </tr>\n <tr>\n @for (col of import.preview[2]; track col) {\n <td>{{col}}</td>\n }\n </tr>\n </tbody>\n }\n @if (!import.headerRow || !import.replaceColumns) {\n <thead>\n <tr>\n @for (col of import.columns; track col) {\n <th>{{col.title}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of (!import.headerRow ? import.preview : import.preview.slice(1, 3)); track row) {\n <tr>\n @for (col of import.columns; track col; let i = $index) {\n <td>{{row[i]}}</td>\n }\n </tr>\n }\n </tbody>\n }\n </table>\n }\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"importData()\">Import Data</button>\n </div>\n\n</div>\n\n\n","import {Component, Inject, Input, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport {DatasourceService} from '../../../../services/datasource.service';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport { HttpClient } from '@angular/common/http';\n\n@Component({\n selector: 'ki-api-access',\n templateUrl: './api-access.component.html',\n styleUrls: ['./api-access.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ApiAccessComponent implements OnInit {\n\n @Input() apiKeys: any;\n\n public backendURL: string;\n public datasourceUpdate: any;\n public datasourceInstanceKey: any;\n public columns: any;\n public listQueryString: string = '';\n public createExample: string;\n public updateExample: string;\n public deleteExample: string;\n public deleteFilteredExample: string;\n public showExample = false;\n\n constructor(public dialogRef: MatDialogRef<ApiAccessComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasourceService: DatasourceService,\n private snackBar: MatSnackBar,\n private http: HttpClient) {\n }\n\n async ngOnInit() {\n this.backendURL = this.data.backendURL;\n this.datasourceUpdate = this.data.datasourceUpdate;\n this.datasourceInstanceKey = this.data.datasourceInstanceKey;\n this.columns = this.data.columns;\n\n this.showExample = !!this.datasourceUpdate.instanceImportKey;\n\n const example = ['[{'];\n\n this.columns.forEach((column, index) => {\n if (column.type !== 'id') {\n example.push('<span class=\"text-cta\">\"' + column.name + '\":</span> ' + this.getColumnTypeDisplayString(column.type));\n if (index !== this.columns.length - 1) {\n example.push(', ');\n }\n }\n this.listQueryString += column.name + '_eq=VALUE&';\n if (index == this.columns.length - 1)\n this.listQueryString += 'query=' + column.name + '+isnotnull&sort=' + column.name + '|desc';\n });\n example.push('}]');\n this.createExample = example.join('');\n\n const update = ['[{'];\n this.columns.forEach((column, index) => {\n update.push('<span class=\"text-cta\">\"' + column.name + '\":</span> ' + this.getColumnTypeDisplayString(column.type));\n if (index !== this.columns.length - 1) {\n update.push(', ');\n }\n });\n update.push('}]');\n this.updateExample = update.join('');\n\n const deleteString: string[] = ['[{'];\n this.columns.forEach((column, index) => {\n if (column.type === 'id' || column.keyField) {\n if (index > 0) {\n deleteString.push(', ');\n }\n deleteString.push('<span class=\"text-cta\">\"' + column.name + '\":</span> ' + this.getColumnTypeDisplayString(column.type));\n }\n });\n\n deleteString.push('}]');\n this.deleteExample = deleteString.join('');\n\n const deleteFiltered: string[] = ['[{'];\n if (this.columns.length > 0) {\n deleteFiltered.push('<span class=\"text-cta\">\"column\":</span> \"' + this.columns[0].name + '\", <span class=\"text-cta\">\"value:</span> \"25\", <span class=\"text-cta\">\"matchType:</span> \"eq\"');\n }\n deleteFiltered.push('}]');\n this.deleteFilteredExample = deleteFiltered.join('');\n\n this.apiKeys = await this.http.get('/account/apikey/first/customdatasourceupdate').toPromise();\n }\n\n\n private getColumnTypeDisplayString(columnType) {\n let exampleValue = null;\n switch (columnType) {\n case \"integer\":\n exampleValue = 10;\n break;\n case \"id\":\n exampleValue = 1;\n break;\n case \"float\":\n exampleValue = \"1.5\";\n break;\n case \"date\":\n exampleValue= \"2025-01-01\";\n break;\n case \"datetime\":\n exampleValue = \"2025-01-01 10:00:00\";\n break;\n case \"boolean\":\n exampleValue = \"true\";\n break;\n default:\n exampleValue = \"string value\";\n break;\n }\n return columnType === \"id\" || columnType === \"integer\" || columnType === \"float\" || columnType === \"boolean\" ? exampleValue : '\"' + exampleValue + '\"';\n }\n\n public copied() {\n this.snackBar.open('Copied to Clipboard', null, {\n duration: 2000,\n verticalPosition: 'top'\n });\n }\n\n public async saveApiAccess() {\n await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, {\n title: this.datasourceUpdate.title,\n importKey: this.datasourceUpdate.instanceImportKey,\n fields: this.datasourceUpdate.fields,\n adds: [],\n updates: [],\n deletes: [],\n replaces: []\n });\n\n if (this.showExample) {\n this.dialogRef.close();\n }\n\n this.showExample = !!this.datasourceUpdate.instanceImportKey;\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>API Access</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Import Key\n </div>\n\n <div class=\"mb-4\">\n <input class=\"mt-2 w-full\" type=\"text\" [(ngModel)]=\"datasourceUpdate.instanceImportKey\"\n placeholder=\"Enter import key\">\n <small class=\"font-normal\">This will be used as part of the API request</small>\n </div>\n\n @if (showExample) {\n <div class=\"text-lg font-semibold mb-4\">\n Example API Usage\n </div>\n <div class=\"relative w-full mb-8\">\n <div class=\"text-base font-semibold\">List</div>\n <div class=\"text-sm mb-2\">\n Return the data for this datasource.\n <br><br>\n Filtering of the returned data can be effected by supplying parameters of the format <b>FIELD_MATCHTYPE</b>\n where FIELD matches one of\n the field names defined in the data source and MATCHTYPE should be one of the following values.\n <br><br>\n <table>\n <tr>\n <th>Match Type</th>\n <th>Description</th>\n <th>Example</th>\n </tr>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n <td>id_eq=3</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n <td>id_neq=7</td>\n </tr>\n <tr>\n <td>isnull</td>\n <td>for a null match</td>\n <td>id_isnull=1</td>\n </tr>\n <tr>\n <td>isnotnull</td>\n <td>for a not null match</td>\n <td>id_isnotnull=1</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n <td>id_gt=1</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n <td>id_lt=1</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n <td>id_gte=1</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n <td>id_lte=10</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n <td>name_startswith=app</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n <td>name_endswith=app</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>for a string contains match</td>\n <td>name_contains=app</td>\n </tr>\n <tr>\n <td>like</td>\n <td>for a wildcard or regular expression match. Simple wildcards can be supplied using * for\n one or more characters. Regular expressions\n can be supplied by surrounding the value with / delimiters.\n </td>\n <td>name_like=ap*, name_like=/^ap.*le$/</td>\n </tr>\n <tr>\n <td>in</td>\n <td>for where the value is one of a list supplied in comma separated format</td>\n <td>name_in=\"apple,pear,banana\"</td>\n </tr>\n <tr>\n <td>notin</td>\n <td>for where the value is not one of a list supplied in comma separated format</td>\n <td>name_notin=\"apple,pear,banana\"</td>\n </tr>\n </table>\n <br><br>\n Alternatively, advanced queries can be supplied using the built in Data Query Language passed as a <b>query</b> parameter which should be suitable URL encoded.\n <br><br>\n e.g. <code>query=((id >= 5 && name like 'app*') || id < 3)</code>\n <br><br>\n Results can be sorted by supplying a <b>sort</b> parameter which identifies columns to sort and\n directions (either asc or desc) using pipe separation\n <br><br>\n By default the first 100 rows will be returned. Paging can be achieved by supplying\n <b>limit</b> and <b>offset</b> parameters.\n </div>\n <div #list class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>GET</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}?{{listQueryString}}\n &limit=50&offset=10</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"list.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Create</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample\"></pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Replace</div>\n <div class=\"text-sm mb-2\">\n Replace a set of rows to the data source identified by the passed import key. This will perform\n an insert or update depending on whether the row already exists according to the unique key.\n </div>\n <div #replace class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PATCH</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"replace.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Update</div>\n <div class=\"text-sm mb-2\">\n Update a set of rows to the data source identified by the passed import key. This will perform\n an update based upon the unique key and will not add any new rows if they don't already exist.\n </div>\n <div #update class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PUT</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"update.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows explicitly by unique key for the data source identified by the passed import\n key.\n </div>\n <div #delete class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"delete.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteExample\">\n </pre>\n </div>\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Filtered Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows using one or more filter expressions additively to identify the rows for\n deletion for the data source identified by the passed import key.\n <br><br>\n Filters are supplied as objects containing a column name supplied as the <b>column</b> property, a\n match value supplied as the <b>value</b> property and a match type supplied as\n the <b>matchType</b> property.\n <br><br>\n Possible values for the <b>matchType</b> are:<br><br>\n <table>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n </tr>\n <tr>\n <td>null</td>\n <td>for a null match</td>\n </tr>\n <tr>\n <td>notnull</td>\n <td>for a not null match</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>or a string contains match</td>\n </tr>\n </table>\n </div>\n <div #deleteFiltered class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/filtered/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"deleteFiltered.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteFilteredExample\"></pre>\n </div>\n }\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveApiAccess()\">Save</button>\n </div>\n\n</div>\n\n\n","import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop';\nimport {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef\n} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\nimport {DatasourceService} from '../../../../services/datasource.service';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-advanced-settings',\n templateUrl: './advanced-settings.component.html',\n styleUrls: ['./advanced-settings.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class AdvancedSettingsComponent implements OnInit {\n\n public _ = _;\n public columns: any = [];\n public columns2: any = [];\n public advancedSettings: any = {\n showAutoIncrement: false,\n primaryKeys: [],\n indexes: [{fieldNames: []}]\n };\n public datasourceUpdate: any;\n public errorMessage = '';\n\n private datasourceInstanceKey: string;\n private allColumns: any;\n\n constructor(public dialogRef: MatDialogRef<AdvancedSettingsComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasourceService: DatasourceService) {\n }\n\n ngOnInit() {\n this.datasourceUpdate = this.data.datasourceUpdate;\n this.datasourceInstanceKey = this.data.datasourceInstanceKey;\n\n this.advancedSettings.showAutoIncrement = this.data.showAutoIncrement || false;\n this.advancedSettings.primaryKeys = _.clone(_.filter(this.data.columns, {keyField: true}));\n this.allColumns = _.clone(this.data.columns);\n this.columns = _.clone(_.filter(this.data.columns, col => {\n return !col.keyField;\n }));\n this.columns2 = _.clone(_.filter(this.data.columns, col => {\n return true;\n }));\n\n if (this.datasourceUpdate.indexes && this.datasourceUpdate.indexes.length) {\n this.advancedSettings.indexes = this.datasourceUpdate.indexes;\n this.advancedSettings.indexes.forEach(indexObj => {\n indexObj.indexCols = _.clone(_.filter(this.data.columns, col => {\n return indexObj.fieldNames.indexOf(col.name) > -1;\n }));\n });\n }\n }\n\n public drop(event: CdkDragDrop<string[]>) {\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n }\n }\n\n public dropIndex(event: CdkDragDrop<string[]>, data?: any) {\n moveItemInArray(data || event.container.data, event.previousIndex, event.currentIndex);\n }\n\n public updateIndexes(index: any) {\n index.indexCols.forEach(col => {\n if (index.fieldNames.indexOf(col.name) === -1) {\n index.fieldNames.push(col.name);\n }\n });\n index.fieldNames.forEach((fieldName: string, nameIndex: number) => {\n if (_.findIndex(index.indexCols, {name: fieldName}) === -1) {\n index.fieldNames.splice(nameIndex, 1);\n }\n });\n }\n\n public async saveChanges() {\n this.errorMessage = '';\n\n // Map the importKey so it doesn't get wiped.\n this.datasourceUpdate.importKey = this.datasourceUpdate.instanceImportKey;\n\n this.datasourceUpdate.indexes = _.filter(this.advancedSettings.indexes, index => {\n return index.fieldNames.length;\n });\n let showAutoIncrement = this.advancedSettings.showAutoIncrement;\n\n if (this.advancedSettings.primaryKeys.length) {\n showAutoIncrement = false;\n _.remove(this.allColumns, {type: 'id'});\n\n this.allColumns.map(column => {\n column.keyField = !!_.find(this.advancedSettings.primaryKeys, {name: column.name});\n return column;\n });\n\n } else {\n if (!_.find(this.allColumns, {type: 'id'})) {\n this.allColumns.map(column => {\n column.keyField = false;\n return column;\n });\n\n this.allColumns.unshift({\n title: 'ID',\n name: 'id',\n type: 'id'\n });\n }\n }\n\n this.datasourceUpdate.fields = this.allColumns.map(column => {\n if (column.name === column.previousName) {\n delete column.previousName;\n }\n return column;\n });\n\n try {\n await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);\n this.dialogRef.close({datasourceUpdate: this.datasourceUpdate, columns: this.allColumns, showAutoIncrement});\n } catch (e) {\n const error = e.error;\n this.errorMessage = error.message || 'There was a problem updating this datasource. Please check your settings and try again.';\n }\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Advanced Settings</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n @if (errorMessage) {\n <div class=\"rounded-md bg-red-50 p-4 mb-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There was an issue saving your datasource.</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li>{{errorMessage}}</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n }\n\n <mat-checkbox class=\"mb-0\" [(ngModel)]=\"advancedSettings.showAutoIncrement\"\n [disabled]=\"advancedSettings.primaryKeys.length\">\n Show Auto Increment Column\n </mat-checkbox>\n <div class=\"text-xs text-gray-500 mb-8\">By default, datasources are created with an auto increment ID primary\n key\n column. Show this column using the toggle above.\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Create custom primary key</div>\n <div class=\"text-gray-500 text-sm mb-6\">Drag column(s) to make up the primary key for this datasource</div>\n\n <div class=\"flex justify-between\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n\n <div\n cdkDropList\n #columnList=\"cdkDropList\"\n [cdkDropListData]=\"columns\"\n [cdkDropListConnectedTo]=\"[pkList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of columns; track item) {\n <div class=\"example-box\" cdkDrag>{{ item.title }}</div>\n }\n </div>\n </div>\n\n <div class=\"example-container\">\n <div class=\"font-medium\">Primary Key(s)</div>\n\n <div\n cdkDropList\n #pkList=\"cdkDropList\"\n [cdkDropListData]=\"advancedSettings.primaryKeys\"\n [cdkDropListConnectedTo]=\"[columnList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n @for (item of advancedSettings.primaryKeys; track item) {\n <div class=\"example-box\" cdkDrag>\n {{ item.title }}\n </div>\n }\n </div>\n </div>\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Datasource Indexes</div>\n <div class=\"text-gray-500 text-sm mb-6\">Select the columns to be indexed and drag to reorder if required.</div>\n\n @for (aIndex of advancedSettings.indexes; track aIndex; let i = $index) {\n <div class=\"flex justify-between p-3 mb-3 bg-gray-50\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n <mat-select [(ngModel)]=\"aIndex.indexCols\" (ngModelChange)=\"updateIndexes(aIndex)\" [multiple]=\"true\">\n @for (column of columns2; track column) {\n <mat-option [value]=\"column\">\n {{column.title}}\n </mat-option>\n }\n </mat-select>\n </div>\n <div class=\"example-container\">\n <div class=\"font-medium\">Indexes</div>\n <div\n cdkDropList\n class=\"example-list\"\n (cdkDropListDropped)=\"dropIndex($event, aIndex.fieldNames)\">\n @for (item of aIndex.fieldNames; track item) {\n <div class=\"example-box\" cdkDrag>\n {{ aIndex.indexCols.length ? _.find(aIndex.indexCols, {name: item})?.title : '' }}\n </div>\n }\n </div>\n </div>\n <button mat-icon-button color=\"warn\" class=\"self-center\" type=\"button\"\n (click)=\"advancedSettings.indexes.splice(i, 1)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </div>\n }\n <div class=\"flex justify-between\">\n <div></div>\n <button mat-stroked-button color=\"primary\" type=\"button\"\n (click)=\"advancedSettings.indexes.push({fieldNames: []})\">\n Create additional index\n </button>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <div></div>\n <button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveChanges()\">Save Changes\n </button>\n </div>\n\n </div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MatChipEditedEvent, MatChipInputEvent} from '@angular/material/chips';\nimport {COMMA, ENTER} from '@angular/cdk/keycodes';\nimport {ImportDataComponent} from '../import-data.component';\nimport {\n MAT_DIALOG_DATA,\n MatDialogRef,\n MatDialog\n} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\nimport {DatasourceService} from '../../../../../services/datasource.service';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from '../../../../../kinintel-config';\nimport shortHash from 'short-hash';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-import-wizard',\n templateUrl: './import-wizard.component.html',\n styleUrls: ['./import-wizard.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ImportWizardComponent implements OnInit {\n\n public columns: any = [];\n public addOnBlur = true;\n public name: string;\n public reloadURL: string;\n public datasourceUpdate: any;\n public importChoice: string = null;\n public importKey: string = null;\n public backendURL: string = null;\n\n public readonly _ = _;\n public readonly Object = Object;\n public readonly datasourceTypes: any = {\n string: 'Text (up to 255 chars)',\n mediumstring: 'Medium Text (up to 2000 chars)',\n longstring: 'Long Text (more than 2000 chars)',\n integer: 'Number (whole number)',\n float: 'Decimal number',\n date: 'Date',\n datetime: 'Date and Time',\n pickfromsource: 'Pick From List (using another source)'\n };\n\n public readonly separatorKeysCodes = [ENTER, COMMA] as const;\n\n private namePrefix: string;\n\n constructor(private dialog: MatDialog,\n public dialogRef: MatDialogRef<ImportWizardComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private datasourceService: DatasourceService,\n private snackBar: MatSnackBar,\n @Inject(KININTEL_CONFIG) private config: KinintelModuleConfig) {\n }\n\n async ngOnInit() {\n this.reloadURL = this.data.reloadURL;\n this.datasourceUpdate = this.data.datasourceUpdate;\n this.backendURL = this.config.backendURL;\n this.namePrefix = this.data.namePrefix || '';\n }\n\n public copied() {\n this.snackBar.open('Copied to Clipboard', null, {\n duration: 2000,\n verticalPosition: 'top'\n });\n }\n\n public createExample() {\n const example = ['[{'];\n\n this.columns.forEach((column, index) => {\n if (column.type !== 'id') {\n example.push('<span class=\"text-secondary\">\"' + column.name + '\":</span> \"' + column.type + '\"');\n if (index !== this.columns.length - 1) {\n example.push(', ');\n }\n }\n });\n example.push('}]');\n return example.join('');\n }\n\n public addColumn(event: MatChipInputEvent) {\n const value = (event.value || '').trim();\n\n // Add our fruit\n if (value) {\n this.columns.push(\n {\n title: value,\n name: _.snakeCase(value),\n type: 'string'\n }\n );\n }\n\n // Clear the input value\n // tslint:disable-next-line:no-non-null-assertion\n event.chipInput!.clear();\n }\n\n public editColumn(column: string, event: MatChipEditedEvent) {\n const value = event.value.trim();\n\n // Remove fruit if it no longer has a name\n if (!value) {\n this.removeColumn(column);\n return;\n }\n\n // Edit existing fruit\n const index = this.columns.indexOf(column);\n if (index >= 0) {\n this.columns[index].name = value;\n }\n }\n\n public removeColumn(column: any) {\n _.remove(this.columns, {name: column.name});\n }\n\n public importData() {\n const dialogRef = this.dialog.open(ImportDataComponent, {\n width: '800px',\n height: '900px',\n hasBackdrop: false,\n data: {\n columns: this.columns,\n datasourceUpdate: {\n title: this.name ? (this.namePrefix || '') + this.name : '',\n instanceImportKey: '',\n fields: [],\n adds: [],\n updates: [],\n deletes: []\n },\n rows: [],\n datasourceInstanceKey: null,\n reloadURL: this.reloadURL\n }\n });\n }\n\n public async createStructure() {\n this.datasourceUpdate.title = this.namePrefix + this.name;\n\n // If no primary key fields have been set then add the ID field.\n if (!_.filter(this.columns, 'keyField').length) {\n this.datasourceUpdate.fields = [\n {title: 'ID', name: 'id', type: 'id'}\n ];\n }\n\n this.columns.forEach(column => {\n this.datasourceUpdate.fields.push(column);\n });\n\n if (this.data.automaticImportKey)\n this.datasourceUpdate.importKey = shortHash(Date.now().toString());\n\n const key = await this.datasourceService.createCustomDatasource(this.datasourceUpdate);\n\n if (this.importKey) {\n await this.datasourceService.updateCustomDatasource(key, {\n title: this.datasourceUpdate.title,\n importKey: this.importKey,\n fields: this.datasourceUpdate.fields,\n adds: [],\n updates: [],\n deletes: [],\n replaces: []\n });\n }\n\n window.location.href = this.reloadURL + '/' + key;\n }\n\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close=\"closed\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0 \">\n\n <div class=\"bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Use this form to decide how you would like to add data to your account. For <b>Manual</b> and\n <b>API</b> methods, you will need to decide up-front the structure of your data by supplying\n the relevant column names below. For <b>CSV</b> upload you can use the existing header row in\n the data to determine the structure.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"px-6 py-4\">\n <label class=\"mb-4\">\n Name\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"name\" placeholder=\"Enter data set name\"\n [class]=\"{'border-red-500': !name}\">\n <div class=\"m-0.5 text-xs text-gray-500 font-normal\">Please enter a friendly name to identify this data set.</div>\n </label>\n\n <div class=\"my-4 font-medium\">Select method of data import</div>\n\n <div class=\"flex items-center mb-4\">\n <button type=\"button\" (click)=\"importChoice = 'MANUAL'\"\n [class]=\"{'bg-gray-50 border-gray-400': importChoice === 'MANUAL'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">edit_note\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Manual Data Entry</span>\n </button>\n <button type=\"button\" (click)=\"importData()\"\n class=\"mx-2 relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">upload_file\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Upload CSV Data</span>\n </button>\n <button type=\"button\" (click)=\"importChoice = 'API'\"\n [class]=\"{'bg-gray-50 border-gray-400': importChoice === 'API'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">database_upload\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Connect to API</span>\n </button>\n </div>\n\n @if (importChoice === 'MANUAL' || importChoice === 'API') {\n <div class=\"mt-6 font-medium\">Enter the columns for this data set.</div>\n <mat-form-field class=\"w-full\" appearance=\"fill\">\n <mat-label>Dataset Columns</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Enter column name\">\n @for (column of columns; track column) {\n <mat-chip-row class=\"bg-white\"\n (removed)=\"removeColumn(column)\">\n {{column.title}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + column.title\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n <input placeholder=\"Enter column name and press enter...\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addColumn($event)\"/>\n </mat-chip-grid>\n </mat-form-field>\n <div class=\"text-xs -mt-4 ml-0.5 text-gray-500\">Start typing in the box above to enter the column names.</div>\n @if (!columns.length) {\n <div class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">Please enter at least 1 column</h3>\n </div>\n </div>\n </div>\n }\n @if (columns.length) {\n <div class=\"font-medium text-sm mt-4\">Structure Preview and Field Types</div>\n <div class=\"text-xs mb-4 ml-0.5 text-gray-500\">\n Preview each column created and set which data type the column should be\n </div>\n @if (_.filter(columns, 'keyField').length) {\n <div class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">No auto increment ID column will be generated\n due to primary keys being defined.\n </h3>\n </div>\n </div>\n </div>\n }\n <table>\n <tr>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Name</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Type</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium text-center\">Primary Key</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\"></td>\n </tr>\n @for (column of columns; track column; let i = $index) {\n <tr>\n <td class=\"border-l border-t border-b border-r py-2 px-3 font-medium\">\n {{column.title}}\n </td>\n <td class=\"border-t border-b border-r p-0\">\n <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">\n @for (type of Object.keys(datasourceTypes); track type) {\n <option [value]=\"type\">\n {{datasourceTypes[type]}}\n </option>\n }\n </select>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <mat-checkbox color=\"primary\" [(ngModel)]=\"columns[i].keyField\"></mat-checkbox>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <button color=\"warn\" mat-icon-button (click)=\"removeColumn(column)\">\n <span class=\"material-symbols-outlined\">delete</span>\n </button>\n </td>\n </tr>\n }\n </table>\n <!-- <table>-->\n <!-- <tr>-->\n <!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3\"></td>-->\n <!-- <td class=\"border-t border-b border-r py-2 px-3 bg-gray-100 font-medium\" [colSpan]=\"columns.length\">Columns</td>-->\n <!-- </tr>-->\n <!-- <tr>-->\n <!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Name</td>-->\n <!-- <td class=\"border-t border-b border-r py-2 px-3\" *ngFor=\"let column of columns\">-->\n <!-- -->\n <!-- </td>-->\n <!-- </tr>-->\n <!-- <tr>-->\n <!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Type</td>-->\n <!-- <td class=\"border-t border-b border-r p-0\" *ngFor=\"let column of columns; let i = index\">-->\n <!-- <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">-->\n <!-- <option [value]=\"type\" *ngFor=\"let type of Object.keys(datasourceTypes)\">-->\n <!-- {{datasourceTypes[type]}}-->\n <!-- </option>-->\n<!-- </select>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- </table>-->\n}\n}\n\n@if (importChoice === 'API') {\n <label class=\"mt-2 mb-4\">\n API Import Key\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"importKey\" placeholder=\"Enter import key\">\n <div class=\"font-normal text-gray-500 text-xs\">\n This will be used as part of the API request when\n </div>\n </label>\n @if (importKey) {\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Example</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\"text-xs bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>[[apiKey]]</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>[[apiSecret]]</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-secondary\">{{backendURL}}/api/tabularData/{{importKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"text-xs relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample()\"></pre>\n </div>\n }\n}\n\n</div>\n\n\n\n</div>\n\n<div class=\"dialog-footer\">\n <button mat-button mat-dialog-close=\"closed\" mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" [disabled]=\"!name || !columns.length\"\n (click)=\"createStructure()\">Save Changes</button>\n</div>\n\n</div>\n\n\n","import {AfterViewInit, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\nimport {MatDialog} from '@angular/material/dialog';\nimport {ImportDataComponent} from '../create-datasource/import-data/import-data.component';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {DatasourceService, DatasourceUpdate} from '../../../services/datasource.service';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport {Location} from '@angular/common';\nimport {\n ApiAccessComponent\n} from '../create-datasource/api-access/api-access.component';\nimport {\n AdvancedSettingsComponent\n} from '../create-datasource/advanced-settings/advanced-settings.component';\nimport {\n ImportWizardComponent\n} from '../create-datasource/import-data/import-wizard/import-wizard.component';\nimport {BehaviorSubject} from 'rxjs';\nimport {CreateDatasetComponent} from '../../dataset/create-dataset/create-dataset.component';\nimport shortHash from 'short-hash';\n\n\ndeclare var window: any;\n\n@Component({\n selector: 'ki-create-datasource',\n templateUrl: './create-datasource.component.html',\n styleUrls: ['./create-datasource.component.sass'],\n standalone: false\n})\nexport class CreateDatasourceComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @Input() sidenavService: any;\n @Input() backURL = '/imported-data';\n @Input() reloadURL = 'import-data';\n @Input() backendURL: string;\n @Input() namePrefix = '';\n @Input() readonly = false;\n @Input() automaticImportKey: boolean = false;\n @Input() hideAPIAccess: boolean = false;\n @Input() editColumns = true;\n @Input() filterJunction = {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n };\n\n public readonly datasourceTypes: any = {\n string: 'Text (up to 255 chars)',\n mediumstring: 'Medium Text (up to 32767 chars)',\n longstring: 'Long Text (more than 32767 chars)',\n integer: 'Number (whole number)',\n biginteger: 'Number (large number)',\n boolean: 'Tick (Yes / No)',\n float: 'Decimal number',\n date: 'Date',\n datetime: 'Date and Time',\n pickfromsource: 'Pick From List (using another source)',\n json: 'Nested JSON Object'\n };\n\n public rows: any = [];\n public columns: any = [\n {\n title: 'Column 1',\n name: 'column_1',\n type: 'string'\n },\n {\n title: 'Column 2',\n name: 'column_2',\n type: 'string'\n }\n ];\n public selectedItem: any = {};\n public _ = _;\n public showUpload = false;\n public headerRow = false;\n public adds: any = [];\n public updates: any = [];\n public deletes: any = [];\n public invalidItems: any = [];\n public editMode = false;\n public autoIncrementColumn = false;\n public datasourceInstanceKey: string;\n public datasourceUpdate: any = {\n title: '',\n instanceImportKey: '',\n fields: [],\n adds: [],\n updates: [],\n deletes: []\n };\n public offset = 0;\n public limit = 25;\n public page = 1;\n public endOfResults = false;\n public showAutoIncrement = false;\n public selectAll = false;\n public showFilters = false;\n public filterFields = [];\n public sortConfig = null;\n public openSide = new BehaviorSubject(false);\n public Object = Object;\n\n\n private isMouseDown = false;\n private startRowIndex = null;\n private startCellIndex = null;\n private endRowIndex = null;\n private endCellIndex = null;\n private selectedCell = null;\n\n // Associative list of pick from datasets used for list selection\n private columnPickFromDatasets = {};\n\n\n constructor(private dialog: MatDialog,\n private route: ActivatedRoute,\n private datasourceService: DatasourceService,\n private datasetService: DatasetService,\n private snackbar: MatSnackBar,\n private location: Location,\n private router: Router\n ) {\n }\n\n ngOnInit(): void {\n this.datasourceInstanceKey = this.route.snapshot.params.key;\n\n if (this.datasourceInstanceKey) {\n this.showAutoIncrement = localStorage.getItem(this.datasourceInstanceKey + '_show_id') === 'true';\n this.loadDatasource();\n } else {\n const dialogRef = this.dialog.open(ImportWizardComponent, {\n width: '800px',\n height: '900px',\n disableClose: true,\n data: {\n columns: this.columns,\n datasourceUpdate: this.datasourceUpdate,\n rows: this.rows,\n datasourceInstanceKey: this.datasourceInstanceKey,\n reloadURL: this.reloadURL,\n namePrefix: this.namePrefix,\n automaticImportKey: this.automaticImportKey\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res === 'closed') {\n this.location.back();\n }\n });\n }\n }\n\n ngAfterViewInit() {\n if (this.sidenavService) {\n setTimeout(() => {\n this.sidenavService.close();\n }, 100);\n }\n\n document.addEventListener('mouseup', () => {\n this.isMouseDown = false;\n });\n }\n\n ngOnDestroy() {\n if (this.sidenavService) {\n this.sidenavService.open();\n }\n }\n\n public clearFilter() {\n this.filterJunction = {\n logic: 'AND',\n filters: [{\n lhsExpression: '',\n rhsExpression: [],\n filterType: ''\n }],\n filterJunctions: []\n };\n this.loadDatasource();\n }\n\n public applyFilter() {\n this.loadDatasource();\n }\n\n public sortColumn(column: any, direction: string) {\n this.sortConfig = {fieldName: column.name, direction};\n this.loadDatasource();\n }\n\n public updateSelectAll() {\n this.rows.map(row => {\n row._selected = this.selectAll;\n });\n }\n\n public updateSelected() {\n this.selectAll = _.every(this.rows, '_selected');\n }\n\n public updateAutoIncrementColumn(value) {\n if (value) {\n this.columns.map(column => {\n column.keyField = false;\n return column;\n });\n\n this.columns.unshift({\n title: 'ID',\n name: 'id',\n type: 'id'\n });\n } else {\n _.remove(this.columns, {type: 'id'});\n }\n }\n\n public addColumn(index?) {\n this.selectedItem = {\n _tableType: 'column',\n type: 'string'\n };\n\n if (index > -1) {\n this.columns.splice(index, 0, this.selectedItem);\n this.selectedItem._index = index;\n } else {\n this.columns.push(this.selectedItem);\n this.selectedItem._index = this.columns.length - 1;\n }\n\n setTimeout(() => {\n document.getElementById(this.selectedItem.type + this.selectedItem._index).scrollIntoView();\n });\n }\n\n public import() {\n const dialogRef = this.dialog.open(ImportDataComponent, {\n width: '800px',\n height: '900px',\n data: {\n columns: this.columns,\n datasourceUpdate: this.datasourceUpdate,\n rows: this.rows,\n datasourceInstanceKey: this.datasourceInstanceKey,\n reloadURL: this.reloadURL\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n if (!this.selectedCell) {\n const rowColIndex = 0;\n this.selectedCell = {rowIndex: 0, rowColIndex};\n }\n\n if (res.headerRow) {\n const columns = [];\n res.data[0].forEach(header => {\n columns.push({\n title: header,\n name: _.snakeCase(header),\n type: 'string'\n });\n });\n this.columns = columns;\n res.data.shift();\n this.insertCellData(res.data);\n\n } else {\n this.insertCellData(res.data);\n }\n }\n });\n }\n\n public async deleteSelectedEntries() {\n const message = 'Are you sure you would like to remove all of the selected entries? This action cannot be reversed.';\n if (window.confirm(message)) {\n const selected = _.filter(this.rows, '_selected');\n await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, {\n title: this.datasourceUpdate.title,\n importKey: this.datasourceUpdate.instanceImportKey || '',\n fields: this.datasourceUpdate.fields,\n adds: [],\n updates: [],\n deletes: selected\n });\n window.location.href = this.reloadURL + '/' + this.datasourceInstanceKey;\n }\n }\n\n public addFilter() {\n\n }\n\n public advancedSettings() {\n const dialogRef = this.dialog.open(AdvancedSettingsComponent, {\n width: '800px',\n height: '900px',\n data: {\n datasourceUpdate: this.datasourceUpdate,\n datasourceInstanceKey: this.datasourceInstanceKey,\n backendURL: this.backendURL,\n columns: this.columns,\n showAutoIncrement: this.showAutoIncrement\n }\n });\n dialogRef.afterClosed().subscribe(advancedSettings => {\n if (advancedSettings) {\n this.columns = advancedSettings.columns;\n this.datasourceUpdate.indexes = advancedSettings.datasourceUpdate.indexes;\n this.showAutoIncrement = advancedSettings.showAutoIncrement;\n localStorage.setItem(this.datasourceInstanceKey + '_show_id', String(this.showAutoIncrement));\n }\n });\n }\n\n public apiAccess() {\n const dialogRef = this.dialog.open(ApiAccessComponent, {\n width: '800px',\n height: '900px',\n data: {\n datasourceUpdate: this.datasourceUpdate,\n datasourceInstanceKey: this.datasourceInstanceKey,\n backendURL: this.backendURL,\n columns: this.columns\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n\n });\n }\n\n\n public selectColumn(column, index) {\n if (this.editColumns && !column.autoIncrement) {\n this.selectedCell = null;\n document.querySelectorAll('.datasource-table .bg-indigo-50').forEach(element => {\n element.classList.remove('bg-indigo-50');\n });\n\n if (index === this.selectedItem._index) {\n this.selectedItem = {};\n } else {\n column._tableType = 'column';\n column._index = index;\n if (!column.previousName) {\n column.previousName = column.name;\n }\n\n this.selectedItem = column;\n\n this.removeCellFocusBorder();\n }\n }\n }\n\n public deleteColumn(index) {\n this.columns.splice(index, 1);\n }\n\n public addRow(index?) {\n const row = {};\n this.columns.forEach(column => {\n row[column.name] = null;\n });\n\n if (index > -1) {\n this.rows.splice(index, 0, row);\n this.adds.push(index);\n } else {\n this.rows.push(row);\n this.adds.push(this.rows.length - 1);\n }\n\n setTimeout(() => {\n const tableWrapper = document.getElementById('tableWrapper');\n tableWrapper.scrollTop = tableWrapper.scrollHeight;\n }, 0);\n\n }\n\n public deleteRow(rowIndex) {\n const inAdds = this.adds.indexOf(rowIndex);\n if (inAdds > -1) {\n this.rows.splice(rowIndex, 1);\n this.adds.pop();\n } else {\n this.deletes.push(rowIndex);\n }\n\n const inUpdates = this.updates.indexOf(rowIndex);\n if (inUpdates > -1) {\n this.updates.splice(inUpdates, 1);\n }\n }\n\n public focusCell(event, rowIndex, rowColIndex) {\n this.selectedCell = {rowIndex, rowColIndex};\n this.removeCellFocusBorder();\n event.target.parentElement.classList.add('border', 'border-blue-500');\n }\n\n public blurCell() {\n this.selectedCell = null;\n this.removeCellFocusBorder();\n }\n\n public clearCell(rowIndex, rowColIndex) {\n const columnName = this.columns[rowColIndex].name;\n this.rows[rowIndex][columnName] = '';\n if (this.adds.indexOf(rowIndex) === -1) {\n this.updates.push(rowIndex);\n }\n }\n\n public updateField(field, rowIndex, event) {\n if (this.adds.indexOf(rowIndex) === -1) {\n if (this.updates.indexOf(rowIndex) === -1) {\n this.updates.push(rowIndex);\n }\n }\n\n // Handle implicit false values for booleans and implicit nulls for other fields\n if (field.type == 'boolean') {\n this.rows[rowIndex][field.name] = event.target.checked;\n } else {\n if (this.rows[rowIndex][field.name] === '')\n this.rows[rowIndex][field.name] = null;\n }\n\n this.editMode = true;\n }\n\n public updateColumnName() {\n this.selectedItem.name = _.snakeCase(this.selectedItem.title);\n this.rows.map(row => {\n row[this.selectedItem.name] = row[this.selectedItem.previousName] || '';\n if (row[this.selectedItem.previousName]) {\n delete row[this.selectedItem.previousName];\n }\n\n return row;\n });\n }\n\n public enterCell(rowIndex, rowColIndex, event) {\n const row = {};\n let rowElement = null;\n let rowElementIndex;\n this.columns.forEach(column => {\n row[column.name] = '';\n });\n if (rowIndex === this.rows.length - 1) {\n this.rows.push(row);\n rowElementIndex = this.rows.length - 1;\n this.adds.push(this.rows.length - 1);\n } else {\n rowElementIndex = rowIndex + 1;\n }\n\n setTimeout(() => {\n rowElement = document.querySelectorAll('.table-rows').item(rowElementIndex);\n const rowCell: any = rowElement.querySelectorAll('.row-cell').item(this.showAutoIncrement ? rowColIndex + 1 : rowColIndex);\n rowCell.querySelectorAll('.cell-input').item(0).focus();\n }, 0);\n }\n\n public async save(exit = false) {\n if (!this.datasourceUpdate.title) {\n window.alert('Please enter a title for this Datasource.');\n return;\n }\n\n if (!_.find(this.columns, {keyField: true}) &&\n !_.find(this.columns, {type: 'id'})) {\n window.alert('Please select one of your fields as the \"Unique Key\"');\n return;\n }\n\n this.datasourceUpdate.fields = this.columns.map(column => {\n if (column.name === column.previousName) {\n delete column.previousName;\n }\n return column;\n });\n\n const changes = ['adds', 'updates', 'deletes'];\n changes.forEach(change => {\n this.datasourceUpdate[change] = _.map(_.uniq(this[change]), rowIndex => {\n return this.rows[rowIndex];\n });\n });\n\n if (this.namePrefix && !this.datasourceUpdate.title.includes(this.namePrefix)) {\n this.datasourceUpdate.title = this.namePrefix + this.datasourceUpdate.title;\n }\n\n // Reset invalid items\n this.invalidItems = [];\n\n\n if (!this.datasourceInstanceKey) {\n\n if (this.automaticImportKey){\n this.datasourceUpdate.importKey = shortHash(Date.now().toString());\n }\n\n await this.datasourceService.createCustomDatasource(this.datasourceUpdate).then(key => {\n if (!exit) {\n window.location.href = this.reloadURL + '/' + key;\n }\n return true;\n }).catch(err => {\n const errorCode = (err.error && err.error.sqlStateCode) ? err.error.sqlStateCode : 0;\n this.displayError(errorCode);\n });\n } else {\n this.datasourceUpdate.importKey = this.datasourceUpdate.instanceImportKey;\n await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate)\n .then(async (result: any) => {\n if (result && result.rejected && result.rejected > 0) {\n\n this.snackbar.open('There were validation problems with one or more of your rows - see highlighted cells below', null, {\n duration: 5000,\n verticalPosition: 'top'\n });\n\n\n const invalidAddRows = _.map(result.validationErrors.add || [], 'itemNumber');\n for (let i = this.adds.length - 1; i >= 0; i--) {\n if (invalidAddRows.includes(i)) {\n this.invalidItems[this.adds[i]] = _.find(result.validationErrors.add, {itemNumber: i}).validationErrors;\n }\n }\n\n\n const invalidUpdateRows = _.map(result.validationErrors.update || [], 'itemNumber');\n for (let i = this.updates.length - 1; i >= 0; i--) {\n if (invalidUpdateRows.includes(i)) {\n this.invalidItems[this.updates[i]] = _.find(result.validationErrors.update, {itemNumber: i}).validationErrors;\n }\n }\n\n\n } else {\n this.adds = [];\n this.updates = [];\n this.deletes = [];\n\n\n await this.loadDatasource();\n }\n return true;\n })\n .catch(err => {\n console.log('ERROR', err);\n const errorCode = (err.error && err.error.sqlStateCode) ? err.error.sqlStateCode : 0;\n this.displayError(errorCode);\n });\n }\n\n if (exit) {\n return this.router.navigate([this.backURL]);\n }\n }\n\n public cancelChanges() {\n this.adds = [];\n this.updates = [];\n this.deletes = [];\n\n this.loadDatasource();\n }\n\n public setTypeConfig() {\n if (!this.selectedItem.typeConfig || Array.isArray(this.selectedItem.typeConfig)) {\n this.selectedItem.typeConfig = {};\n }\n }\n\n public deleteSelectedColumn() {\n this.columns.splice(this.selectedItem._index, 1);\n }\n\n public pageSizeChange(value) {\n this.limit = value;\n this.loadDatasource();\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.loadDatasource();\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.loadDatasource();\n }\n\n\n // Get input type for field\n public inputTypeForField(field: any) {\n switch (field.type) {\n case 'integer':\n case 'float':\n return 'number';\n case 'boolean':\n return 'checkbox';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime-local';\n default:\n return 'text';\n }\n }\n\n\n private loadDatasource() {\n if (this.datasourceInstanceKey) {\n\n // If we have a filter in use, apply it to the next load...\n const transformationInstances = [];\n if (this.filterJunction.filterJunctions.length || this.filterJunction.filters[0].filterType) {\n transformationInstances.push({type: 'filter', config: this.filterJunction});\n }\n if (this.sortConfig) {\n transformationInstances.push({type: 'multisort', config: {sorts: [this.sortConfig]}});\n }\n\n const evaluatedDatasource = {\n key: this.datasourceInstanceKey,\n transformationInstances,\n parameterValues: {},\n offset: this.offset,\n limit: this.limit\n };\n\n this.datasourceService.evaluateDatasource(evaluatedDatasource).then((res: any) => {\n\n let jsonColumns = [];\n\n this.columns = res.columns.map(column => {\n column.previousName = column.name;\n\n if (column.type === 'pickfromsource') {\n if (!this.columnPickFromDatasets[column.name]) {\n this.populateColumnPickFrom(column);\n }\n } else if (column.type === 'json') {\n jsonColumns.push(column.name);\n }\n\n return column;\n });\n this.filterFields = _.map(this.columns, column => {\n return {\n title: column.title,\n name: column.name\n };\n });\n this.rows = res.allData;\n\n // If JSON Columns, ensure we deserialise JSON values\n if (jsonColumns.length) {\n this.rows.forEach(row => {\n jsonColumns.forEach(jsonColumn => {\n if (row[jsonColumn] || null)\n row[jsonColumn] = JSON.stringify(row[jsonColumn]);\n });\n });\n }\n\n this.endOfResults = this.rows.length < this.limit;\n\n this.datasourceUpdate.title = res.instanceTitle;\n this.datasourceUpdate.instanceImportKey = res.instanceImportKey;\n this.datasourceUpdate.indexes = res.indexes;\n this.datasourceUpdate.adds = [];\n this.datasourceUpdate.updates = [];\n this.datasourceUpdate.deletes = [];\n\n this.autoIncrementColumn = _.some(this.columns, {type: 'id'});\n\n this.selectAll = false;\n });\n }\n this.editMode = false;\n }\n\n private selectCell(rowIndex, cellIndex) {\n let rowStart, rowEnd, cellStart, cellEnd;\n\n if (rowIndex < this.startRowIndex) {\n rowStart = rowIndex;\n rowEnd = this.startRowIndex;\n } else {\n rowStart = this.startRowIndex;\n rowEnd = rowIndex;\n }\n\n if (cellIndex < this.startCellIndex) {\n cellStart = cellIndex;\n cellEnd = this.startCellIndex;\n } else {\n cellStart = this.startCellIndex;\n cellEnd = cellIndex;\n }\n\n for (let i = rowStart; i <= rowEnd; i++) {\n const rowElement = document.querySelectorAll('.table-rows').item(i);\n const rowCells = rowElement.querySelectorAll('td');\n for (let j = cellStart; j <= cellEnd; j++) {\n rowCells.item(j).classList.add('bg-indigo-50');\n }\n }\n }\n\n private removeCellFocusBorder() {\n document.querySelectorAll('.input-wrapper.border-blue-500').forEach(element => {\n element.classList.remove('border-blue-500');\n });\n }\n\n private insertCellData(data) {\n const row = {};\n this.columns.forEach(column => {\n row[column.name] = '';\n });\n\n let startIndex = this.selectedCell.rowIndex;\n while (this.rows.length < (data.length + this.selectedCell.rowIndex)) {\n this.rows.push(_.clone(row));\n this.deletes.splice(startIndex, 1);\n this.updates.splice(startIndex, 1);\n this.adds.splice(startIndex, 1);\n this.adds.push(startIndex);\n startIndex++;\n }\n\n let rowIndex = 0;\n for (let i = this.selectedCell.rowIndex; i < (this.selectedCell.rowIndex + data.length); i++) {\n let valIndex = 0;\n const values = _.values(data[rowIndex]);\n for (let j = this.selectedCell.rowColIndex; j < (values.length + this.selectedCell.rowColIndex); j++) {\n if (this.columns[j]) {\n this.rows[i][this.columns[j].name] = values[valIndex] || '';\n }\n valIndex++;\n }\n rowIndex++;\n }\n }\n\n private displayError(code: any) {\n let message = 'There was an error creating/editing your data source. Please check and try again.';\n\n switch (Number(code)) {\n case 23000:\n message = 'Duplicate Unique Key Found. Please check for duplicate values in unique identity column.';\n break;\n }\n\n this.snackbar.open(message, null, {\n duration: 5000,\n verticalPosition: 'top'\n });\n }\n\n public selectColumnPickFromDatasource(column: any) {\n\n const dialogRef = this.dialog.open(CreateDatasetComponent, {\n width: '1200px',\n height: '800px',\n data: {}\n });\n dialogRef.afterClosed().subscribe(async res => {\n if (res) {\n column.typeConfig = {\n datasetInstanceId: res.datasetInstanceId,\n datasourceInstanceKey: res.datasourceInstanceKey\n };\n\n // Populate the column pick from\n this.populateColumnPickFrom(column);\n }\n });\n }\n\n\n // Pick from datasets\n private populateColumnPickFrom(column: any) {\n this.datasetService.evaluateDataset(column.typeConfig, '0', '10000000').then((dataset) => {\n this.columnPickFromDatasets[column.name] = dataset;\n });\n }\n}\n","<div class=\"border-b w-full flex items-center justify-between \">\n @if (!readonly) {\n <div\n class=\"leading-5 flex items-center px-4 text-xs w-96 uppercase tracking-wider font-medium text-gray-600\">\n Name\n <input type=\"text\" class=\"w-full py-1.5 ml-4\" placeholder=\"Enter datasource name\"\n [class]=\"{'border border-red-500': !datasourceUpdate.title}\"\n [(ngModel)]=\"datasourceUpdate.title\">\n </div>\n }\n @if (readonly) {\n <div\n class=\"leading-5 font-medium text-lg px-4\">{{datasourceUpdate.title.replace((namePrefix || ''), '')}}</div>\n }\n <div class=\"flex-1 flex items-center flex-wrap w-full justify-end bg-white\">\n @if (_.some(rows, '_selected')) {\n <button (click)=\"deleteSelectedEntries()\"\n class=\"w-28 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">delete_forever</mat-icon>\n delete selected\n </button>\n <div class=\"divider\"></div>\n }\n\n @if (!editMode) {\n <button (click)=\"showFilters = !showFilters\"\n [style]=\"{'background-color': this.showFilters ? '#00000012' : ''}\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">filter_alt</mat-icon>\n filter\n </button>\n }\n @if (!editMode) {\n <div class=\"divider\"></div>\n }\n @if (!editMode) {\n <button (click)=\"advancedSettings()\" [disabled]=\"!datasourceInstanceKey\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">tune</mat-icon>\n advanced\n </button>\n }\n @if (!editMode && !hideAPIAccess) {\n <button (click)=\"apiAccess()\" [disabled]=\"!datasourceInstanceKey\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">api</mat-icon>\n api access\n </button>\n }\n @if (!editMode) {\n <button (click)=\"import()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">upload_file</mat-icon>\n upload\n </button>\n }\n @if (!editMode) {\n <div class=\"divider\"></div>\n }\n\n @if (editMode) {\n <button (click)=\"cancelChanges()\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">cancel</mat-icon>\n cancel edit\n </button>\n }\n\n <button (click)=\"save()\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">save</mat-icon>\n save\n </button>\n </div>\n</div>\n@if (showFilters) {\n <div class=\"dataset-filters\">\n <div class=\"dataset-filter border-b border-gray-200\">\n @if (columns.length) {\n <ki-dataset-filters [filterFields]=\"filterFields\"\n [openSide]=\"openSide\"\n [filterJunction]=\"filterJunction\"></ki-dataset-filters>\n }\n <div class=\"flex items-center apply-filter\">\n <button mat-stroked-button class=\"mr-2 bg-white\" color=\"warn\"\n (click)=\"clearFilter()\">\n Clear Filter\n </button>\n <button mat-flat-button class=\"mr-2\" color=\"primary\"\n (click)=\"applyFilter()\" [disabled]=\"!filterJunction.filters.length\">\n Apply Filter\n </button>\n </div>\n </div>\n </div>\n}\n<div class=\"flex create-datasource-container\">\n <div class=\"flex-1 relative overflow-y-scroll table-scroll\">\n\n <div class=\"create-datasource\">\n <div id=\"tableWrapper\" class=\"flex-1 overflow-y-scroll relative\">\n <table class=\"datasource-table table-fixed w-full overflow-scroll\">\n <thead>\n <tr>\n <th class=\"w-10 relative cursor-pointer bg-gray-100 p-0 sticky text-xs\">\n <div class=\"flex items-center justify-center\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (ngModelChange)=\"updateSelectAll()\">\n </div>\n </th>\n @for (column of columns; track column; let colIndex = $index) {\n @if (column.type === 'id' ? showAutoIncrement : true) {\n <th [id]=\"column.type + colIndex\"\n class=\"w-64 relative cursor-pointer bg-gray-100 p-2 sticky text-xs\"\n [class]=\"{'bg-indigo-50': selectedItem._index === colIndex, 'border-r-0': (colIndex + 1) === columns.length}\">\n <div class=\"pr-8 w-full header-title\" (click)=\"selectColumn(column, colIndex)\">\n {{ column.title }}&nbsp;\n @if (column.keyField || column.type ==='id') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n class=\"w-5 h-5 text-yellow-500\">\n <path fill-rule=\"evenodd\"\n d=\"M8 7a5 5 0 113.61 4.804l-1.903 1.903A1 1 0 019 14H8v1a1 1 0 01-1 1H6v1a1 1 0 01-1 1H3a1 1 0 01-1-1v-2a1 1 0 01.293-.707L8.196 8.39A5.002 5.002 0 018 7zm5-3a.75.75 0 000 1.5A1.5 1.5 0 0114.5 7 .75.75 0 0016 7a3 3 0 00-3-3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n }\n </div>\n <button mat-icon-button [matMenuTriggerFor]=\"header\"\n class=\"absolute header-actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #header=\"matMenu\">\n <button mat-menu-item (click)=\"sortColumn(column, 'asc')\">\n <div class=\"flex items-center justify-between w-full\">\n Sort Ascending\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"h-6 w-6\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M3 4.5h14.25M3 9h9.75M3 13.5h5.25m5.25-.75L17.25 9m0 0L21 12.75M17.25 9v12\"/>\n </svg>\n </div>\n </button>\n <button mat-menu-item (click)=\"sortColumn(column, 'desc')\">\n <div class=\"flex items-center justify-between w-full\">\n Sort Descending\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"h-6 w-6\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M3 4.5h14.25M3 9h9.75M3 13.5h9.75m4.5-4.5v12m0 0-3.75-3.75M17.25 21 21 17.25\"/>\n </svg>\n </div>\n </button>\n @if (column.type !== 'id' && editColumns) {\n <button mat-menu-item (click)=\"addColumn(colIndex === 0 ? 0 : colIndex - 1)\">\n Insert column before\n </button>\n }\n @if (editColumns) {\n <button mat-menu-item (click)=\"addColumn(colIndex + 1)\">Insert column after</button>\n }\n @if (editColumns) {\n <button mat-menu-item (click)=\"deleteColumn(colIndex)\">Delete column</button>\n }\n </mat-menu>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row; let rowIndex = $index) {\n<tr class=\"table-rows\" [class]=\"{'bg-gray-200 opacity-30': this.deletes.indexOf(rowIndex) > -1,\n 'bg-green-50': this.adds.indexOf(rowIndex) > -1, 'bg-indigo-100': this.updates.indexOf(rowIndex) > -1}\"\n >\n <td class=\"p-0 row-cell text-center\">\n <div class=\"flex items-center justify-center\">\n <input type=\"checkbox\" [(ngModel)]=\"row._selected\" (ngModelChange)=\"updateSelected()\">\n </div>\n </td>\n @for (rowColumn of columns; track rowColumn; let rowColIndex = $index) {\n\n @if (rowColumn.type === 'id' ? showAutoIncrement : true) {\n<td\n [class]=\"{'bg-indigo-50': selectedItem._index === rowColIndex,\n 'w-24 bg-gray-100': columns[rowColIndex].type === 'id',\n 'bg-gray-100': columns[rowColIndex].keyField && this.adds.indexOf(rowIndex) === -1}\"\n class=\"p-0 row-cell\">\n <div\n class=\"py-1 px-2 h-full w-full border border-transparent input-wrapper flex items-center justify-between relative\">\n @if (columns[rowColIndex].type !== 'id' && columns[rowColIndex].type !== 'pickfromsource' && columns[rowColIndex].type !== 'boolean' && !columns[rowColIndex].keyField) {\n <input class=\"p-0 border-none w-full bg-transparent pr-10 cell-input\"\n [type]=\"inputTypeForField(rowColumn)\" #field=\"ngModel\"\n [(ngModel)]=\"row[rowColumn.name]\"\n [step]=\"1\"\n [max]=\"columns[rowColIndex].typeConfig ? columns[rowColIndex].typeConfig.maximumValue : null\"\n [min]=\"columns[rowColIndex].typeConfig ? columns[rowColIndex].typeConfig.minimumValue : null\"\n (change)=\"updateField(rowColumn, rowIndex, $event)\"\n (focus)=\"focusCell($event, rowIndex, rowColIndex)\"\n (keyup.enter)=\"enterCell(rowIndex, rowColIndex, $event)\">\n }\n @if (columns[rowColIndex].type === 'boolean' && !columns[rowColIndex].keyField) {\n <input class=\"p-0 border-none w-full bg-transparent pr-10 cell-input\"\n type=\"checkbox\" #field=\"ngModel\"\n [(ngModel)]=\"row[rowColumn.name]\"\n [step]=\"1\"\n (change)=\"updateField(rowColumn, rowIndex, $event)\"\n (focus)=\"focusCell($event, rowIndex, rowColIndex)\"\n (keyup.enter)=\"enterCell(rowIndex, rowColIndex, $event)\">\n }\n @if (columns[rowColIndex].type == 'pickfromsource' && columnPickFromDatasets[rowColumn.name]) {\n <div\n class=\"w-full pr-10\">\n <select\n class=\"p-0 border-none w-full bg-transparent cell-input outline-none ring-0\"\n #field=\"ngModel\"\n [(ngModel)]=\"row[rowColumn.name]\"\n (change)=\"updateField(field, rowIndex)\"\n (focus)=\"focusCell($event, rowIndex, rowColIndex)\"\n (keyup.enter)=\"enterCell(rowIndex, rowColIndex, $event)\">\n @for (pickFrom of columnPickFromDatasets[rowColumn.name].allData; track pickFrom) {\n <option\n [value]=\"pickFrom[rowColumn.typeConfig.valueFieldName]\">\n {{pickFrom[rowColumn.typeConfig.labelFieldName]}}\n </option>\n }\n </select>\n </div>\n }\n @if (columns[rowColIndex].type === 'id') {\n <div\n class=\"text-gray-500 text-xs\">{{ row[rowColumn.name] || '<\\generated\\>' }}\n </div>\n }\n @if (columns[rowColIndex].keyField) {\n @if (this.adds.indexOf(rowIndex) > -1) {\n <input class=\"p-0 border-none w-full bg-transparent pr-5 cell-input\"\n type=\"text\" #field=\"ngModel\" [(ngModel)]=\"row[rowColumn.name]\"\n (change)=\"updateField(field, rowIndex)\"\n (focus)=\"focusCell($event, rowIndex, rowColIndex)\"\n (keyup.enter)=\"enterCell(rowIndex, rowColIndex, $event)\">\n }\n @if (this.adds.indexOf(rowIndex) === -1) {\n <div class=\"text-gray-500 text-xs\">{{ row[rowColumn.name] }}</div>\n }\n }\n @if (invalidItems[rowIndex] && invalidItems[rowIndex][rowColumn.name]) {\n <span\n class=\"absolute material-symbols-outlined right-0 w-10 text-orange-500 text-lg\"\n [matTooltip]=\"invalidItems[rowIndex][rowColumn.name]\">warning</span>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n class=\"absolute cell-actions\" tabindex=\"-1\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"addRow(rowIndex + 1)\">Add row</button>\n <button mat-menu-item (click)=\"deleteRow(rowIndex)\">Delete row</button>\n @if (columns[rowColIndex].type !== 'id') {\n <button\n mat-menu-item (click)=\"clearCell(rowIndex, rowColIndex)\">Clear cell\n </button>\n }\n </mat-menu>\n </div>\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n <div (click)=\"addRow()\" title=\"Add Row\"\n class=\"cursor-pointer flex items-center text-sm m-2 p-1 bg-gray-100 rounded-md\">\n <button class=\"ml-2\" mat-icon-button color=\"primary\">\n <mat-icon>add_circle</mat-icon>\n </button>\n Add new row\n </div>\n </div>\n\n\n <div class=\"border-t bg-gray-50 py-2 flex align-center justify-between\">\n <button class=\"ml-2\" mat-icon-button color=\"primary\" title=\"Add Row\" (click)=\"addRow()\">\n <mat-icon>add_circle</mat-icon>\n </button>\n @if (!editMode) {\n <div class=\"flex items-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - rows.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-2\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n <div class=\"border-l border-r bg-gray-50 -ml-2.5\">\n <button mat-icon-button color=\"primary\" title=\"Add Column\" (click)=\"addColumn()\"\n class=\"-mt-0.5\">\n <mat-icon>add_circle</mat-icon>\n </button>\n </div>\n\n @if (Object.keys(selectedItem).length) {\n <div class=\"bg-gray-100 w-72 h-full p-3 flex justify-between flex-col\">\n <div>\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Settings\n </div>\n <hr class=\"my-4\">\n @if (selectedItem._tableType) {\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Column\n </div>\n @if (datasourceUpdate.instanceImportKey) {\n <label class=\"mb-4\">\n Column Key\n <input type=\"text\" [(ngModel)]=\"selectedItem.name\" disabled>\n </label>\n }\n <label class=\"mb-4\">\n Column Title\n <input type=\"text\" [(ngModel)]=\"selectedItem.title\" placeholder=\"Enter column title\"\n (change)=\"updateColumnName()\">\n </label>\n @if (selectedItem.type === 'id') {\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" disabled>\n <option [value]=\"'id'\">ID</option>\n </select>\n </label>\n }\n @if (selectedItem.type !== 'id') {\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" (ngModelChange)=\"setTypeConfig()\">\n <option [value]=\"null\">-- Select column type --</option>\n @for (type of Object.keys(datasourceTypes); track type) {\n <option [value]=\"type\">\n {{ datasourceTypes[type] }}\n </option>\n }\n </select>\n </label>\n }\n @if (selectedItem.typeConfig && selectedItem.type == 'integer' || selectedItem.type == 'float') {\n <div class=\"flex items-center gap-2\"\n >\n <label class=\"mb-4 w-32\">\n Minimum Value\n <input type=\"number\" class=\"py-1 px-2\"\n [(ngModel)]=\"selectedItem.typeConfig.minimumValue\" placeholder=\"Enter value\" />\n </label>\n <label class=\"mb-4 w-32\">\n Maximum Value\n <input type=\"number\" class=\"py-1 px-2\"\n [(ngModel)]=\"selectedItem.typeConfig.maximumValue\" placeholder=\"Enter value\" />\n </label>\n </div>\n }\n @if (selectedItem.type == 'pickfromsource') {\n <div class=\"mb-4\">\n @if (selectedItem.typeConfig && columnPickFromDatasets[selectedItem.name]) {\n <div\n class=\"mb-4\">\n Datasource: <span\n class=\"text-gray-500\">{{ columnPickFromDatasets[selectedItem.name].instanceTitle }}</span>\n </div>\n }\n <button mat-flat-button color=\"primary\" (click)=\"selectColumnPickFromDatasource(selectedItem)\">\n Select Datasource\n </button>\n @if (selectedItem.typeConfig && columnPickFromDatasets[selectedItem.name]) {\n <div class=\"mt-4\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Label column\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"selectedItem.typeConfig.labelFieldName\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm py-1 px-2\">\n @for (column of columnPickFromDatasets[selectedItem.name].columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n </select>\n </div>\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Value column\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <select [(ngModel)]=\"selectedItem.typeConfig.valueFieldName\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm py-1 px-2\">\n @for (column of columnPickFromDatasets[selectedItem.name].columns; track column) {\n <option\n [value]=\"column.name\">\n {{column.title}}\n </option>\n }\n </select>\n </div>\n </div>\n }\n </div>\n }\n <div>\n <mat-checkbox class=\"mb-4\"\n [(ngModel)]=\"selectedItem.required\">\n Required\n </mat-checkbox>\n </div>\n <div>\n <mat-checkbox class=\"mb-4\"\n [(ngModel)]=\"selectedItem.valueExpressionOnNullOnly\" (change)=\"!($event.checked) ? selectedItem.valueExpression = '' : null\">\n Has Default Value\n </mat-checkbox>\n </div>\n @if (selectedItem.valueExpressionOnNullOnly) {\n <label class=\"mb-4\">\n Default Value\n <input type=\"text\" [(ngModel)]=\"selectedItem.valueExpression\" placeholder=\"Enter default value\">\n </label>\n }\n <div>\n <button mat-button color=\"warn\" (click)=\"deleteSelectedColumn()\">Delete Column</button>\n </div>\n <hr class=\"my-4\">\n }\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"save(true)\">\n Save & Exit\n </button>\n </div>\n}\n</div>\n\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {BehaviorSubject, merge} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {\n DatasetEditorPopupComponent\n} from '../../dataset/dataset-editor/dataset-editor.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport * as lodash from 'lodash';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-document-datasource',\n templateUrl: './document-datasource.component.html',\n styleUrls: ['./document-datasource.component.sass'],\n standalone: false\n})\nexport class DocumentDatasourceComponent implements OnInit {\n\n @Input() showCustomParser: boolean;\n\n public datasourceKey: any;\n public searchText = new BehaviorSubject('');\n public searchParser = new BehaviorSubject('');\n public datasources: any = [];\n public documentParsers: any = [];\n public selectedDatasource: any;\n public datasource: any = {config: {stopWords: []}};\n public evaluatedDatasource: any;\n public showSettings = true;\n public showUpload = false;\n public String = String;\n public files: any = null;\n public _ = _;\n public builtInStopWords = {\n builtIn: false\n };\n public uploadResults: any;\n public failedResults: any = [];\n public uploading = false;\n public page = 1;\n public endOfResults = false;\n public limit = 25;\n\n private offset = 0;\n\n constructor(private route: ActivatedRoute,\n private datasourceService: DatasourceService,\n private datasetService: DatasetService,\n private dialog: MatDialog) {\n }\n\n async ngOnInit(): Promise<any> {\n this.route.params.subscribe(async param => {\n this.datasourceKey = param.key;\n if (this.datasourceKey) {\n this.showSettings = false;\n this.datasource = await this.datasourceService.getDatasource(this.datasourceKey);\n\n this.evaluateDatasource();\n\n if (this.datasource.config.stopWords && this.datasource.config.stopWords.length) {\n for (const stopWord of this.datasource.config.stopWords) {\n if (stopWord.custom) {\n stopWord.datasource = await this.datasourceService.getDatasource(stopWord.datasourceKey);\n this.updateDatasource(stopWord, stopWord.datasource);\n }\n if (stopWord.builtIn) {\n this.builtInStopWords = stopWord;\n }\n }\n }\n }\n });\n\n this.searchText\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasources()\n )\n ).subscribe((datasources: any) => {\n this.datasources = datasources;\n });\n\n this.searchParser\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDocumentParsers()\n )\n ).subscribe((parsers: any) => {\n this.documentParsers = parsers;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluateDatasource();\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.evaluateDatasource();\n }\n\n public pageSizeChange(value) {\n this.limit = value;\n this.evaluateDatasource(true);\n }\n\n public viewFullItemData(data, columnName) {\n this.dialog.open(DatasetEditorPopupComponent, {\n width: '800px',\n height: '400px',\n data: {\n fullData: data,\n columnName\n }\n });\n }\n\n public indexDocumentChange(change) {\n if (change) {\n if (!this.datasource.config.minPhraseLength) {\n this.datasource.config.minPhraseLength = 1;\n }\n if (!this.datasource.config.maxPhraseLength) {\n this.datasource.config.maxPhraseLength = 1;\n }\n }\n }\n\n public chunkContentChange(change) {\n if (change){\n if (!this.datasource.config.chunkContent){\n this.datasource.config.indexChunksByAI = false\n }\n }\n }\n\n public updateBuiltInStopWordConfig(value) {\n _.remove(this.datasource.config.stopWords, stopWord => {\n return stopWord.builtIn !== undefined;\n });\n if (!this.datasource.config.stopWords) {\n this.datasource.config.stopWords = [];\n }\n this.datasource.config.stopWords.push(this.builtInStopWords);\n }\n\n public removeCustomStopWord(index) {\n this.datasource.config.stopWords.splice(index, 1);\n }\n\n public humanFileSize(size: any) {\n const i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));\n return Number((size / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];\n }\n\n public displayFn(dataset): string {\n return dataset && dataset.title ? dataset.title : '';\n }\n\n public dragOverHandler(ev) {\n // Prevent default behavior (Prevent file from being opened)\n ev.preventDefault();\n }\n\n public dropHandler(ev) {\n // Prevent default behavior (Prevent file from being opened)\n ev.preventDefault();\n\n this.files = [];\n\n if (ev.dataTransfer.items) {\n // Use DataTransferItemList interface to access the file(s)\n for (let i = 0; i < ev.dataTransfer.items.length; i++) {\n // If dropped items aren't files, reject them\n if (ev.dataTransfer.items[i].kind === 'file') {\n const file = ev.dataTransfer.items[i].getAsFile();\n this.files.push(file);\n }\n }\n } else {\n // Use DataTransfer interface to access the file(s)\n for (let i = 0; i < ev.dataTransfer.files.length; i++) {\n const file = ev.dataTransfer.files[i];\n this.files.push(file);\n }\n }\n }\n\n public fileUpload(event) {\n this.files = Array.from(event.target.files);\n }\n\n public removeFile(index) {\n this.files.splice(index, 1);\n }\n\n public downloadDoc(url) {\n window.open(url);\n }\n\n public async uploadFiles() {\n const formData = new FormData();\n\n for (const file of this.files) {\n\n formData.append(file.name, file);\n }\n\n await this.uploadDatasourceDocuments(formData);\n this.evaluateDatasource();\n }\n\n public async updateDatasource(stopWord, datasource) {\n stopWord.datasourceKey = datasource.key;\n stopWord.datasource = datasource;\n\n const datasetInstanceSummary = {\n datasetInstanceId: null,\n datasourceInstanceKey: datasource.key,\n transformationInstances: [],\n parameterValues: {},\n parameters: [],\n originDataItemTitle: datasource.title\n };\n\n stopWord.selectedDatasource = await this.datasetService.evaluateDataset(datasetInstanceSummary, '0', '1');\n }\n\n public updateCustomParser(value) {\n this.datasource.config.customDocumentParser = value;\n }\n\n public async save() {\n if (!this.datasourceKey) {\n this.datasourceKey = await this.datasourceService.createDocumentDatasource(this.datasource);\n\n if (this.files && this.files.length) {\n await this.uploadFiles();\n this.evaluateDatasource();\n }\n\n window.location.href = window.location.href + '/' + this.datasourceKey;\n\n } else {\n await this.datasourceService.updateDatasourceInstance(this.datasourceKey, this.datasource);\n\n this.evaluateDatasource();\n }\n }\n\n private getDatasources() {\n return this.datasourceService.getDatasources(\n this.searchText.getValue() || '',\n '10',\n '0'\n ).pipe(map((datasources: any) => {\n return datasources;\n })\n );\n }\n\n private getDocumentParsers() {\n return this.datasourceService.getDatasources(\n this.searchText.getValue() || '',\n '10',\n '0'\n ).pipe(map((datasources: any) => {\n return [\n {\n title: 'Plenipot Bucharest 22',\n value: 'plenipotBucharest22'\n },\n {\n title: 'ITU Study Group',\n value: 'itustudygroup'\n },\n {\n title: 'IETF Internet Drafts',\n value: 'ietfinternetdrafts'\n },\n {\n title: 'WTSA',\n value: 'wtsa'\n },\n {\n title: 'WTDC',\n value: 'wtdc'\n }\n ];\n })\n );\n }\n\n private async uploadDatasourceDocuments(formData) {\n this.uploading = true;\n const trackingKey = Date.now() + (Math.random() + 1).toString(36).substr(2, 5);\n\n this.datasourceService.uploadDatasourceDocuments(this.datasourceKey, formData, trackingKey).catch(err => {\n // Ignore - we have set off a long-running task which we are tracking below\n });\n\n this.files = null;\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n const resultSub = this.datasourceService.getDataTrackingResults(trackingKey).subscribe((res: any) => {\n this.uploadResults = res;\n if (res && res.status === 'COMPLETED') {\n this.uploading = false;\n resultSub.unsubscribe();\n this.failedResults = res.progressData.failed || [];\n resolve(true);\n setTimeout(() => {\n this.uploadResults = null;\n this.failedResults = [];\n }, 5000);\n }\n });\n }, 100);\n });\n }\n\n private async evaluateDatasource(resetPager = false) {\n if (resetPager) {\n this.offset = 0;\n this.page = 1;\n }\n\n this.datasource.limit = this.limit;\n this.datasource.offset = this.offset;\n this.evaluatedDatasource = await this.datasourceService.evaluateDatasource(this.datasource);\n this.evaluatedDatasource.allData.map(data => {\n if (data.file_size) {\n data.file_size = this.humanFileSize(data.file_size);\n }\n if (data.file_type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {\n data.file_type = 'application/docx';\n }\n return data;\n });\n\n this.endOfResults = this.evaluatedDatasource.allData.length < this.limit;\n }\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">\n {{!datasourceKey ? 'Document Datasource' : (datasource.title || 'Document Datasource')}}\n </h1>\n <p class=\"text-sm font-medium text-gray-500\">\n @if (!datasourceKey) {\n Upload your documents using the form below.\n }\n @if (datasourceKey) {\n View your existing documents below and adjust any document settings here.\n }\n </p>\n </div>\n </div>\n @if (datasourceKey) {\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button type=\"button\" (click)=\"showUpload = !showUpload\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Upload Additional Documents\n </button>\n </div>\n }\n </div>\n</div>\n\n@if (uploading) {\n <div class=\"bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: solid/information-circle -->\n <svg class=\"h-5 w-5 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3 w-full\">\n <p class=\"text-sm text-primary font-medium\">Progress</p>\n @if (uploadResults && uploadResults.progressData) {\n <div class=\"text-primary my-2\">Uploaded {{uploadResults.progressData.completed}}\n /{{uploadResults.progressData.total}}</div>\n <mat-progress-bar class=\"w-full my-4\" mode=\"determinate\"\n [value]=\"(uploadResults.progressData.completed/uploadResults.progressData.total) * 100\"></mat-progress-bar>\n }\n @if (!uploadResults || !uploadResults.progressData) {\n <div class=\"text-primary my-2\">Preparing Upload...</div>\n <mat-progress-bar class=\"w-full my-4\" mode=\"buffer\"></mat-progress-bar>\n }\n </div>\n </div>\n </div>\n}\n\n@if (!failedResults.length && uploadResults && !uploading) {\n <div class=\"bg-green-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: solid/check-circle -->\n <svg class=\"h-5 w-5 text-green-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"\n fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-green-800\">Upload completed</h3>\n <div class=\"mt-2 text-sm text-green-700\">\n <p><b>{{uploadResults.progressData.completed}}</b> files were processed successfully out of\n <b>{{uploadResults.progressData.total}}</b> uploaded items.</p>\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (failedResults.length && uploadResults) {\n <div class=\"bg-red-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: solid/x-circle -->\n <svg class=\"h-5 w-5 text-red-400\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{failedResults.length}} errors with your\n submission</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc pl-5 space-y-1\">\n @for (failedResult of failedResults; track failedResult) {\n <li>\n {{failedResult.message}}\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (showUpload) {\n <div\n class=\"space-y-8 p-6 bg-gray-50 border-b\">\n <div class=\"space-y-8 sm:space-y-5\">\n <div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <label class=\"block text-sm font-medium text-gray-700\">\n Upload Documents\n <div class=\"text-xs font-normal text-gray-500\">\n Additional documents to be processed.\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n @if (!files || !files.length) {\n <div\n (drop)=\"dropHandler($event)\" (dragover)=\"dragOverHandler($event)\"\n class=\"w-full flex justify-center px-6 pt-5 pb-6 border-2 border-gray-300 border-dashed rounded-md\">\n <div class=\"space-y-1 text-center\">\n <svg class=\"mx-auto h-12 w-12 text-gray-400\" stroke=\"currentColor\" fill=\"none\"\n viewBox=\"0 0 48 48\" aria-hidden=\"true\">\n <path\n d=\"M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <div class=\"flex text-sm text-gray-600\">\n <label\n class=\"relative cursor-pointer rounded-md font-medium text-secondary focus-within:outline-none\">\n <span>Select file(s) to upload</span>\n <input name=\"additionalUpload\" multiple type=\"file\" class=\"sr-only\"\n (change)=\"fileUpload($event)\">\n </label>\n <p class=\"pl-1 mb-0\">or drag and drop</p>\n </div>\n <p class=\"text-xs text-gray-500\">.docx, .txt, .pfd, .zip</p>\n </div>\n </div>\n }\n @if (files && files.length) {\n <div\n class=\"overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg\">\n <table class=\"min-w-full divide-y divide-gray-300 block overflow-y-auto max-h-48\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" colspan=\"2\"\n class=\"sticky top-0 z-10 bg-gray-100 py-2 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6\">\n Selected File Preview\n <span class=\"text-xs text-gray-500 lowercase ml-4 font-normal\">\n click <span class=\"font-medium\">'Upload Files'</span> to upload the selected files.</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n @for (file of files; track file; let i = $index) {\n <tr>\n <td class=\"whitespace-nowrap py-2 pl-4 pr-3 text-xs font-medium text-gray-900 sm:pl-6\">\n {{file.name}}\n </td>\n <td class=\"relative whitespace-nowrap py-2 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"removeFile(i)\" class=\"text-danger\">Remove</a>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"\">\n <div class=\"flex justify-end\">\n <button type=\"button\" (click)=\"showUpload = false;files = null\"\n class=\"bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none\">\n Cancel\n </button>\n <button type=\"submit\" [disabled]=\"!files\"\n class=\"disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-secondary focus:outline-none\"\n (click)=\"uploadFiles()\">Upload Files\n </button>\n </div>\n </div>\n </div>\n }\n\n <div class=\"transformation-listing py-2 bg-gray-50 cursor-pointer\"\n (click)=\"showSettings = !showSettings\" [class]=\"{'border-b': !showSettings}\">\n <a class=\"list-title flex items-center\">\n Settings&nbsp;\n @if (!showSettings) {\n <mat-icon>expand_more</mat-icon>\n }\n @if (showSettings) {\n <mat-icon>expand_less</mat-icon>\n }\n </a>\n <div class=\"ml-6 text-xs text-gray-500\">\n Adjust the rules around how the uploaded documents will\n be processed.\n </div>\n </div>\n\n @if (showSettings) {\n <div [class]=\"{'border-b': showSettings}\"\n class=\"space-y-8 divide-y divide-gray-200 p-6 bg-gray-50\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n <div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Title\n <div class=\"text-xs font-normal text-gray-500\">Enter the name to identify this data source</div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <input type=\"text\" [(ngModel)]=\"datasource.title\"\n class=\"max-w-lg block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:max-w-xs sm:text-sm border-gray-300 rounded-md\">\n </div>\n </div>\n @if (!datasourceKey) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Upload Documents\n <div class=\"text-xs font-normal text-gray-500\">\n The documents to be processed.\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n @if (!files || !files.length) {\n <div\n (drop)=\"dropHandler($event)\" (dragover)=\"dragOverHandler($event)\"\n class=\"w-full flex justify-center px-6 pt-5 pb-6 border-2 border-gray-300 border-dashed rounded-md\">\n <div class=\"space-y-1 text-center\">\n <svg class=\"mx-auto h-12 w-12 text-gray-400\" stroke=\"currentColor\" fill=\"none\"\n viewBox=\"0 0 48 48\" aria-hidden=\"true\">\n <path\n d=\"M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <div class=\"flex text-sm text-gray-600\">\n <label\n class=\"relative cursor-pointer rounded-md font-medium text-secondary focus-within:outline-none\">\n <span>Select file(s) to upload</span>\n <input name=\"additionalUpload\" multiple type=\"file\" class=\"sr-only\"\n (change)=\"fileUpload($event)\">\n </label>\n <p class=\"pl-1 mb-0\">or drag and drop</p>\n </div>\n <p class=\"text-xs text-gray-500\">.docx, .txt, .pfd, .zip</p>\n </div>\n </div>\n }\n @if (files) {\n <div\n class=\"overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg\">\n <table class=\"min-w-full divide-y divide-gray-300 block overflow-y-auto max-h-48\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" colspan=\"2\"\n class=\"sticky top-0 z-10 bg-gray-100 py-2 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6\">\n Selected File Preview\n <span class=\"text-xs text-gray-500 lowercase ml-4 font-normal\">\n click <span class=\"font-medium\">'Upload Files'</span> to upload the selected files.</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200 bg-white\">\n @for (file of files; track file; let i = $index) {\n <tr>\n <td class=\"whitespace-nowrap py-2 pl-4 pr-3 text-xs font-medium text-gray-900 sm:pl-6\">\n {{file.name}}\n </td>\n <td class=\"relative whitespace-nowrap py-2 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"removeFile(i)\" class=\"text-danger\">Remove</a>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n }\n @if (showCustomParser) {\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Custom Document Parser\n <div class=\"text-xs font-normal text-gray-500\">\n Use a custom document parser to process the documents.\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <label class=\"mb-4 text-sm\">\n Select Custom Document Parser\n <input type=\"text\" [matAutocomplete]=\"autoParsers\"\n [(ngModel)]=\"datasource.config.customDocumentParser\"\n (keyup)=\"searchParser.next($event.target.value)\"\n placeholder=\"Search for a custom parser\">\n <mat-autocomplete #autoParsers=\"matAutocomplete\">\n @for (parser of documentParsers; track parser) {\n <mat-option [value]=\"parser.value\">\n {{parser.title}}\n </mat-option>\n }\n </mat-autocomplete>\n <small class=\"font-normal\">Start typing name to view available parsers</small>\n </label>\n </div>\n </div>\n }\n @if (!datasource.config.customDocumentParser) {\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Indexing\n <div class=\"text-xs font-normal text-gray-500\">\n Set whether you want the content of the documents to be indexed\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <mat-checkbox class=\"block mb-4\" [(ngModel)]=\"datasource.config.indexContent\"\n (ngModelChange)=\"indexDocumentChange($event)\">Index Document\n Content\n </mat-checkbox>\n @if (datasource.config.indexContent) {\n <div class=\"max-w-lg flex rounded-md shadow-sm mb-2\">\n <span\n class=\"inline-flex items-center px-3 rounded-l-md border border-r-0 border-gray-300 bg-gray-50 text-gray-500 sm:text-sm\"> Min phrase length (words) </span>\n <input type=\"number\" name=\"minPhrase\" [min]=\"1\"\n [(ngModel)]=\"datasource.config.minPhraseLength\"\n class=\"flex-1 block w-full min-w-0 rounded-none rounded-r-md sm:text-sm border-gray-300\">\n </div>\n <div class=\"max-w-lg flex rounded-md shadow-sm\">\n <span\n class=\"inline-flex items-center px-3 rounded-l-md border border-r-0 border-gray-300 bg-gray-50 text-gray-500 sm:text-sm\"> Max phrase length (words) </span>\n <input type=\"number\" name=\"maxPhrase\" [min]=\"1\"\n [(ngModel)]=\"datasource.config.maxPhraseLength\"\n class=\"flex-1 block w-full min-w-0 rounded-none rounded-r-md sm:text-sm border-gray-300\">\n </div>\n }\n </div>\n </div>\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Chunking\n <div class=\"text-xs font-normal text-gray-500\">\n Set whether you want to split the documents into chunks for analysis\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <mat-checkbox class=\"block mb-4\" [(ngModel)]=\"datasource.config.chunkContent\" (ngModelChange)=\"chunkContentChange($event)\"> Chunk Document Content\n </mat-checkbox>\n @if (datasource.config.chunkContent) {\n <mat-checkbox class=\"block mb-4\" [(ngModel)]=\"datasource.config.indexChunksByAI\">Index Chunks by AI\n </mat-checkbox>\n }\n </div>\n </div>\n @if (datasource.config.indexContent) {\n <div\n class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Stop Words\n <div class=\"text-xs font-normal text-gray-500\">\n A list of words to exclude from being indexed.\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <mat-checkbox class=\"block mb-2\" [(ngModel)]=\"builtInStopWords.builtIn\"\n (ngModelChange)=\"updateBuiltInStopWordConfig($event)\">Use Built In\n </mat-checkbox>\n @if (builtInStopWords.builtIn && datasource.config.maxPhraseLength > 1) {\n <label class=\"mb-4\">\n Min phrase length for including stop words\n <input type=\"number\" [min]=\"2\"\n [(ngModel)]=\"builtInStopWords.minPhraseLength\">\n <small class=\"font-normal\">The built it stop words will be included when the phrase\n length is greater than or equal to this value.</small>\n </label>\n }\n @if (_.filter(datasource.config.stopWords, 'custom').length) {\n <hr class=\"my-4\">\n }\n @for (stopWord of _.filter(datasource.config.stopWords, 'custom'); track stopWord; let i = $index) {\n <div class=\"flex items-center justify-between\">\n <div>\n <label class=\"mb-4 text-sm\">\n Datasource\n <input type=\"text\" [matAutocomplete]=\"autoDatasets\"\n [value]=\"stopWord.datasource ? stopWord.datasource.title : ''\"\n (keyup)=\"searchText.next($event.target.value)\"\n placeholder=\"Search for a datasource\">\n <mat-autocomplete #autoDatasets=\"matAutocomplete\" [displayWith]=\"displayFn\">\n @for (datasource of datasources; track datasource) {\n <mat-option [value]=\"datasource\"\n (onSelectionChange)=\"updateDatasource(stopWord, $event.source.value)\">\n {{datasource.title}}\n </mat-option>\n }\n </mat-autocomplete>\n <small class=\"font-normal\">Start typing name to view available\n datasources</small>\n </label>\n @if (stopWord.selectedDatasource && stopWord.selectedDatasource.columns) {\n <div>\n <label class=\"mb-4\">\n Stop Words Column\n <select matNativeControl [(ngModel)]=\"stopWord.datasourceColumn\">\n @for (column of stopWord.selectedDatasource.columns; track column) {\n <option\n [ngValue]=\"column.name\">\n {{column.title}}\n </option>\n }\n </select>\n <small class=\"font-normal\">Select the column to use for the stop\n words</small>\n </label>\n @if (datasource.config.maxPhraseLength > 1) {\n <label class=\"mb-4\">\n Min phrase length for including stop words\n <input type=\"number\" [min]=\"2\"\n [(ngModel)]=\"stopWord.minPhraseLength\">\n <small\n class=\"font-normal\">The {{stopWord.datasource ? stopWord.datasource.title : ''}}\n stop words will be included when the\n phrase length is greater than or equal to this value.</small>\n </label>\n }\n </div>\n }\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeCustomStopWord(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n <hr class=\"my-4\">\n }\n <button mat-button color=\"primary\"\n (click)=\"datasource.config.stopWords.push({custom: true})\">\n <mat-icon>add</mat-icon>\n Add Custom Stop Words\n </button>\n </div>\n </div>\n }\n }\n <div class=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Storage Options\n <div class=\"text-xs font-normal text-gray-500\">\n Securely save an original copy of the document and/or its original text.\n </div>\n </label>\n <div class=\"mt-1 sm:mt-0 sm:col-span-2\">\n <mat-checkbox class=\"block mb-2\" [(ngModel)]=\"datasource.config.storeOriginal\">Store\n Original File\n </mat-checkbox>\n <mat-checkbox class=\"block mb-2\" [(ngModel)]=\"datasource.config.storeText\">Store Document\n Text\n </mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\"\n class=\"bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none\">\n Cancel\n </button>\n <button type=\"submit\" [disabled]=\"!datasource.title\"\n class=\"disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-secondary focus:outline-none\"\n (click)=\"save()\">\n @if (!datasourceKey) {\n Create Datasource\n }\n @if (datasourceKey) {\n Update Settings\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (evaluatedDatasource) {\n <div class=\"overflow-scroll\">\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n @for (column of evaluatedDatasource.columns; track column) {\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n {{column.title}}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n @for (data of evaluatedDatasource.allData; track data) {\n <tr>\n @for (column of evaluatedDatasource.columns; track column; let i = $index) {\n <td\n [class]=\"{'font-medium': i === 0}\"\n class=\"border-b border-gray-200 py-2 px-4 text-sm text-gray-900\">\n @if (column.name === 'original_link') {\n <a class=\"flex items-center text-cta hover:underline\" (click)=\"downloadDoc(data[column.name])\">\n {{data[column.name]}}\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ml-1 h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"/>\n </svg>\n </a>\n }\n @if (column.name !== 'original_link') {\n @if (data[column.name] && String(data[column.name]).length <= 100) {\n {{data[column.name]}}\n }\n @if (data[column.name] && String(data[column.name]).length > 100) {\n <div>{{data[column.name].substring(0, 100) + '...'}}</div>\n <a (click)=\"viewFullItemData(data[column.name], column.name)\"\n class=\"flex items-center text-sm text-cta hover:underline\">\n view more\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ml-1 h-4 w-4\" fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"/>\n </svg>\n </a>\n }\n @if (!data[column.name]) {\n {{data[column.name]}}\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div class=\"bg-white p-4 flex align-center justify-end\">\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\" class=\"mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n }\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {DashboardService} from '../../../services/dashboard.service';\nimport {DatasetService} from '../../../services/dataset.service';\nimport {DatasourceService} from '../../../services/datasource.service';\nimport {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';\nimport * as _ from 'lodash';\n\n@Component({\n selector: 'ki-project-link-selection',\n templateUrl: './project-link-selection.component.html',\n styleUrls: ['./project-link-selection.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class ProjectLinkSelectionComponent implements OnInit {\n\n public searchText = new BehaviorSubject('');\n public projectDashboards: any = [];\n public sharedDashboards: any = [];\n public storedQueries: any = [];\n public dataPackages: any = [];\n public datasources: any = [];\n\n constructor(public dialogRef: MatDialogRef<ProjectLinkSelectionComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dashboardService: DashboardService,\n private datasetService: DatasetService,\n private datasourceService: DatasourceService) {\n }\n\n ngOnInit(): void {\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getProjectDashboards()\n )\n ).subscribe((dashboards: any) => {\n this.projectDashboards = dashboards;\n });\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getSharedDashboards()\n )\n ).subscribe((dashboards: any) => {\n this.sharedDashboards = dashboards;\n });\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe((datasets: any) => {\n this.storedQueries = datasets;\n });\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDataPackages()\n )\n ).subscribe((datasets: any) => {\n this.dataPackages = datasets;\n });\n\n merge(this.searchText)\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(() =>\n this.getDatasources()\n )\n ).subscribe((sources: any) => {\n this.datasources = sources;\n });\n }\n\n public selectDashboard(dashboard) {\n this.dialogRef.close(this.data.dashboardURL + '/view/' + dashboard.id);\n }\n\n public selectQuery(query) {\n this.dialogRef.close(this.data.queryURL + '/' + query.id);\n }\n\n public selectDatasource(datasource) {\n const datasourceURL = _.find(this.data.datasourceURLs, {type: datasource.type});\n this.dialogRef.close((datasourceURL ? datasourceURL.url : '') + '/' + datasource.key);\n }\n\n private getSharedDashboards() {\n return this.dashboardService.getDashboards(\n this.searchText.getValue() || '',\n '5',\n '0',\n null\n ).pipe(map((dashboards: any) => {\n return dashboards;\n })\n );\n }\n\n private getProjectDashboards() {\n return this.dashboardService.getDashboards(\n this.searchText.getValue() || '',\n '5',\n '0',\n ''\n ).pipe(map((dashboards: any) => {\n return dashboards;\n })\n );\n }\n\n private getDatasets() {\n return this.datasetService.getDatasets(\n this.searchText.getValue() || '',\n '5',\n '0',\n ''\n ).pipe(map((datasets: any) => {\n return datasets;\n })\n );\n }\n\n private getDataPackages() {\n return this.datasetService.getDatasets(\n this.searchText.getValue() || '',\n '5',\n '0',\n null\n ).pipe(map((datasets: any) => {\n return datasets;\n })\n );\n }\n\n private getDatasources() {\n return this.datasourceService.getDatasources(\n this.searchText.getValue() || '',\n '5',\n '0'\n ).pipe(map((sources: any) => {\n return sources;\n })\n );\n }\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Available Data Items</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div\n class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\"\n class=\"block w-full rounded-none pl-10 border-t-1 border-l-0 border-gray-300\"\n placeholder=\"Search for a dashboard, stored query, or other data item.\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n <table class=\"min-w-full\">\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Project Dashboards</th>\n </tr>\n\n @for (dashboard of projectDashboards; track dashboard) {\n <tr class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dashboard.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n }\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Shared Dashboards</th>\n </tr>\n\n @for (dashboard of sharedDashboards; track dashboard) {\n <tr class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">{{dashboard.title}}</td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n }\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Stored Queries</th>\n </tr>\n\n @for (query of storedQueries; track query) {\n <tr class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{query.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(query)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n }\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n My Data</th>\n </tr>\n\n @for (datasource of datasources; track datasource) {\n <tr class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{datasource.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDatasource(datasource)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n }\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Data Feed</th>\n </tr>\n\n @for (dataPackage of dataPackages; track dataPackage) {\n <tr class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dataPackage.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(dataPackage)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <div></div>\n </div>\n\n</div>\n\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {ProjectService} from '../../services/project.service';\nimport {MatDialog} from '@angular/material/dialog';\nimport {\n ProjectLinkSelectionComponent\n} from '../project-settings/project-link-selection/project-link-selection.component';\nimport * as _ from 'lodash';\nimport {moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop';\nimport {Subscription} from 'rxjs';\nimport {DashboardService} from '../../services/dashboard.service';\n\n\n@Component({\n selector: 'ki-project-settings',\n templateUrl: './project-settings.component.html',\n styleUrls: ['./project-settings.component.sass'],\n standalone: false\n})\nexport class ProjectSettingsComponent implements OnInit {\n\n @Input() dashboardURL: string;\n @Input() queryURL: string;\n @Input() datasourceURLs: any;\n @Input() defaultColours: string[] = [''];\n\n public projectSettings: any = {};\n public categories: any = [];\n public newShortcut: any = {};\n public showNewShortcut = false;\n public shortcuts: any = {};\n public Object = Object;\n public dashboards: any = [];\n public sharedDashboards: any = [];\n\n private activeProject: any;\n private activeProjectSub: Subscription;\n\n constructor(private projectService: ProjectService,\n private dialog: MatDialog,\n private dashboardService: DashboardService) {\n }\n\n async ngOnInit(): Promise<any> {\n this.activeProject = this.projectService.activeProject.getValue();\n\n this.dashboards = await this.dashboardService.getDashboards(\n '', '100', '0'\n ).toPromise();\n\n this.sharedDashboards = await this.dashboardService.getDashboards(\n '', '100', '0', null\n ).toPromise();\n\n this.activeProjectSub = this.projectService.activeProject.subscribe(activeProject => {\n this.activeProject = activeProject;\n\n this.projectSettings = this.activeProject.settings ? (Array.isArray(this.activeProject.settings) ? {\n hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: [], palettes: []\n } : this.activeProject.settings) : {\n hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: [], palettes: []\n };\n\n if (!this.projectSettings.palettes || !this.projectSettings.palettes.length) {\n this.projectSettings.palettes = [{\n name: 'Default Palette',\n colours: this.defaultColours\n }];\n this.saveChanges();\n }\n\n this.getCategories();\n });\n }\n\n public selectOption(c1: any, c2: any) {\n if (!c2) {\n return true;\n }\n return c1.value === c2.value;\n }\n\n public selectLink() {\n const dialogRef = this.dialog.open(ProjectLinkSelectionComponent, {\n width: '1200px',\n height: '800px',\n data: {\n dashboardURL: this.dashboardURL,\n queryURL: this.queryURL,\n datasourceURLs: this.datasourceURLs || []\n }\n });\n\n dialogRef.afterClosed().subscribe(res => {\n this.newShortcut.link = res;\n });\n }\n\n public saveNewShortcut() {\n if (this.newShortcut.newCategory) {\n this.newShortcut.category = this.newShortcut.newCategory;\n }\n\n if (!this.projectSettings.shortcutsMenu || !this.projectSettings.shortcutsMenu.length) {\n this.projectSettings.shortcutsMenu = [];\n }\n\n const existingCategory = _.find(this.projectSettings.shortcutsMenu, {category: this.newShortcut.category});\n if (existingCategory) {\n existingCategory.items.push(this.newShortcut);\n } else {\n this.projectSettings.shortcutsMenu.push({\n category: this.newShortcut.category,\n items: [this.newShortcut]\n });\n }\n\n this.cancelNew();\n this.getCategories();\n }\n\n public cancelNew() {\n this.newShortcut = {};\n this.showNewShortcut = false;\n }\n\n public removeShortcut(menus, index) {\n menus.splice(index, 1);\n this.getCategories();\n }\n\n public removeShortcutItem(items, index) {\n items.splice(index, 1);\n }\n\n public moveCategory(currentIndex, change) {\n const item = this.projectSettings.shortcutsMenu.splice(currentIndex, 1)[0];\n this.projectSettings.shortcutsMenu.splice(currentIndex + change, 0, item);\n }\n\n public drop(event) {\n if (event.previousContainer === event.container) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n }\n }\n\n public importColours(values: string, palette: any) {\n const colours = (values || '').split(',');\n palette.colours = [];\n colours.forEach(colour => {\n palette.colours.push(colour.trim());\n });\n }\n\n public deletePalette(index: number) {\n const message = 'Are you sure you would like to delete this palette?';\n if (window.confirm(message)) {\n this.projectSettings.palettes.splice(index, 1);\n }\n }\n\n public async saveChanges() {\n await this.projectService.updateProjectSettings(this.activeProject.projectKey, this.projectSettings);\n }\n\n private getCategories() {\n if (this.projectSettings.shortcutsMenu) {\n this.categories = this.projectSettings.shortcutsMenu.map(shortcut => {\n return shortcut.category;\n });\n }\n }\n}\n","<div class=\"p-4\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcuts</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Create categorised menu items for quick access to specific pages.\n </p>\n <button type=\"button\" (click)=\"showNewShortcut = true;\"\n class=\"flex items-center rounded-md border border-primary bg-white py-2 px-4 text-sm font-medium text-primary shadow-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\"\n stroke=\"currentColor\" class=\"w-6 h-6\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 6v12m6-6H6\"/>\n </svg>\n Add New Shortcut\n </button>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"shadow sm:overflow-hidden sm:rounded-md\">\n @if (showNewShortcut) {\n <div\n class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div class=\"\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Add New Shortcut</h3>\n <p class=\"mt-0 text-sm text-gray-500\">Provide the category this shortcut belongs to, along\n with title and link.</p>\n </div>\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-4\">\n <label class=\"block text-sm font-medium text-gray-700\">Category</label>\n <select class=\"mb-4 block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\"\n [(ngModel)]=\"newShortcut.category\">\n @for (category of categories; track category) {\n <option [value]=\"category\">{{category}}</option>\n }\n </select>\n <p class=\"mt-2 mb-0 text-sm text-gray-500\">Select category above, or enter a new one\n below.</p>\n <div class=\"mt-1\">\n <input type=\"text\" [(ngModel)]=\"newShortcut.newCategory\"\n placeholder=\"Add new category\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n </div>\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Title</label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.title\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">This will be displayed in the menu.</p>\n </div>\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Icon </label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.icon\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Enter the name of the material icon to use. Full\n list can be found\n <a class=\"text-primary underline\"\n href=\"https://fonts.google.com/icons?icon.style=Filled&icon.set=Material+Icons\"\n target=\"_blank\">here</a>\n </p>\n </div>\n <div class=\"sm:col-span-6\">\n <div class=\"mt-1 \">\n <div class=\"flex items-center\">\n <button type=\"button\" (click)=\"selectLink()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-3 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 \">\n Select Link\n </button>\n <div class=\"ml-4\">{{newShortcut.link}}</div>\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Use Select to search for a dashboard, query or\n other data item to shortcut to.</p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\" (click)=\"cancelNew()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-4 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50\">\n Cancel\n </button>\n <button type=\"button\" (click)=\"saveNewShortcut()\"\n class=\"ml-3 inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Add Shortcut\n </button>\n </div>\n </div>\n </div>\n }\n <div class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div>\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcut Settings</h3>\n <p class=\"mt-0 text-sm text-gray-500\"></p>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <mat-slide-toggle [(ngModel)]=\"projectSettings.hideExisting\">Hide existing menu\n </mat-slide-toggle>\n <p class=\"mt-2 text-sm text-gray-500\">Main menu will be hidden behind an 'Advanced'\n dropdown</p>\n </div>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Menu Positioning</label>\n <mat-radio-group [(ngModel)]=\"projectSettings.shortcutPosition\" class=\"mt-1\">\n <mat-radio-button value=\"before\">Before</mat-radio-button>\n <mat-radio-button value=\"after\" class=\"ml-4\">After</mat-radio-button>\n </mat-radio-group>\n <p class=\"mt-2 text-sm text-gray-500\">Display shortcuts before or after the main\n menu.</p>\n </div>\n </div>\n </div>\n </div>\n <table cdkDropListGroup class=\"min-w-full\">\n @for (shortcut of projectSettings.shortcutsMenu || []; track shortcut; let i = $index) {\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\" [cdkDropListData]=\"shortcut.items\"\n class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th class=\"bg-gray-50 w-1/8\">\n <div class=\"flex items-center\">\n @if (i > 0) {\n <a class=\"text-primary up\" (click)=\"moveCategory(i, -1)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18\"/>\n </svg>\n </a>\n }\n @if (i < (Object.keys(shortcuts).length - 1)) {\n <a class=\"text-primary down\" (click)=\"moveCategory(i, 1)\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3\"/>\n </svg>\n </a>\n }\n </div>\n </th>\n <th colspan=\"2\"\n class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n {{shortcut.category}}\n </th>\n <th class=\"bg-gray-50 px-4 py-2 text-right text-sm font-semibold text-gray-900 sm:px-6\">\n <button mat-icon-button color=\"warn\"\n (click)=\"removeShortcut(projectSettings.shortcutsMenu, i)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </th>\n </tr>\n @for (item of shortcut.items; track item; let j = $index) {\n <tr cdkDrag\n class=\"border-t border-gray-300\">\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <mat-icon cdkDragHandle>drag_handle</mat-icon>\n </div>\n </td>\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{item.title}}\n </td>\n <td class=\"whitespace-nowrap px-3 py-4 text-sm text-gray-500\">\n {{item.link}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <button class=\"mr-8\" mat-icon-button color=\"warn\"\n (click)=\"removeShortcutItem(shortcut.items, j)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </td>\n </tr>\n }\n </tbody>\n }\n </table>\n\n\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Home Dashboard</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Select one of the dashboards in your account to view as your homepage.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <label class=\"mb-2\">\n Select Dashboard\n <select matNativeControl [(ngModel)]=\"projectSettings.homeDashboard\"\n [compareWith]=\"selectOption\">\n <option value=\"\">No Home Dashboard</option>\n <optgroup label=\"Dashboards\">\n @for (dashboard of dashboards; track dashboard) {\n <option\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n }\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n @for (dashboard of sharedDashboards; track dashboard) {\n <option\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n }\n </optgroup>\n </select>\n <small class=\"font-normal\">Select the dashboard to view on your homepage.</small>\n </label>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Project Colour Palette</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n A selection of colours to use as default colours around the project in charts etc.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <mat-accordion displayMode=\"flat\">\n @for (palette of projectSettings.palettes; track palette; let i = $index) {\n <mat-expansion-panel class=\"shadow-none border-b\" [expanded]=\"palette._opened\"\n (closed)=\"palette._opened = false;\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{palette.name}}\n </mat-panel-title>\n <mat-panel-description>\n <div class=\"flex items-center\">\n @for (colour of palette.colours; track colour) {\n <div\n class=\"h-4 w-4\" [style]=\"{'background-color': colour}\"></div>\n }\n </div>\n </mat-panel-description>\n </mat-expansion-panel-header>\n <label class=\"mb-2\">\n Palette Name\n <input type=\"text\" placeholder=\"Enter palette name\"\n [(ngModel)]=\"palette.name\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </label>\n <label class=\"mb-2\">\n Import Colour Palette\n <input type=\"text\" #colourPalette placeholder=\"Enter each hex colour comma seperated\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n <button type=\"button\" (click)=\"importColours(colourPalette.value, palette)\"\n class=\"mt-2 inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">upload</mat-icon>\n Import Colours\n </button>\n </label>\n <label class=\"mb-2\">\n Select Palette Colours\n @for (colour of palette.colours; track colour; let i = $index) {\n <div class=\"my-2 flex items-center justify-between\">\n <input type=\"color\" [(ngModel)]=\"palette.colours[i]\">\n <button mat-icon-button color=\"warn\" (click)=\"palette.colours.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n }\n </label>\n <div class=\"flex items-center justify-between\">\n <button type=\"button\" (click)=\"deletePalette(i)\"\n class=\"inline-flex justify-center rounded-md border border-danger bg-white py-2 px-4 text-sm font-medium text-danger shadow-sm \">\n Delete Palette\n </button>\n <button type=\"button\" (click)=\"palette.colours.push('')\"\n class=\"inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Colour\n </button>\n </div>\n </mat-expansion-panel>\n }\n </mat-accordion>\n\n <button type=\"button\" (click)=\"projectSettings.palettes.push({name: '', colours: [''], _opened: true})\"\n class=\"mt-4 inline-flex items-center justify-center rounded-md border border-secondary bg-white py-1.5 px-4 text-sm font-medium text-secondary shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Palette\n </button>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport * as lodash from 'lodash';\nimport {DatasourceService} from '../../../../services/datasource.service';\nconst _ = lodash.default;\nimport '@revolist/revogrid';\n\n@Component({\n selector: 'ki-tabular-datasource',\n templateUrl: './tabular-datasource.component.html',\n styleUrls: ['./tabular-datasource.component.sass'],\n standalone: false\n})\nexport class TabularDatasourceComponent {\n\n public datasourceInstanceKey: string;\n public selectedItem: any = {};\n public autoIncrementColumn = false;\n public datasourceUpdate: any = {\n title: '',\n instanceImportKey: '',\n fields: [],\n adds: [],\n updates: [],\n deletes: []\n };\n public limit = 25;\n public page = 1;\n public endOfResults = false;\n public _ = _;\n public readonly datasourceTypes: any = [\n 'string', 'integer', 'float', 'date', 'datetime', 'mediumstring', 'longstring'\n ];\n public rows: any = [];\n public columns: any = [\n {\n name: 'Column 1',\n prop: 'column_1',\n type: 'string'\n },\n {\n name: 'Column 2',\n prop: 'column_2',\n type: 'string'\n }\n ];\n\n private offset = 0;\n\n constructor(private datasourceService: DatasourceService) {\n this.rows = [{\n column_1: 'hello',\n column_2: 'world'\n }, {\n column_1: 'hello',\n column_2: 'world'\n }];\n }\n\n public pageSizeChange(value) {\n this.limit = value;\n this.loadDatasource();\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.loadDatasource();\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.loadDatasource();\n }\n\n public deleteSelectedColumn() {\n\n }\n\n public addRow() {\n\n }\n\n public addColumn() {\n\n }\n\n public updateColumnName() {\n\n }\n\n public resetTable() {\n const message = 'Are you sure you would like to reset the entire table? This will remove all data and columns. This action cannot be undone.';\n if (window.confirm(message)) {\n this.rows = [];\n this.columns = [\n {\n title: 'Column 1',\n name: 'column_1',\n type: 'string'\n },\n {\n title: 'Column 2',\n name: 'column_2',\n type: 'string'\n }\n ];\n }\n }\n\n public updateAutoIncrementColumn(value) {\n if (value) {\n this.columns.map(column => {\n column.keyField = false;\n return column;\n });\n\n this.columns.unshift({\n title: 'ID',\n name: 'id',\n type: 'id'\n });\n } else {\n _.remove(this.columns, {type: 'id'});\n }\n }\n\n public import() {\n\n }\n\n public save(exit = false) {\n\n }\n\n public apiAccess() {\n\n }\n\n private loadDatasource() {\n if (this.datasourceInstanceKey) {\n const evaluatedDatasource = {\n key: this.datasourceInstanceKey,\n transformationInstances: [],\n parameterValues: {},\n offset: this.offset,\n limit: this.limit\n };\n this.datasourceService.evaluateDatasource(evaluatedDatasource).then((res: any) => {\n this.columns = res.columns.map(column => {\n column.previousName = column.name;\n return column;\n });\n this.rows = res.allData;\n\n this.endOfResults = this.rows.length < this.limit;\n\n this.datasourceUpdate.title = res.instanceTitle;\n this.datasourceUpdate.instanceImportKey = res.instanceImportKey;\n\n this.autoIncrementColumn = _.some(this.columns, {type: 'id'});\n });\n }\n }\n}\n","<div class=\"border-b w-full flex items-center justify-between \">\n <div class=\"leading-5 px-4 text-xs uppercase tracking-wider font-medium border-r-2 text-gray-600\">\n Operations\n </div>\n <div class=\"flex items-center flex-wrap w-full justify-end bg-white\">\n <button (click)=\"apiAccess()\" [disabled]=\"!datasourceInstanceKey\"\n class=\"disabled:opacity-50 w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">api</mat-icon>\n api access\n </button>\n <button (click)=\"import()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">upload_file</mat-icon>\n upload\n </button>\n <button (click)=\"save()\"\n class=\"w-20 flex flex-col items-center justify-center py-1 px-2 text-xs text-gray-600 cursor-pointer hover:bg-gray-100\">\n <mat-icon class=\"text-xl\">save</mat-icon>\n save\n </button>\n </div>\n</div>\n<div class=\"flex create-datasource-container\">\n <div class=\"flex-1 relative overflow-y-scroll table-scroll\">\n\n <div class=\"create-datasource\">\n <div id=\"tableWrapper\" class=\"flex-1 overflow-y-scroll relative\">\n <revo-grid [columns]=\"columns\" [source]=\"rows\" theme=\"material\"/>\n </div>\n\n <div class=\"border-t bg-gray-50 py-2 flex align-center justify-between\">\n <button (click)=\"addRow()\">\n <mat-icon>add_circle</mat-icon>\n </button>\n <div class=\"flex items-center\">\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-2\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\" [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"border-l border-r bg-gray-50 -ml-2.5\">\n <button mat-icon-button color=\"primary\" (click)=\"addColumn()\"\n class=\"-mt-0.5\">\n <mat-icon>add_circle</mat-icon>\n </button>\n </div>\n\n <div class=\"bg-gray-100 w-72 h-full p-3 flex justify-between flex-col\">\n <div>\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Settings\n </div>\n <label class=\"mb-4\">\n Datasource Name\n <input type=\"text\" class=\"w-full\" placeholder=\"Enter datasource name\"\n [class]=\"{'border border-red-500': !datasourceUpdate.title}\"\n [(ngModel)]=\"datasourceUpdate.title\">\n @if (!datasourceUpdate.title) {\n <div class=\"text-xs text-red-500\">\n Please enter a name for this datasource\n </div>\n }\n </label>\n\n <mat-checkbox class=\"mb-4\" [checked]=\"_.find(columns, {type: 'id'})\"\n (change)=\"updateAutoIncrementColumn($event.checked)\">\n Add ID Column\n </mat-checkbox>\n\n <div>\n <button mat-button class=\"text-red-500\" (click)=\"resetTable()\">\n Reset Table\n </button>\n </div>\n\n <hr class=\"my-4\">\n\n @if (selectedItem && selectedItem._tableType) {\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Column\n </div>\n <label class=\"mb-4\">\n Column Title\n <input type=\"text\" [(ngModel)]=\"selectedItem.title\" placeholder=\"Enter column title\"\n (change)=\"updateColumnName()\">\n </label>\n @if (selectedItem.type === 'id') {\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" disabled>\n <option [value]=\"'id'\">ID</option>\n </select>\n </label>\n <mat-checkbox class=\"mb-4\" [checked]=\"true\" disabled>\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n }\n @if (selectedItem.type !== 'id') {\n <label class=\"mb-4\">\n Column Type\n <select [(ngModel)]=\"selectedItem.type\" class=\"capitalize\">\n <option [value]=\"null\">-- Select column type --</option>\n @for (type of datasourceTypes; track type) {\n <option [value]=\"type\">\n {{type}}\n </option>\n }\n </select>\n </label>\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"selectedItem.keyField\"\n [disabled]=\"_.find(columns, {type:'id'})\">\n {{_.filter(columns, 'keyField').length > 1 ? 'Part of Unique Identifier' : 'Unique Identifier'}}\n </mat-checkbox>\n }\n <div>\n <button mat-button color=\"warn\" (click)=\"deleteSelectedColumn()\">Delete Column</button>\n </div>\n <hr class=\"my-4\">\n }\n\n\n <table class=\"datasource-table w-full\">\n <tbody>\n <tr class=\"bg-indigo-100\">\n <td class=\"pl-2\">Updated</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.updates.length || ''}}</td>\n </tr>\n <tr class=\"bg-gray-200 opacity-30\">\n <td class=\"pl-2\">Deleted</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.deletes.length || ''}}</td>\n </tr>\n <tr class=\"bg-green-50\">\n <td class=\"pl-2\">Added</td>\n <td class=\"pl-2 text-right\">{{datasourceUpdate.adds.length || ''}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <button mat-flat-button color=\"primary\" (click)=\"save(true)\">\n Save & Exit\n </button>\n </div>\n</div>\n\n\n","import {Component, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, of, Subject} from 'rxjs';\nimport {debounceTime, switchMap} from 'rxjs/operators';\n\n@Component({\n selector: 'ki-marketplace',\n templateUrl: './marketplace.component.html',\n styleUrls: ['./marketplace.component.sass'],\n standalone: false\n})\nexport class MarketplaceComponent implements OnInit {\n\n public datasets: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n\n private reload = new Subject();\n\n constructor() {\n }\n\n ngOnInit() {\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe((datasets: any) => {\n this.endOfResults = datasets.length < this.limit;\n this.datasets = datasets;\n this.loading = false;\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public getDatasets() {\n return of([\n {title: 'Scam Abuse Feed 2024', description: 'Scam feed detailing all the abuse reported in 2024.', account: 'Abuse Metric House', price: '849.00', icon: '/assets/logoipsum-248.svg'},\n {title: 'Phishing Feed Latest', description: 'The latest phishing feed from Phishing \"R\" Us.', account: 'Phishing \"R\" Us', requiresValidation: true, icon: '/assets/logoipsum-247.svg'},\n {title: 'Daily Malware Updates', description: 'All malware reported to The Malware Police on a daily basis.', account: 'The Malware Police', icon: '/assets/logoipsum-245.svg'},\n {title: 'Passive DNS Feed', description: 'A live feed of all passive DNS entries obtained by the Internet Defenders.', account: 'Internet Defenders', icon: '/assets/logoipsum-299.svg'},\n ]);\n }\n\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Marketplace</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the data feeds that have been made available by DAP users.\n </p>\n </div>\n </div>\n\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search available data feeds\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n @if (datasets.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Data Feed\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Supplier\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Price\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n @for (item of datasets; track item) {\n <tbody class=\"hover:bg-gray-50\">\n <tr class=\"cursor-pointer hover:bg-gray-50\">\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">\n <div class=\"flex items-center\">\n <div class=\"h-10 w-10 flex-shrink-0\">\n <img class=\"h-10 w-10 rounded-full\" [src]=\"item.icon\" alt=\"\">\n </div>\n <div class=\"ml-4\">\n <div class=\"font-medium text-gray-900\">{{item.title}}</div>\n <div class=\"text-gray-400 font-thin \">{{item.description}}</div>\n </div>\n </div>\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n {{ item.account }}\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n @if (item.price) {\n <span>${{ item.price }}</span>\n }\n @if (!item.price) {\n <span>free</span>\n }\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 text-center px-4 py-2 text-sm text-gray-500\">\n @if (item.requiresValidation) {\n <span class=\"material-icons text-secondary\"\n title=\"Additional account confirmation/verification required to access this data feed.\"\n >verified</span>\n }\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 text-right px-4 py-2 text-sm text-gray-500\">\n @if (item.price) {\n <button mat-button color=\"primary\">\n Purchase Data Feed\n </button>\n }\n @if (item.requiresValidation) {\n <button mat-button color=\"primary\">\n Request Access\n </button>\n }\n @if (!item.requiresValidation && !item.price) {\n <button mat-button color=\"primary\">\n Add To My Account\n </button>\n }\n </td>\n </tr>\n </tbody>\n }\n <tbody>\n <tr>\n <td colspan=\"5\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{ offset + 1 }} - {{ (page * limit) - (limit - datasets.length) }}\n </div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n }\n </table>\n </div>\n </div>\n </div>\n</div>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {\n MAT_DIALOG_DATA,\n MatDialog,\n MatDialogRef\n} from '@angular/material/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport {MatSnackBar} from '@angular/material/snack-bar';\n\n@Component({\n selector: 'ki-feed-api-modal',\n templateUrl: './feed-api-modal.component.html',\n styleUrls: ['./feed-api-modal.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class FeedApiModalComponent implements OnInit {\n\n public feed: any;\n public apiKeys: any;\n public feedUrl: string;\n\n constructor(public dialogRef: MatDialogRef<FeedApiModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private dialog: MatDialog,\n private http: HttpClient,\n private snackBar: MatSnackBar) {\n }\n\n async ngOnInit() {\n this.feed = this.data.feed;\n this.feedUrl = this.data.feedUrl;\n\n this.apiKeys = await this.http.get('/account/apikey/first/feedaccess').toPromise();\n }\n\n public async copy(text: string) {\n await navigator.clipboard.writeText(text.trim());\n this.copied();\n }\n\n public copied() {\n this.snackBar.open('Copied to Clipboard', null, {\n duration: 2000,\n verticalPosition: 'top',\n panelClass: 'bg-white'\n });\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-50\" cdkDragHandle>\n <h2 mat-dialog-title>\n Signal API Access\n </h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">cURL</div>\n <div class=\"text-sm mb-2\">\n This is the recommended approach for consuming the API.\n </div>\n <div #createCurl class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\">\n curl -H <span class=\"text-emerald-400\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span class=\"text-emerald-400\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\">\n -X <b>GET</b> <span class=\"text-emerald-400\">{{feedUrl}}{{feed.path}}@for (param of feed.exposedParameterNames; track param; let i = $index) {\n {{i === 0 ? '?' : '&'}}{{param}}=<b>[[VALUE]]</b>\n }</span></pre>\n\n </div>\n <button mat-icon-button (click)=\"copy(createCurl.textContent)\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">HTTPS</div>\n <div class=\"text-sm mb-2\">\n We recommend only using this for testing the API endpoint.\n </div>\n <div #createHttps class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\"><pre class=\"whitespace-normal\">{{feedUrl}}{{feed.path}}<span class=\"text-emerald-400\">?apiKey=<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>&apiSecret=<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b></span>@for (param of feed.exposedParameterNames; track param) {\n <span class=\"text-emerald-400\">&{{param}}=<b>[[VALUE]]</b></span>\n }</pre></div>\n\n <button mat-icon-button (click)=\"copy(createHttps.textContent)\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"text-sm my-4\">\n <div class=\"mb-4 font-medium text-base\">\n Example request parameters\n </div>\n\n <div class=\"mb-4\">\n Filtering of the returned data can be effected by supplying parameters of the format <b>filter_COLUMNNAME</b>. The parameter value can either be\n simply a value for exact match filtering or a value followed by a | and a match type which should be one of the following values:\n </div>\n <table>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n </tr>\n <tr>\n <td>null</td>\n <td>for a null match</td>\n </tr>\n <tr>\n <td>notnull</td>\n <td>for a not null match</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>or a string contains match</td>\n </tr>\n </table>\n <br><br>\n Results can be sorted by supplying a <b>sort</b> parameter which identifies columns to sort and directions (either asc or desc) using pipe separation\n <br><br>\n By default the first 100 rows will be returned. Paging can be achieved by supplying\n <b>limit</b> and <b>offset</b> parameters.\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n </div>\n\n</div>\n\n\n","import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';\nimport {BehaviorSubject, merge, Observable, of, Subject} from 'rxjs';\nimport {debounceTime, switchMap} from 'rxjs/operators';\nimport {DatasetService} from '../../services/dataset.service';\nimport {DataExplorerComponent} from '../data-explorer/data-explorer.component';\nimport {MatDialog} from '@angular/material/dialog';\nimport {Router} from '@angular/router';\nimport shortHash from 'short-hash';\nimport * as lodash from 'lodash';\nimport {FeedService} from '../../services/feed.service';\nimport {\n FeedApiModalComponent\n} from '../shared-with-me/feed-api-modal/feed-api-modal.component';\n\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-shared-with-me',\n templateUrl: './shared-with-me.component.html',\n styleUrls: ['./shared-with-me.component.sass'],\n standalone: false\n})\nexport class SharedWithMeComponent implements OnInit {\n\n @Input() headingDescription: string;\n @Input() backendUrl: string;\n @Input() url: string;\n @Input() tableHeading: string;\n @Input() headingLabel: string;\n @Input() hideHeading = false;\n @Input() datasetEditorReadonly = false;\n @Input() nameReplaceString: string;\n @Input() feedUrl: string;\n @Input() apiDocsUrl: string = '';\n\n @Output() loaded = new EventEmitter();\n\n public datasets: any = [];\n public searchText = new BehaviorSubject('');\n public limit = 10;\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n\n private reload = new Subject();\n\n constructor(private datasetService: DatasetService,\n private dialog: MatDialog,\n private router: Router,\n private feedService: FeedService) {\n }\n\n ngOnInit() {\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getDatasets()\n )\n ).subscribe((datasets: any) => {\n this.endOfResults = datasets.length < this.limit;\n this.datasets = datasets;\n this.loading = false;\n this.loaded.next(this.datasets);\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public async apiAccess(dataset: any) {\n dataset._loadingAPI = true;\n const hash = shortHash(String(dataset.id));\n const feeds: any = await this.feedService.listFeeds(hash, '1', '0').toPromise();\n let feedId = null;\n if (!feeds.length) {\n const feedData = {\n exporterConfiguration: {includeHeaderRow: true, separator: ','},\n cacheTimeSeconds: 0,\n path: hash,\n datasetInstanceId: dataset.id,\n datasetLabel: dataset,\n exporterKey: 'json',\n advancedQuerying: true,\n adhocFiltering: true\n };\n\n feedId = await this.feedService.saveFeed(feedData);\n } else {\n feedId = feeds[0].id;\n }\n\n const feed = await this.feedService.getFeed(feedId);\n dataset._loadingAPI = false;\n\n if (this.apiDocsUrl) {\n window.location.href = this.apiDocsUrl + \"?sharedDatasetId=\" + dataset.id;\n } else {\n const dialog = this.dialog.open(FeedApiModalComponent, {\n width: '700px',\n height: '650px',\n data: {\n feed,\n feedUrl: this.feedUrl\n }\n });\n }\n }\n\n public getDatasets() {\n const searchString = this.nameReplaceString + this.searchText.getValue();\n return this.datasetService.getAccountSharedDatasets(searchString, this.limit, this.offset).toPromise();\n }\n\n // Create extended dataset from source id.\n public extend(id) {\n this.datasetService.getExtendedDataset(id).then(datasetInstanceSummary => {\n this.viewDataset(datasetInstanceSummary);\n });\n }\n\n // View dataset\n private viewDataset(datasetInstanceSummary) {\n this.router.navigate([this.url || '/dataset'], {fragment: _.kebabCase(datasetInstanceSummary.title)});\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n closeOnNavigation: true,\n data: {\n datasetInstanceSummary,\n backendUrl: this.backendUrl,\n showChart: false,\n admin: false,\n breadcrumb: this.headingLabel || 'Datasets',\n url: this.url,\n datasetEditorReadonly: this.datasetEditorReadonly\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n if (res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n }\n this.router.navigate([this.url || '/dataset'], {fragment: null});\n this.reload.next(Date.now());\n }\n });\n }\n\n\n}\n","@if (!hideHeading) {\n <div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Shared With Me</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the datasets that are currently shared with your account.\n </p>\n </div>\n </div>\n </div>\n </div>\n}\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"text-sm block w-full rounded-none pl-10 border-t-0 border-l-0 border-r-0 border-gray-300\"\n placeholder=\"Search data feeds shared with me\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n\n\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"uppercase tracking-widest sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Data Feed\n </th>\n <th scope=\"col\"\n class=\"uppercase tracking-widest sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Shared by\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n @if (!datasets.length) {\n <tr>\n <td colspan=\"4\" class=\"px-4 py-2\">No datasets found</td>\n </tr>\n }\n @if (datasets.length) {\n @for (item of datasets; track item) {\n <tbody class=\"hover:bg-gray-50\">\n <tr class=\"hover:bg-gray-50 cursor-pointer\">\n <td (click)=\"extend(item.id)\" class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">\n {{ (item.title || '').replace((nameReplaceString || ''), '') }}\n </td>\n <td (click)=\"extend(item.id)\" class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n {{ item.owningAccountName }}\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 text-right px-4 py-2 text-sm text-gray-500\">\n <div class=\"flex items-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"apiAccess(item)\" [disabled]=\"item._loadingAPI\">\n @if (!item._loadingAPI) {\n <span>API</span>\n }\n @if (item._loadingAPI) {\n <span class=\"flex items-center\">\n <svg class=\"animate-spin -ml-1 mr-2 h-4 w-4 text-gray-400\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n Loading API\n </span>\n }\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"primary\" (click)=\"extend(item.id)\">\n View\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n }\n }\n <tbody>\n <tr>\n <td colspan=\"4\"\n class=\"bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{ offset + 1 }} - {{ (page * limit) - (limit - datasets.length) }}\n </div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n\n </table>\n </div>\n </div>\n </div>\n</div>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {BehaviorSubject, merge, Subject} from 'rxjs';\nimport {debounceTime, map, switchMap} from 'rxjs/operators';\nimport {DataProcessorService, } from '../../services/data-processor.service';\nimport * as lodash from 'lodash';\nimport {Router} from '@angular/router';\nimport {DatasetService} from '../../services/dataset.service';\nimport {MatDialog} from '@angular/material/dialog';\nimport {\n EditQueryCacheComponent\n} from '../query-caching/edit-query-cache/edit-query-cache.component';\nconst _ = lodash.default;\n\n@Component({\n selector: 'ki-query-caching',\n templateUrl: './query-caching.component.html',\n styleUrls: ['./query-caching.component.sass'],\n standalone: false\n})\nexport class QueryCachingComponent implements OnInit {\n\n @Input() admin: boolean;\n @Input() reload = new Subject();\n @Input() showPager = true;\n @Input() limit = 10;\n @Input() datasetInstance: number;\n\n public queries: any = [];\n public searchText = new BehaviorSubject('');\n\n public offset = 0;\n public page = 1;\n public endOfResults = false;\n public loading = true;\n public _ = _;\n\n\n\n constructor(private dataProcessorService: DataProcessorService,\n private router: Router,\n private datasetService: DatasetService,\n private dialog: MatDialog) {\n }\n\n ngOnInit() {\n\n merge(this.searchText, this.reload)\n .pipe(\n debounceTime(300),\n // distinctUntilChanged(),\n switchMap(() =>\n this.getQueries()\n )\n ).subscribe((queries: any) => {\n this.endOfResults = queries.length < this.limit;\n this.queries = queries;\n this.loading = false;\n });\n\n this.searchText.subscribe(() => {\n this.page = 1;\n this.offset = 0;\n });\n }\n\n public increaseOffset() {\n this.page = this.page + 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public decreaseOffset() {\n this.page = this.page <= 1 ? 1 : this.page - 1;\n this.offset = (this.limit * this.page) - this.limit;\n this.reload.next(Date.now());\n }\n\n public pageSizeChange(value) {\n this.page = 1;\n this.offset = 0;\n this.limit = value;\n this.reload.next(Date.now());\n }\n\n public view(datasourceKey) {\n const datasetInstanceSummary = {\n datasetInstanceId: null,\n datasourceInstanceKey: datasourceKey,\n transformationInstances: [],\n parameterValues: {},\n parameters: []\n };\n this.openDialogEditor(datasetInstanceSummary);\n }\n\n public viewParent(parentDatasetInstanceId) {\n this.datasetService.getDataset(parentDatasetInstanceId).then(datasetInstanceSummary => {\n this.openDialogEditor(datasetInstanceSummary);\n });\n }\n\n public delete(cacheKey) {\n const message = 'Are you sure you would like to remove this Query Cache?';\n if (window.confirm(message)) {\n this.dataProcessorService.removeProcessor(cacheKey).then(() => {\n this.reload.next(Date.now());\n });\n }\n }\n\n public async editCache(cacheKey: string) {\n const cache: any = await this.dataProcessorService.getProcessor(cacheKey);\n\n const dataset = await this.datasetService.getDataset(cache.config.sourceQueryId);\n const data: any = await this.datasetService.evaluateDataset(dataset);\n const columns = data.columns;\n\n const dialogRef = this.dialog.open(EditQueryCacheComponent, {\n width: '900px',\n height: '900px',\n data: {\n cache,\n datasetInstanceId: cache.config.sourceQueryId,\n columns\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res) {\n this.reload.next(Date.now());\n }\n });\n }\n\n private async openDialogEditor(datasetInstanceSummary) {\n const { DataExplorerComponent } = await import('../data-explorer/data-explorer.component');\n\n this.router.navigate(['/snapshots'], {fragment: _.kebabCase(datasetInstanceSummary.title || datasetInstanceSummary.datasourceInstanceKey)});\n const dialogRef = this.dialog.open(DataExplorerComponent, {\n width: '100vw',\n height: '100vh',\n maxWidth: '100vw',\n maxHeight: '100vh',\n hasBackdrop: false,\n data: {\n datasetInstanceSummary,\n showChart: false,\n admin: this.admin,\n breadcrumb: 'Snapshots'\n }\n });\n dialogRef.afterClosed().subscribe(res => {\n if (res && res.breadcrumb) {\n return this.router.navigate([res.breadcrumb], {fragment: null});\n } else {\n this.router.navigate(['/query-caching'], {fragment: null});\n }\n this.reload.next(Date.now());\n });\n }\n\n private getQueries() {\n if (this.datasetInstance) {\n return this.dataProcessorService.filterProcessorsByRelatedItem(\n 'querycaching',\n 'DatasetInstance',\n this.datasetInstance,\n false\n ).pipe(map((queries: any) => {\n return queries;\n })\n );\n } else {\n return this.dataProcessorService.filterProcessorsByType(\n 'querycaching',\n this.searchText.getValue() || '',\n this.limit.toString(),\n this.offset.toString()\n ).pipe(map((queries: any) => {\n return queries;\n })\n );\n }\n\n }\n\n}\n","<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search caching queries\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate bg-white\" style=\"border-spacing: 0\">\n @if (queries.length) {\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Cache\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Cache Expiry\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n @for (query of queries; track query) {\n <tbody class=\"hover:bg-gray-50\">\n <tr class=\"hover:bg-gray-50\">\n <td class=\"boder-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm font-medium text-gray-900\">\n {{query.title}}\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n @if (query.config.cacheExpiryDays) {\n <span class=\"mr-2\"><b>{{query.config.cacheExpiryDays}}</b> Day(s)</span>\n }\n @if (query.config.cacheExpiryHours) {\n <span><b>{{query.config.cacheExpiryHours}}</b> Hour(s)</span>\n }\n </td>\n <td class=\"border-b whitespace-nowrap border-gray-200 px-4 py-2 text-sm text-gray-500\">\n <div class=\"flex items-center justify-end\">\n <button mat-button color=\"primary\"\n [disabled]=\"query.taskStatus === 'PENDING'\"\n (click)=\"view(query.key + '_cache')\">\n View Cache\n </button>\n <button mat-button color=\"primary\"\n [disabled]=\"query.taskStatus === 'PENDING'\"\n (click)=\"view(query.key + '_caching')\">\n Query Latest\n </button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editCache(query.key)\">\n Edit Cache\n </button>\n <button mat-menu-item (click)=\"viewParent(query.config.sourceQueryId)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(query.key)\">\n Delete Cache\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n </tbody>\n }\n <tbody>\n @if (showPager) {\n <tr>\n <td colspan=\"5\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}} - {{(page * limit) - (limit - queries.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n }\n </tbody>\n }\n </table>\n </div>\n </div>\n </div>\n</div>\n","import {Component, OnInit} from '@angular/core';\nimport {DatasetService} from '../../services/dataset.service';\nimport {ActivatedRoute} from '@angular/router';\nimport {AuthenticationService} from 'ng-kiniauth';\n\n@Component({\n selector: 'ki-data-sharing-invite',\n templateUrl: './data-sharing-invite.component.html',\n styleUrls: ['./data-sharing-invite.component.sass'],\n standalone: false\n})\nexport class DataSharingInviteComponent implements OnInit {\n\n public inviteAccepted = false;\n public inviteCancelled = false;\n public invitationError = false;\n public invitationCode: string;\n public details: any = {};\n\n constructor(private datasetService: DatasetService,\n private route: ActivatedRoute,\n private authService: AuthenticationService, ) {\n\n }\n\n async ngOnInit() {\n await this.authService.getSessionData();\n\n this.invitationCode = this.route.snapshot.queryParams.invitationCode;\n\n try {\n this.details = await this.datasetService.getSharableItemForInvitation(this.invitationCode);\n } catch (e) {\n this.invitationError = true;\n }\n }\n\n\n public async acceptInvitation() {\n try {\n await this.datasetService.acceptSharingInvitation(this.invitationCode);\n this.inviteAccepted = true;\n } catch (e){\n this.invitationError = true;\n }\n }\n\n public async cancelInvitation() {\n try {\n await this.datasetService.cancelSharingInvitation(this.invitationCode);\n this.inviteCancelled = true;\n } catch (e){\n this.invitationError = true;\n }\n }\n\n}\n","<div class=\"actionpanel sixtyforty mx1 mb2 mx-4 mb-8\">\n\n <div class=\"actioninfo p2w p1m\">\n @if (!inviteAccepted && !inviteCancelled && !invitationError) {\n <h4 class=\"mb1 mt0 flex align-center\">\n <b>Data sharing request</b>\n </h4>\n <div class=\"mb1\">\n <p class=\"mb-4\"><b>{{details.sharerName}}</b> has invited you to share the dataset <b>{{details.itemLabel}}</b></p>\n <p class=\"mt-4\">To accept this invitation please click on the 'Accept Invitation' button. Or you can cancel this invitation by\n <a class=\"text-secondary hover:underline cursor-pointer\" (click)=\"cancelInvitation()\">clicking this link</a></p>\n </div>\n }\n\n @if (inviteAccepted) {\n <div class=\"my-8 flex items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"text-green-500 h-24 w-24 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div class=\"text-lg\">Invitation Accepted. You now have access to the <b>{{details.itemLabel}}</b> dataset.</div>\n </div>\n }\n\n @if (inviteCancelled) {\n <div class=\"my-8 flex items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"text-red-500 h-24 w-24 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n </svg>\n <div class=\"text-lg\">Invitation Cancelled. You will need to contact <b>{{details.sharerName}}</b> if you wish to share the <b>{{details.itemLabel}}</b> dataset in the future.</div>\n </div>\n }\n\n @if (invitationError) {\n <div class=\"my-8 flex items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"text-yellow-500 h-24 w-24 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n <div class=\"text-lg\">There was a problem with the invitation code supplied. It is likely that the\n invitation code has expired. Please check with the account holder who has invited you to share this data.</div>\n </div>\n }\n\n </div>\n <div class=\"actions flex flex-col align-center justify-center p1\">\n @if (!inviteAccepted && !inviteCancelled && !invitationError) {\n <button class=\"button small-button white-button disabled:opacity-50\" (click)=\"acceptInvitation()\">\n Accept Invitation\n </button>\n }\n </div>\n\n </div>\n","import { Component } from '@angular/core';\nimport {ExportProjectComponent as KAExportProjectComponent} from 'ng-kiniauth';\n\n\n@Component({\n selector: 'ki-export-project',\n templateUrl: './export-project.component.html',\n styleUrls: ['./export-project.component.sass'],\n standalone: false\n})\nexport class ExportProjectComponent extends KAExportProjectComponent{\n public alertGroupIds = {};\n public alertGroupUpdateindicators = {};\n\n\n export(exportConfig: any = {}) {\n\n exportConfig.includedAlertGroupIdUpdateIndicators = {};\n\n Object.keys(this.alertGroupIds).forEach(groupId => {\n if (this.alertGroupIds[groupId]){\n exportConfig.includedAlertGroupIdUpdateIndicators[groupId] = this.alertGroupUpdateindicators[groupId] || false;\n }\n });\n\n\n // Perform parent export\n super.export(exportConfig);\n }\n}\n","<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900 mb-0\">Export Project</h1>\n <p class=\"text-sm font-medium text-gray-500\">\n Export the current project as a downloadable file for import into other projects\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\">\n <button type=\"button\" (click)=\"export()\"\n class=\"disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-primary focus:outline-none\">\n Export Project\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"bg-white border-b border-gray-200\">\n @if (exportableResources) {\n @if (exportableResources.datasources && exportableResources.datasources.length) {\n <div class=\"\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b uppercase text-xs tracking-widest font-medium\">\n My Data\n </div>\n @for (datasource of exportableResources.datasources; track datasource) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'datasource-' + datasource.identifier\"\n [(ngModel)]=\"exportConfig.datasources[datasource.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"datasource.title\">{{ datasource.title }}</label>\n </div>\n @if (exportConfig.datasources[datasource.identifier].included) {\n <div class=\"flex items-center h-5 w-12\"\n >\n <input type=\"checkbox\"\n [name]=\"'datasource-update-' + datasource.identifier\"\n [(ngModel)]=\"exportConfig.datasources[datasource.identifier].includeData\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n }\n @if (exportConfig.datasources[datasource.identifier].included) {\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-500\">Include data in export</label>\n </div>\n }\n </div>\n }\n </div>\n }\n @if (exportableResources.datasets && exportableResources.datasets.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Stored Queries\n </div>\n @for (dataset of exportableResources.datasets; track dataset) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'dataset-' + dataset.identifier\"\n [(ngModel)]=\"exportConfig.datasets[dataset.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"dataset.title\">{{ dataset.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.dashboards && exportableResources.dashboards.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Dashboards\n </div>\n @for (dashboard of exportableResources.dashboards; track dashboard) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'dashboard-' + dashboard.identifier\"\n [(ngModel)]=\"exportConfig.dashboards[dashboard.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"dashboard.title\">{{ dashboard.title }}</label>\n </div>\n @if (exportConfig.dashboards[dashboard.identifier].included) {\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'dashboard-include-alerts-' + dashboard.identifier\"\n [(ngModel)]=\"exportConfig.dashboards[dashboard.identifier].includeAlerts\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n }\n @if (exportConfig.dashboards[dashboard.identifier].included) {\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-500\">Include Alerts</label>\n </div>\n }\n @if (exportConfig.dashboards[dashboard.identifier].included && exportConfig.dashboards[dashboard.identifier].includeAlerts) {\n <div class=\"flex items-center h-5 w-12\"\n >\n <input type=\"checkbox\"\n [name]=\"'dashboard-include-alerts-' + dashboard.identifier\"\n [(ngModel)]=\"exportConfig.dashboards[dashboard.identifier].updateAlertTemplates\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n }\n @if (exportConfig.dashboards[dashboard.identifier].included && exportConfig.dashboards[dashboard.identifier].includeAlerts) {\n <div class=\"ml-3 text-sm w-48\"\n >\n <label class=\"font-medium text-gray-500\">Update Alert Templates</label>\n </div>\n }\n </div>\n }\n </div>\n }\n @if (exportableResources.feeds && exportableResources.feeds.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Feeds\n </div>\n @for (feed of exportableResources.feeds; track feed) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'feed-' + feed.identifier\"\n [(ngModel)]=\"exportConfig.feeds[feed.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"feed.title\">/{{ feed.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.dataProcessors && _.filter(exportableResources.dataProcessors, {'category': 'snapshot'}).length > 0) {\n <div class=\"mt-6\"\n >\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Snapshots\n </div>\n @for (dataProcessor of _.filter(exportableResources.dataProcessors, {'category': 'snapshot'}); track dataProcessor) {\n <div class=\"my-3 mx-2 flex items-start\"\n >\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'dataProcessor-' + dataProcessor.identifier\"\n [(ngModel)]=\"exportConfig.dataProcessors[dataProcessor.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"dataProcessor.title\">{{ dataProcessor.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.dataProcessors && _.filter(exportableResources.dataProcessors, {'category': 'querycaching'}).length > 0) {\n <div class=\"mt-6\"\n >\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Query Caches\n </div>\n @for (dataProcessor of _.filter(exportableResources.dataProcessors, {'category': 'querycaching'}); track dataProcessor) {\n <div class=\"my-3 mx-2 flex items-start\"\n >\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'dataProcessor-' + dataProcessor.identifier\"\n [(ngModel)]=\"exportConfig.dataProcessors[dataProcessor.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"dataProcessor.title\">{{ dataProcessor.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.hooks && exportableResources.hooks.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Hooks\n </div>\n @for (hook of exportableResources.hooks; track hook) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'hook-' + hook.identifier\"\n [(ngModel)]=\"exportConfig.hooks[hook.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"hook.title\">{{ hook.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.apiKeys && exportableResources.apiKeys.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n API Keys\n </div>\n @for (apiKey of exportableResources.apiKeys; track apiKey) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'apikey-' + apiKey.identifier\"\n [(ngModel)]=\"exportConfig.apiKeys[apiKey.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"apiKey.title\">{{ apiKey.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.keyPairs && exportableResources.keyPairs.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Key Pairs\n </div>\n @for (keyPair of exportableResources.keyPairs; track keyPair) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'keyPair-' + keyPair.identifier\"\n [(ngModel)]=\"exportConfig.keyPairs[keyPair.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"keyPair.title\">{{ keyPair.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n @if (exportableResources.alertGroups && exportableResources.alertGroups.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Alert Groups\n </div>\n @for (alertGroup of exportableResources.alertGroups; track alertGroup) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'alert-' + alertGroup.identifier\"\n [(ngModel)]=\"exportConfig.alertGroups[alertGroup.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"alertGroup.title\">{{ alertGroup.title }}</label>\n </div>\n @if (exportConfig.alertGroups[alertGroup.identifier].included) {\n <div class=\"flex items-center h-5 w-12\"\n >\n <input type=\"checkbox\"\n [name]=\"'alert-update-' + alertGroup.identifier\"\n [(ngModel)]=\"exportConfig.alertGroups[alertGroup.identifier].update\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n }\n @if (exportConfig.alertGroups[alertGroup.identifier].included) {\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-500\">Update content on import</label>\n </div>\n }\n </div>\n }\n </div>\n }\n @if (exportableResources.notificationGroups && exportableResources.notificationGroups.length) {\n <div class=\"mt-6\">\n <div class=\"mb-4 bg-gray-100 w-full px-4 py-3 border-b border-t uppercase text-xs tracking-widest font-medium\">\n Notification Groups\n </div>\n @for (notificationGroup of exportableResources.notificationGroups; track notificationGroup) {\n <div class=\"my-3 mx-2 flex items-start\">\n <div class=\"flex items-center h-5 w-12\">\n <input type=\"checkbox\"\n [name]=\"'notification-' + notificationGroup.identifier\"\n [(ngModel)]=\"exportConfig.notificationGroups[notificationGroup.identifier].included\"\n class=\"focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded\">\n </div>\n <div class=\"ml-3 text-sm w-48\">\n <label class=\"font-medium text-gray-700 truncate block\" [title]=\"notificationGroup.title\">{{ notificationGroup.title }}</label>\n </div>\n </div>\n }\n </div>\n }\n }\n\n <hr class=\"my-8\">\n\n <div class=\"p-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\" (click)=\"export()\"\n class=\"disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-primary focus:outline-none\">\n Export Project\n </button>\n </div>\n </div>\n\n</div>\n\n\n\n\n\n\n","import {Injectable} from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport {Observable} from 'rxjs';\n\nexport interface ComponentCanDeactivate {\n canDeactivate: () => boolean | Observable<boolean>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardChangesGuard {\n canDeactivate(\n component: ComponentCanDeactivate,\n currentRoute: ActivatedRouteSnapshot,\n currentState: RouterStateSnapshot,\n nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {\n // if there are no pending changes, just allow deactivation; else confirm first\n return component.canDeactivate() ?\n true :\n // NOTE: this warning message will only be shown when navigating elsewhere within your angular app;\n // when navigating away from your angular app, the browser will show a generic warning message\n // see http://stackoverflow.com/a/42207299/7307355\n confirm('Leave site? Changes that you made may not be saved.');\n }\n\n}\n","import {Subject} from 'rxjs';\n\nexport class ActionEvent {\n\n public name: string;\n public title: number;\n public actionLabel: string;\n public completeLabel: string;\n public event: Subject<any>;\n public data: any;\n public disabled = false;\n public comparisonField: string;\n\n constructor(actionEvent?: any) {\n if (actionEvent) {\n this.name = actionEvent.name;\n this.title = actionEvent.title;\n this.actionLabel = actionEvent.actionLabel;\n this.completeLabel = actionEvent.completeLabel;\n this.event = actionEvent.event;\n this.data = actionEvent.data;\n this.disabled = actionEvent.disabled || false;\n this.comparisonField = actionEvent.comparisonField;\n }\n }\n\n}\n","import {Component, OnInit} from '@angular/core';\n\n@Component({\n selector: 'ki-dashboard-parameter',\n templateUrl: './dashboard-parameter.component.html',\n styleUrls: ['./dashboard-parameter.component.sass'],\n standalone: false\n})\nexport class DashboardParameterComponent implements OnInit {\n\n constructor() {\n }\n\n ngOnInit(): void {\n }\n\n}\n","<p>dashboard-parameter works!</p>\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-available-columns',\n templateUrl: './available-columns.component.html',\n styleUrls: ['./available-columns.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class AvailableColumnsComponent implements OnInit {\n\n public columns: any = [];\n\n constructor(public dialogRef: MatDialogRef<AvailableColumnsComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n this.columns = this.data.columns;\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Column Expressions</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <p>Use columns by wrapping the column name in double square brackets. Available columns are outlined\n below...</p>\n\n @for (column of columns; track column) {\n <div class=\"pr-4\">\n {{column.title}} <b>[[{{column.name}}]]</b>\n </div>\n }\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close>Close</button>\n </div>\n\n</div>\n\n\n","import {Component, Inject, OnInit} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n selector: 'ki-job-tasks',\n templateUrl: './job-tasks.component.html',\n styleUrls: ['./job-tasks.component.sass'],\n host: { class: 'dialog-wrapper' },\n standalone: false\n})\nexport class JobTasksComponent implements OnInit {\n\n constructor(public dialogRef: MatDialogRef<JobTasksComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n }\n\n ngOnInit(): void {\n }\n\n}\n","<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Job Tasks</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n </div>\n\n</div>\n\n\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ki-data-search',\n templateUrl: './data-search.component.html',\n styleUrls: ['./data-search.component.sass'],\n standalone: false\n})\nexport class DataSearchComponent {\n\n}\n","<p>data-search works!</p>\n","import {CUSTOM_ELEMENTS_SCHEMA, ModuleWithProviders, NgModule} from '@angular/core';\nimport {DashboardEditorComponent} from './components/dashboard-editor/dashboard-editor.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {CommonModule} from '@angular/common';\nimport {ConfigureItemComponent} from './components/dashboard-editor/configure-item/configure-item.component';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {NgxResizableModule} from '@3dgenomes/ngx-resizable';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {DatasourceComponent} from './components/datasource/datasource.component';\nimport {DatasetComponent} from './components/dataset/dataset.component';\nimport {DatasetEditorComponent, DatasetEditorPopupComponent} from './components/dataset/dataset-editor/dataset-editor.component';\nimport {MatTableModule} from '@angular/material/table';\nimport {MatPaginatorModule} from '@angular/material/paginator';\nimport {MatSortModule} from '@angular/material/sort';\nimport {ProjectPickerComponent} from './components/project-picker/project-picker.component';\nimport {DragDropModule} from '@angular/cdk/drag-drop';\nimport {FormsModule} from '@angular/forms';\nimport {DatasetFilterComponent} from './components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component';\nimport {DataExplorerComponent} from './components/data-explorer/data-explorer.component';\nimport {TagPickerComponent} from './components/tag-picker/tag-picker.component';\nimport {DashboardsComponent} from './components/dashboards/dashboards.component';\nimport {DatasetFilterJunctionComponent} from './components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\nimport {DatasetNameDialogComponent} from './components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component';\nimport {DatasetSummariseComponent} from './components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component';\nimport {MatSelectModule} from '@angular/material/select';\nimport {DatasetFiltersComponent} from './components/dataset/dataset-editor/dataset-filters/dataset-filters.component';\nimport {DatasetParameterValuesComponent} from './components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component';\nimport {DatasetParameterTypeComponent} from './components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport { DatasetAddParameterComponent } from './components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component';\nimport { DatasetAddJoinComponent } from './components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component';\nimport {MatStepperModule} from '@angular/material/stepper';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport { DatasetCreateFormulaComponent } from './components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component';\nimport {MatListModule} from '@angular/material/list';\nimport { DatasetColumnSettingsComponent } from './components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component';\nimport { DatasetColumnEditorComponent } from './components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component';\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\nimport { SourceSelectorDialogComponent } from './components/dashboard-editor/source-selector-dialog/source-selector-dialog.component';\nimport {MatSidenavModule} from '@angular/material/sidenav';\nimport { DashboardParameterComponent } from './components/dashboard-editor/dashboard-parameter/dashboard-parameter.component';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {RouterModule} from '@angular/router';\nimport {NotificationGroupsComponent} from './components/notification-groups/notification-groups.component';\nimport {EditNotificationGroupComponent} from './components/notification-groups/edit-notification-group/edit-notification-group.component';\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport { AlertGroupsComponent } from './components/alert-groups/alert-groups.component';\nimport { EditAlertGroupComponent } from './components/alert-groups/edit-alert-group/edit-alert-group.component';\nimport { EditDashboardAlertComponent } from './components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component';\nimport { SnapshotProfileDialogComponent } from './components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';\nimport { TaskTimePeriodsComponent } from './components/task-time-periods/task-time-periods.component';\nimport { SnapshotsComponent } from './components/snapshots/snapshots.component';\nimport { ViewDashboardComponent } from './components/dashboards/view-dashboard/view-dashboard.component';\nimport {MatSnackBarModule} from '@angular/material/snack-bar';\nimport {MatRadioModule} from '@angular/material/radio';\nimport { FeedsComponent } from './components/feeds/feeds.component';\nimport { FeedComponent } from './components/feeds/feed/feed.component';\nimport { ExportDataComponent } from './components/data-explorer/export-data/export-data.component';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport { MetadataComponent } from './components/metadata/metadata.component';\nimport { AvailableColumnsComponent } from './components/dataset/dataset-editor/available-columns/available-columns.component';\nimport { JobTasksComponent } from './components/job-tasks/job-tasks.component';\nimport { CreateDatasourceComponent } from './components/datasource/create-datasource/create-datasource.component';\nimport { ImportDataComponent } from './components/datasource/create-datasource/import-data/import-data.component';\nimport { WhitelistedSqlFunctionsComponent } from './components/whitelisted-sql-functions/whitelisted-sql-functions.component';\nimport { HtmlDocumentationComponent } from './components/dashboard-editor/configure-item/html-documentation/html-documentation.component';\nimport { DataPickerComponent } from './components/data-picker/data-picker.component';\nimport { CreateDatasetComponent } from './components/dataset/create-dataset/create-dataset.component';\nimport { TableCellFormatterComponent } from './components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component';\nimport { DocumentDatasourceComponent } from './components/datasource/document-datasource/document-datasource.component';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {CodemirrorModule} from '@ctrl/ngx-codemirror';\nimport { ProjectSettingsComponent } from './components/project-settings/project-settings.component';\nimport { ProjectLinkSelectionComponent } from './components/project-settings/project-link-selection/project-link-selection.component';\nimport { UpstreamChangesConfirmationComponent } from './components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component';\nimport {DashboardChangesGuard} from './guards/dashboard-changes.guard';\nimport { DashboardSettingsComponent } from './components/dashboard-editor/dashboard-settings/dashboard-settings.component';\nimport { ApiAccessComponent } from './components/datasource/create-datasource/api-access/api-access.component';\nimport {ClipboardModule} from '@angular/cdk/clipboard';\nimport { TabularDatasourceComponent } from './components/datasource/create-datasource/tabular-datasource/tabular-datasource.component';\nimport { MoveTransformationConfirmationComponent } from './components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component';\nimport {CdkConnectedOverlay, CdkOverlayOrigin} from '@angular/cdk/overlay';\nimport {NgChartsModule} from 'ng2-charts';\nimport { SaveAsQueryComponent } from './components/dataset/dataset-editor/save-as-query/save-as-query.component';\nimport { ShareQueryComponent } from './components/dataset/dataset-editor/share-query/share-query.component';\nimport { SharedWithMeComponent } from './components/shared-with-me/shared-with-me.component';\nimport { MarketplaceComponent } from './components/marketplace/marketplace.component';\nimport { QueryCachingComponent } from './components/query-caching/query-caching.component';\nimport { EditQueryCacheComponent } from './components/query-caching/edit-query-cache/edit-query-cache.component';\nimport {\n SnapshotApiAccessComponent\n} from './components/data-explorer/snapshot-api-access/snapshot-api-access.component';\nimport { DataSharingInviteComponent } from './components/data-sharing-invite/data-sharing-invite.component';\nimport { DataSearchComponent } from './components/data-search/data-search.component';\nimport { ImportWizardComponent } from './components/datasource/create-datasource/import-data/import-wizard/import-wizard.component';\nimport { AdvancedSettingsComponent } from './components/datasource/create-datasource/advanced-settings/advanced-settings.component';\nimport {MatChipsModule} from '@angular/material/chips';\nimport { RemoveTransformationWarningComponent } from './components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component';\nimport { ExportProjectComponent } from './components/export-project/export-project.component';\nimport { ChangeSourceWarningComponent } from './components/data-explorer/change-source-warning/change-source-warning.component';\nimport { DatasetFilterInclusionComponent } from './components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component';\nimport { FeedApiModalComponent } from './components/shared-with-me/feed-api-modal/feed-api-modal.component';\nimport {KININTEL_CONFIG, KinintelModuleConfig} from './kinintel-config';\nimport { QueryCacheViewComponent } from './components/query-caching/query-cache-view/query-cache-view.component';\nimport {\n ItemComponentComponent\n} from './components/dashboard-editor/item-component/item-component.component';\n\n\n@NgModule({\n declarations: [\n DashboardEditorComponent,\n ConfigureItemComponent,\n DatasourceComponent,\n DatasetComponent,\n DatasetEditorComponent,\n ProjectPickerComponent,\n DatasetFilterComponent,\n DataExplorerComponent,\n TagPickerComponent,\n DashboardsComponent,\n DatasetFilterJunctionComponent,\n DatasetNameDialogComponent,\n DatasetSummariseComponent,\n DatasetFiltersComponent,\n DatasetParameterValuesComponent,\n DatasetParameterTypeComponent,\n DatasetAddParameterComponent,\n DatasetAddJoinComponent,\n DatasetCreateFormulaComponent,\n DatasetColumnSettingsComponent,\n DatasetColumnEditorComponent,\n SourceSelectorDialogComponent,\n DashboardParameterComponent,\n NotificationGroupsComponent,\n EditNotificationGroupComponent,\n AlertGroupsComponent,\n EditAlertGroupComponent,\n EditDashboardAlertComponent,\n SnapshotProfileDialogComponent,\n TaskTimePeriodsComponent,\n SnapshotsComponent,\n ViewDashboardComponent,\n DatasetEditorPopupComponent,\n FeedsComponent,\n FeedComponent,\n ExportDataComponent,\n MetadataComponent,\n AvailableColumnsComponent,\n JobTasksComponent,\n CreateDatasourceComponent,\n ImportDataComponent,\n WhitelistedSqlFunctionsComponent,\n HtmlDocumentationComponent,\n DataPickerComponent,\n CreateDatasetComponent,\n TableCellFormatterComponent,\n DocumentDatasourceComponent,\n ProjectSettingsComponent,\n ProjectLinkSelectionComponent,\n UpstreamChangesConfirmationComponent,\n DashboardSettingsComponent,\n ApiAccessComponent,\n TabularDatasourceComponent,\n MoveTransformationConfirmationComponent,\n SaveAsQueryComponent,\n ShareQueryComponent,\n SharedWithMeComponent,\n MarketplaceComponent,\n QueryCachingComponent,\n EditQueryCacheComponent,\n SnapshotApiAccessComponent,\n DataSharingInviteComponent,\n DataSearchComponent,\n ImportWizardComponent,\n AdvancedSettingsComponent,\n RemoveTransformationWarningComponent,\n ExportProjectComponent,\n ChangeSourceWarningComponent,\n DatasetFilterInclusionComponent,\n FeedApiModalComponent,\n QueryCacheViewComponent\n ],\n imports: [\n BrowserModule,\n CommonModule,\n MatButtonModule,\n MatIconModule,\n NgChartsModule,\n MatDialogModule,\n NgxResizableModule,\n MatMenuModule,\n MatExpansionModule,\n MatFormFieldModule,\n MatInputModule,\n MatChipsModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n DragDropModule,\n FormsModule,\n MatButtonToggleModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatStepperModule,\n MatCheckboxModule,\n MatListModule,\n MatProgressSpinnerModule,\n MatSidenavModule,\n MatTabsModule,\n RouterModule,\n MatAutocompleteModule,\n MatSnackBarModule,\n MatRadioModule,\n MatTooltipModule,\n MatProgressBarModule,\n CodemirrorModule,\n ClipboardModule,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n ItemComponentComponent\n ],\n exports: [\n DashboardEditorComponent,\n DatasourceComponent,\n DatasetComponent,\n ProjectPickerComponent,\n TagPickerComponent,\n DashboardsComponent,\n NotificationGroupsComponent,\n EditNotificationGroupComponent,\n AlertGroupsComponent,\n EditAlertGroupComponent,\n SnapshotsComponent,\n ViewDashboardComponent,\n FeedsComponent,\n CreateDatasourceComponent,\n DocumentDatasourceComponent,\n ProjectSettingsComponent,\n UpstreamChangesConfirmationComponent,\n TabularDatasourceComponent,\n MarketplaceComponent,\n SharedWithMeComponent,\n SnapshotApiAccessComponent,\n QueryCachingComponent,\n DataSharingInviteComponent,\n ExportProjectComponent,\n ShareQueryComponent\n ],\n providers: [DashboardChangesGuard],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class NgKinintelModule {\n static forRoot(conf?: KinintelModuleConfig): ModuleWithProviders<NgKinintelModule> {\n return {\n ngModule: NgKinintelModule,\n providers: [\n {provide: KININTEL_CONFIG, useValue: conf || {}}\n ]\n };\n }\n}\n\n","/*\n * Public API Surface of ng-kinintel\n */\nexport * from './lib/services/tag.service';\nexport * from './lib/services/project.service';\nexport * from './lib/services/dashboard.service';\nexport * from './lib/services/dataset.service';\nexport * from './lib/services/feed.service';\nexport * from './lib/services/datasource.service';\nexport * from './lib/services/external.service';\nexport * from './lib/services/data-processor.service';\n\nexport * from './lib/components/dashboard-editor/dashboard-editor.component';\nexport * from './lib/components/dataset/dataset.component';\nexport * from './lib/components/datasource/datasource.component';\nexport * from './lib/components/project-picker/project-picker.component';\nexport * from './lib/components/tag-picker/tag-picker.component';\nexport * from './lib/components/dashboards/dashboards.component';\nexport * from './lib/components/notification-groups/notification-groups.component';\nexport * from './lib/components/notification-groups/edit-notification-group/edit-notification-group.component';\nexport * from './lib/components/alert-groups/alert-groups.component';\nexport * from './lib/components/alert-groups/edit-alert-group/edit-alert-group.component';\nexport * from './lib/components/snapshots/snapshots.component';\nexport * from './lib/components/dashboards/view-dashboard/view-dashboard.component';\nexport * from './lib/components/feeds/feeds.component';\nexport * from './lib/components/datasource/create-datasource/create-datasource.component';\nexport * from './lib/components/metadata/metadata.component';\nexport * from './lib/components/data-explorer/data-explorer.component';\nexport * from './lib/components/datasource/document-datasource/document-datasource.component';\nexport * from './lib/components/project-settings/project-settings.component';\nexport * from './lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component';\n// export * from './lib/components/datasource/create-datasource/api-access/api-access.component';\nexport * from './lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component';\nexport * from './lib/components/marketplace/marketplace.component';\nexport * from './lib/components/shared-with-me/shared-with-me.component';\nexport * from './lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component';\nexport * from './lib/components/query-caching/query-caching.component';\nexport * from './lib/components/data-sharing-invite/data-sharing-invite.component';\nexport * from './lib/components/export-project/export-project.component';\nexport * from './lib/components/dataset/dataset-editor/share-query/share-query.component';\n\nexport * from './lib/guards/dashboard-changes.guard';\n\nexport * from './lib/objects/action-event';\n\nexport * from './lib/ng-kinintel.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.ProjectService","i2.TagService","i3.ProjectService","_","i2","i3","i4","i2.DatasourceService","i3.DatasetService","i1","i7.DataPickerComponent","i2.DatasetService","i5","i6","i7","i4.DatasetParameterTypeComponent","i3.DatasourceService","i8.DatasetParameterValuesComponent","i9.DataPickerComponent","i8","i9.DatasetFilterInclusionComponent","i5.DatasetFilterComponent","i6.DatasetFilterInclusionComponent","i6.DatasetFilterJunctionComponent","i7.DatasetFilterInclusionComponent","i2.AlertService","i9.DatasetFiltersComponent","i1.DatasetService","i7.WhitelistedSqlFunctionsComponent","i6.DataProcessorService","i9","i10","i11","i12","i13.DatasetFiltersComponent","i14.DatasetParameterValuesComponent","i15.WhitelistedSqlFunctionsComponent","i16.DataPickerComponent","i6.WhitelistedSqlFunctionsComponent","i8.DatasetColumnEditorComponent","i13","i15","i17.DatasetFiltersComponent","i18.WhitelistedSqlFunctionsComponent","i1.DashboardService","i2.DashboardService","i4.DatasourceService","i6.ProjectService","i14","i16","i17","i19.DatasetEditorComponent","i20.DatasetFiltersComponent","i21.HtmlDocumentationComponent","i22.TableCellFormatterComponent","i4.AlertService","i5.DashboardService","i9.ExternalService","i10.ProjectService","i5.AlertService","i6.DatasetService","i13.ItemComponentComponent","i3.DataProcessorService","i12.TaskTimePeriodsComponent","i2.DataProcessorService","i1.DataProcessorService","i4.ProjectService","i5.DataProcessorService","i12.DatasetEditorComponent","i13.QueryCacheViewComponent","i3.TagService","i1.NotificationService","i1.ProjectService","i9.TaskTimePeriodsComponent","i7.ExternalService","i8.DatasetService","i2.FeedService","i7.ProjectService","i4.DatasetService","i3.DashboardService","i1.DatasourceService","i4.FeedService","KAExportProjectComponent"],"mappings":"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"}