terrier-engine 4.4.0 → 4.4.3

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 (313) hide show
  1. package/data-dive/dd-app.ts +45 -0
  2. package/data-dive/dd-db.ts +12 -0
  3. package/data-dive/dd-routes.ts +10 -0
  4. package/data-dive/dd-session.ts +45 -0
  5. package/data-dive/dd-user.ts +12 -0
  6. package/data-dive/dives/dive-editor.ts +244 -0
  7. package/data-dive/dives/dive-list.ts +164 -0
  8. package/data-dive/dives/dive-runs.ts +272 -0
  9. package/data-dive/dives/dive-settings.ts +227 -0
  10. package/data-dive/dives/dives.ts +81 -0
  11. package/data-dive/dives/group-editor.ts +139 -0
  12. package/data-dive/gen/models.ts +192 -0
  13. package/data-dive/queries/columns.ts +355 -0
  14. package/data-dive/queries/dates.ts +286 -0
  15. package/data-dive/queries/filters.ts +723 -0
  16. package/data-dive/queries/queries.ts +263 -0
  17. package/data-dive/queries/query-editor.ts +232 -0
  18. package/data-dive/queries/query-form.ts +51 -0
  19. package/data-dive/queries/tables.ts +395 -0
  20. package/data-dive/queries/test/dates.test.ts +178 -0
  21. package/package.json +1 -1
  22. package/{parts → terrier/parts}/panel-part.ts +5 -1
  23. package/tsconfig.json +21 -0
  24. /package/{README.md → terrier/README.md} +0 -0
  25. /package/{api.ts → terrier/api.ts} +0 -0
  26. /package/{app.ts → terrier/app.ts} +0 -0
  27. /package/{attachments.ts → terrier/attachments.ts} +0 -0
  28. /package/{db-client.ts → terrier/db-client.ts} +0 -0
  29. /package/{dropdowns.ts → terrier/dropdowns.ts} +0 -0
  30. /package/{format.ts → terrier/format.ts} +0 -0
  31. /package/{forms.ts → terrier/forms.ts} +0 -0
  32. /package/{fragments.ts → terrier/fragments.ts} +0 -0
  33. /package/{gen → terrier/gen}/hub-icons.ts +0 -0
  34. /package/{glyps.ts → terrier/glyps.ts} +0 -0
  35. /package/{ids.ts → terrier/ids.ts} +0 -0
  36. /package/{images → terrier/images}/icons/active.svg +0 -0
  37. /package/{images → terrier/images}/icons/admin.svg +0 -0
  38. /package/{images → terrier/images}/icons/archive.svg +0 -0
  39. /package/{images → terrier/images}/icons/arrow_down.svg +0 -0
  40. /package/{images → terrier/images}/icons/arrow_left.svg +0 -0
  41. /package/{images → terrier/images}/icons/arrow_right.svg +0 -0
  42. /package/{images → terrier/images}/icons/arrow_up.svg +0 -0
  43. /package/{images → terrier/images}/icons/assign.svg +0 -0
  44. /package/{images → terrier/images}/icons/attachment.svg +0 -0
  45. /package/{images → terrier/images}/icons/back.svg +0 -0
  46. /package/{images → terrier/images}/icons/badge.svg +0 -0
  47. /package/{images → terrier/images}/icons/board.svg +0 -0
  48. /package/{images → terrier/images}/icons/branch.svg +0 -0
  49. /package/{images → terrier/images}/icons/bug.svg +0 -0
  50. /package/{images → terrier/images}/icons/calculator.svg +0 -0
  51. /package/{images → terrier/images}/icons/checkmark.svg +0 -0
  52. /package/{images → terrier/images}/icons/close.svg +0 -0
  53. /package/{images → terrier/images}/icons/clypboard.svg +0 -0
  54. /package/{images → terrier/images}/icons/comment.svg +0 -0
  55. /package/{images → terrier/images}/icons/complete.svg +0 -0
  56. /package/{images → terrier/images}/icons/dashboard.svg +0 -0
  57. /package/{images → terrier/images}/icons/data_pull.svg +0 -0
  58. /package/{images → terrier/images}/icons/data_update.svg +0 -0
  59. /package/{images → terrier/images}/icons/database.svg +0 -0
  60. /package/{images → terrier/images}/icons/day.svg +0 -0
  61. /package/{images → terrier/images}/icons/delete.svg +0 -0
  62. /package/{images → terrier/images}/icons/documentation.svg +0 -0
  63. /package/{images → terrier/images}/icons/edit.svg +0 -0
  64. /package/{images → terrier/images}/icons/feature.svg +0 -0
  65. /package/{images → terrier/images}/icons/flex.svg +0 -0
  66. /package/{images → terrier/images}/icons/forward.svg +0 -0
  67. /package/{images → terrier/images}/icons/github.svg +0 -0
  68. /package/{images → terrier/images}/icons/history.svg +0 -0
  69. /package/{images → terrier/images}/icons/home.svg +0 -0
  70. /package/{images → terrier/images}/icons/image.svg +0 -0
  71. /package/{images → terrier/images}/icons/inbox.svg +0 -0
  72. /package/{images → terrier/images}/icons/info.svg +0 -0
  73. /package/{images → terrier/images}/icons/issue.svg +0 -0
  74. /package/{images → terrier/images}/icons/lane.svg +0 -0
  75. /package/{images → terrier/images}/icons/lane_asap.svg +0 -0
  76. /package/{images → terrier/images}/icons/lane_days.svg +0 -0
  77. /package/{images → terrier/images}/icons/lane_hours.svg +0 -0
  78. /package/{images → terrier/images}/icons/lane_weeks.svg +0 -0
  79. /package/{images → terrier/images}/icons/lanes_board.svg +0 -0
  80. /package/{images → terrier/images}/icons/level_complete.svg +0 -0
  81. /package/{images → terrier/images}/icons/level_highway.svg +0 -0
  82. /package/{images → terrier/images}/icons/level_on_ramp.svg +0 -0
  83. /package/{images → terrier/images}/icons/level_parking.svg +0 -0
  84. /package/{images → terrier/images}/icons/minus.svg +0 -0
  85. /package/{images → terrier/images}/icons/night.svg +0 -0
  86. /package/{images → terrier/images}/icons/origin.svg +0 -0
  87. /package/{images → terrier/images}/icons/pending.svg +0 -0
  88. /package/{images → terrier/images}/icons/plus.svg +0 -0
  89. /package/{images → terrier/images}/icons/post.svg +0 -0
  90. /package/{images → terrier/images}/icons/pr_closed.svg +0 -0
  91. /package/{images → terrier/images}/icons/pr_merged.svg +0 -0
  92. /package/{images → terrier/images}/icons/pr_open.svg +0 -0
  93. /package/{images → terrier/images}/icons/prioritized.svg +0 -0
  94. /package/{images → terrier/images}/icons/project.svg +0 -0
  95. /package/{images → terrier/images}/icons/question.svg +0 -0
  96. /package/{images → terrier/images}/icons/reaction.svg +0 -0
  97. /package/{images → terrier/images}/icons/recent.svg +0 -0
  98. /package/{images → terrier/images}/icons/refresh.svg +0 -0
  99. /package/{images → terrier/images}/icons/request.svg +0 -0
  100. /package/{images → terrier/images}/icons/settings.svg +0 -0
  101. /package/{images → terrier/images}/icons/status.svg +0 -0
  102. /package/{images → terrier/images}/icons/step_deploy.svg +0 -0
  103. /package/{images → terrier/images}/icons/step_develop.svg +0 -0
  104. /package/{images → terrier/images}/icons/step_investigate.svg +0 -0
  105. /package/{images → terrier/images}/icons/step_review.svg +0 -0
  106. /package/{images → terrier/images}/icons/step_test.svg +0 -0
  107. /package/{images → terrier/images}/icons/steps.svg +0 -0
  108. /package/{images → terrier/images}/icons/steps_board.svg +0 -0
  109. /package/{images → terrier/images}/icons/subscribe.svg +0 -0
  110. /package/{images → terrier/images}/icons/support.svg +0 -0
  111. /package/{images → terrier/images}/icons/terrier.svg +0 -0
  112. /package/{images → terrier/images}/icons/thumbs_up.svg +0 -0
  113. /package/{images → terrier/images}/icons/type.svg +0 -0
  114. /package/{images → terrier/images}/icons/unprioritized.svg +0 -0
  115. /package/{images → terrier/images}/icons/upload.svg +0 -0
  116. /package/{images → terrier/images}/icons/user.svg +0 -0
  117. /package/{images → terrier/images}/icons/users.svg +0 -0
  118. /package/{images → terrier/images}/optimized/icon-active.svg +0 -0
  119. /package/{images → terrier/images}/optimized/icon-admin.svg +0 -0
  120. /package/{images → terrier/images}/optimized/icon-archive.svg +0 -0
  121. /package/{images → terrier/images}/optimized/icon-arrow_down.svg +0 -0
  122. /package/{images → terrier/images}/optimized/icon-arrow_left.svg +0 -0
  123. /package/{images → terrier/images}/optimized/icon-arrow_right.svg +0 -0
  124. /package/{images → terrier/images}/optimized/icon-arrow_up.svg +0 -0
  125. /package/{images → terrier/images}/optimized/icon-assign.svg +0 -0
  126. /package/{images → terrier/images}/optimized/icon-attachment.svg +0 -0
  127. /package/{images → terrier/images}/optimized/icon-back.svg +0 -0
  128. /package/{images → terrier/images}/optimized/icon-badge.svg +0 -0
  129. /package/{images → terrier/images}/optimized/icon-board.svg +0 -0
  130. /package/{images → terrier/images}/optimized/icon-branch.svg +0 -0
  131. /package/{images → terrier/images}/optimized/icon-bug.svg +0 -0
  132. /package/{images → terrier/images}/optimized/icon-calculator.svg +0 -0
  133. /package/{images → terrier/images}/optimized/icon-checkmark.svg +0 -0
  134. /package/{images → terrier/images}/optimized/icon-close.svg +0 -0
  135. /package/{images → terrier/images}/optimized/icon-clypboard.svg +0 -0
  136. /package/{images → terrier/images}/optimized/icon-comment.svg +0 -0
  137. /package/{images → terrier/images}/optimized/icon-complete.svg +0 -0
  138. /package/{images → terrier/images}/optimized/icon-dashboard.svg +0 -0
  139. /package/{images → terrier/images}/optimized/icon-data_pull.svg +0 -0
  140. /package/{images → terrier/images}/optimized/icon-data_update.svg +0 -0
  141. /package/{images → terrier/images}/optimized/icon-database.svg +0 -0
  142. /package/{images → terrier/images}/optimized/icon-day.svg +0 -0
  143. /package/{images → terrier/images}/optimized/icon-delete.svg +0 -0
  144. /package/{images → terrier/images}/optimized/icon-documentation.svg +0 -0
  145. /package/{images → terrier/images}/optimized/icon-edit.svg +0 -0
  146. /package/{images → terrier/images}/optimized/icon-feature.svg +0 -0
  147. /package/{images → terrier/images}/optimized/icon-flex.svg +0 -0
  148. /package/{images → terrier/images}/optimized/icon-forward.svg +0 -0
  149. /package/{images → terrier/images}/optimized/icon-github.svg +0 -0
  150. /package/{images → terrier/images}/optimized/icon-history.svg +0 -0
  151. /package/{images → terrier/images}/optimized/icon-home.svg +0 -0
  152. /package/{images → terrier/images}/optimized/icon-image.svg +0 -0
  153. /package/{images → terrier/images}/optimized/icon-inbox.svg +0 -0
  154. /package/{images → terrier/images}/optimized/icon-info.svg +0 -0
  155. /package/{images → terrier/images}/optimized/icon-issue.svg +0 -0
  156. /package/{images → terrier/images}/optimized/icon-lane.svg +0 -0
  157. /package/{images → terrier/images}/optimized/icon-lane_asap.svg +0 -0
  158. /package/{images → terrier/images}/optimized/icon-lane_days.svg +0 -0
  159. /package/{images → terrier/images}/optimized/icon-lane_hours.svg +0 -0
  160. /package/{images → terrier/images}/optimized/icon-lane_weeks.svg +0 -0
  161. /package/{images → terrier/images}/optimized/icon-lanes_board.svg +0 -0
  162. /package/{images → terrier/images}/optimized/icon-level_complete.svg +0 -0
  163. /package/{images → terrier/images}/optimized/icon-level_highway.svg +0 -0
  164. /package/{images → terrier/images}/optimized/icon-level_on_ramp.svg +0 -0
  165. /package/{images → terrier/images}/optimized/icon-level_parking.svg +0 -0
  166. /package/{images → terrier/images}/optimized/icon-minus.svg +0 -0
  167. /package/{images → terrier/images}/optimized/icon-night.svg +0 -0
  168. /package/{images → terrier/images}/optimized/icon-origin.svg +0 -0
  169. /package/{images → terrier/images}/optimized/icon-pending.svg +0 -0
  170. /package/{images → terrier/images}/optimized/icon-plus.svg +0 -0
  171. /package/{images → terrier/images}/optimized/icon-post.svg +0 -0
  172. /package/{images → terrier/images}/optimized/icon-pr_closed.svg +0 -0
  173. /package/{images → terrier/images}/optimized/icon-pr_merged.svg +0 -0
  174. /package/{images → terrier/images}/optimized/icon-pr_open.svg +0 -0
  175. /package/{images → terrier/images}/optimized/icon-prioritized.svg +0 -0
  176. /package/{images → terrier/images}/optimized/icon-project.svg +0 -0
  177. /package/{images → terrier/images}/optimized/icon-question.svg +0 -0
  178. /package/{images → terrier/images}/optimized/icon-reaction.svg +0 -0
  179. /package/{images → terrier/images}/optimized/icon-recent.svg +0 -0
  180. /package/{images → terrier/images}/optimized/icon-refresh.svg +0 -0
  181. /package/{images → terrier/images}/optimized/icon-request.svg +0 -0
  182. /package/{images → terrier/images}/optimized/icon-settings.svg +0 -0
  183. /package/{images → terrier/images}/optimized/icon-status.svg +0 -0
  184. /package/{images → terrier/images}/optimized/icon-step_deploy.svg +0 -0
  185. /package/{images → terrier/images}/optimized/icon-step_develop.svg +0 -0
  186. /package/{images → terrier/images}/optimized/icon-step_investigate.svg +0 -0
  187. /package/{images → terrier/images}/optimized/icon-step_review.svg +0 -0
  188. /package/{images → terrier/images}/optimized/icon-step_test.svg +0 -0
  189. /package/{images → terrier/images}/optimized/icon-steps.svg +0 -0
  190. /package/{images → terrier/images}/optimized/icon-steps_board.svg +0 -0
  191. /package/{images → terrier/images}/optimized/icon-subscribe.svg +0 -0
  192. /package/{images → terrier/images}/optimized/icon-support.svg +0 -0
  193. /package/{images → terrier/images}/optimized/icon-terrier.svg +0 -0
  194. /package/{images → terrier/images}/optimized/icon-thumbs_up.svg +0 -0
  195. /package/{images → terrier/images}/optimized/icon-type.svg +0 -0
  196. /package/{images → terrier/images}/optimized/icon-unprioritized.svg +0 -0
  197. /package/{images → terrier/images}/optimized/icon-upload.svg +0 -0
  198. /package/{images → terrier/images}/optimized/icon-user.svg +0 -0
  199. /package/{images → terrier/images}/optimized/icon-users.svg +0 -0
  200. /package/{images → terrier/images}/optimized/terrier-hub-favicon.svg +0 -0
  201. /package/{images → terrier/images}/optimized/terrier-hub-icon-dark.svg +0 -0
  202. /package/{images → terrier/images}/optimized/terrier-hub-icon-light.svg +0 -0
  203. /package/{images → terrier/images}/optimized/terrier-hub-loader.svg +0 -0
  204. /package/{images → terrier/images}/optimized/terrier-hub-logo-dark.svg +0 -0
  205. /package/{images → terrier/images}/optimized/terrier-hub-logo-light.svg +0 -0
  206. /package/{images → terrier/images}/raw/icon-active.svg +0 -0
  207. /package/{images → terrier/images}/raw/icon-admin.svg +0 -0
  208. /package/{images → terrier/images}/raw/icon-archive.svg +0 -0
  209. /package/{images → terrier/images}/raw/icon-arrow_down.svg +0 -0
  210. /package/{images → terrier/images}/raw/icon-arrow_left.svg +0 -0
  211. /package/{images → terrier/images}/raw/icon-arrow_right.svg +0 -0
  212. /package/{images → terrier/images}/raw/icon-arrow_up.svg +0 -0
  213. /package/{images → terrier/images}/raw/icon-assign.svg +0 -0
  214. /package/{images → terrier/images}/raw/icon-attachment.svg +0 -0
  215. /package/{images → terrier/images}/raw/icon-back.svg +0 -0
  216. /package/{images → terrier/images}/raw/icon-badge.svg +0 -0
  217. /package/{images → terrier/images}/raw/icon-board.svg +0 -0
  218. /package/{images → terrier/images}/raw/icon-branch.svg +0 -0
  219. /package/{images → terrier/images}/raw/icon-bug.svg +0 -0
  220. /package/{images → terrier/images}/raw/icon-calculator.svg +0 -0
  221. /package/{images → terrier/images}/raw/icon-checkmark.svg +0 -0
  222. /package/{images → terrier/images}/raw/icon-close.svg +0 -0
  223. /package/{images → terrier/images}/raw/icon-clypboard.svg +0 -0
  224. /package/{images → terrier/images}/raw/icon-comment.svg +0 -0
  225. /package/{images → terrier/images}/raw/icon-complete.svg +0 -0
  226. /package/{images → terrier/images}/raw/icon-dashboard.svg +0 -0
  227. /package/{images → terrier/images}/raw/icon-data_pull.svg +0 -0
  228. /package/{images → terrier/images}/raw/icon-data_update.svg +0 -0
  229. /package/{images → terrier/images}/raw/icon-database.svg +0 -0
  230. /package/{images → terrier/images}/raw/icon-day.svg +0 -0
  231. /package/{images → terrier/images}/raw/icon-delete.svg +0 -0
  232. /package/{images → terrier/images}/raw/icon-documentation.svg +0 -0
  233. /package/{images → terrier/images}/raw/icon-edit.svg +0 -0
  234. /package/{images → terrier/images}/raw/icon-feature.svg +0 -0
  235. /package/{images → terrier/images}/raw/icon-flex.svg +0 -0
  236. /package/{images → terrier/images}/raw/icon-forward.svg +0 -0
  237. /package/{images → terrier/images}/raw/icon-github.svg +0 -0
  238. /package/{images → terrier/images}/raw/icon-history.svg +0 -0
  239. /package/{images → terrier/images}/raw/icon-home.svg +0 -0
  240. /package/{images → terrier/images}/raw/icon-image.svg +0 -0
  241. /package/{images → terrier/images}/raw/icon-inbox.svg +0 -0
  242. /package/{images → terrier/images}/raw/icon-info.svg +0 -0
  243. /package/{images → terrier/images}/raw/icon-issue.svg +0 -0
  244. /package/{images → terrier/images}/raw/icon-lane.svg +0 -0
  245. /package/{images → terrier/images}/raw/icon-lane_asap.svg +0 -0
  246. /package/{images → terrier/images}/raw/icon-lane_days.svg +0 -0
  247. /package/{images → terrier/images}/raw/icon-lane_hours.svg +0 -0
  248. /package/{images → terrier/images}/raw/icon-lane_weeks.svg +0 -0
  249. /package/{images → terrier/images}/raw/icon-lanes_board.svg +0 -0
  250. /package/{images → terrier/images}/raw/icon-level_complete.svg +0 -0
  251. /package/{images → terrier/images}/raw/icon-level_highway.svg +0 -0
  252. /package/{images → terrier/images}/raw/icon-level_on_ramp.svg +0 -0
  253. /package/{images → terrier/images}/raw/icon-level_parking.svg +0 -0
  254. /package/{images → terrier/images}/raw/icon-minus.svg +0 -0
  255. /package/{images → terrier/images}/raw/icon-night.svg +0 -0
  256. /package/{images → terrier/images}/raw/icon-origin.svg +0 -0
  257. /package/{images → terrier/images}/raw/icon-pending.svg +0 -0
  258. /package/{images → terrier/images}/raw/icon-plus.svg +0 -0
  259. /package/{images → terrier/images}/raw/icon-post.svg +0 -0
  260. /package/{images → terrier/images}/raw/icon-pr_closed.svg +0 -0
  261. /package/{images → terrier/images}/raw/icon-pr_merged.svg +0 -0
  262. /package/{images → terrier/images}/raw/icon-pr_open.svg +0 -0
  263. /package/{images → terrier/images}/raw/icon-prioritized.svg +0 -0
  264. /package/{images → terrier/images}/raw/icon-project.svg +0 -0
  265. /package/{images → terrier/images}/raw/icon-question.svg +0 -0
  266. /package/{images → terrier/images}/raw/icon-reaction.svg +0 -0
  267. /package/{images → terrier/images}/raw/icon-recent.svg +0 -0
  268. /package/{images → terrier/images}/raw/icon-refresh.svg +0 -0
  269. /package/{images → terrier/images}/raw/icon-request.svg +0 -0
  270. /package/{images → terrier/images}/raw/icon-settings.svg +0 -0
  271. /package/{images → terrier/images}/raw/icon-status.svg +0 -0
  272. /package/{images → terrier/images}/raw/icon-step_deploy.svg +0 -0
  273. /package/{images → terrier/images}/raw/icon-step_develop.svg +0 -0
  274. /package/{images → terrier/images}/raw/icon-step_investigate.svg +0 -0
  275. /package/{images → terrier/images}/raw/icon-step_review.svg +0 -0
  276. /package/{images → terrier/images}/raw/icon-step_test.svg +0 -0
  277. /package/{images → terrier/images}/raw/icon-steps.svg +0 -0
  278. /package/{images → terrier/images}/raw/icon-steps_board.svg +0 -0
  279. /package/{images → terrier/images}/raw/icon-subscribe.svg +0 -0
  280. /package/{images → terrier/images}/raw/icon-support.svg +0 -0
  281. /package/{images → terrier/images}/raw/icon-terrier.svg +0 -0
  282. /package/{images → terrier/images}/raw/icon-thumbs_up.svg +0 -0
  283. /package/{images → terrier/images}/raw/icon-type.svg +0 -0
  284. /package/{images → terrier/images}/raw/icon-unprioritized.svg +0 -0
  285. /package/{images → terrier/images}/raw/icon-upload.svg +0 -0
  286. /package/{images → terrier/images}/raw/icon-user.svg +0 -0
  287. /package/{images → terrier/images}/raw/icon-users.svg +0 -0
  288. /package/{images → terrier/images}/raw/terrier-hub-favicon-alert.png +0 -0
  289. /package/{images → terrier/images}/raw/terrier-hub-favicon-dark.png +0 -0
  290. /package/{images → terrier/images}/raw/terrier-hub-favicon.png +0 -0
  291. /package/{images → terrier/images}/raw/terrier-hub-favicon.svg +0 -0
  292. /package/{images → terrier/images}/raw/terrier-hub-icon-dark.svg +0 -0
  293. /package/{images → terrier/images}/raw/terrier-hub-icon-light.png +0 -0
  294. /package/{images → terrier/images}/raw/terrier-hub-icon-light.svg +0 -0
  295. /package/{images → terrier/images}/raw/terrier-hub-loader.svg +0 -0
  296. /package/{images → terrier/images}/raw/terrier-hub-logo-dark.svg +0 -0
  297. /package/{images → terrier/images}/raw/terrier-hub-logo-light.png +0 -0
  298. /package/{images → terrier/images}/raw/terrier-hub-logo-light.svg +0 -0
  299. /package/{lightbox.ts → terrier/lightbox.ts} +0 -0
  300. /package/{loading.ts → terrier/loading.ts} +0 -0
  301. /package/{modals.ts → terrier/modals.ts} +0 -0
  302. /package/{overlays.ts → terrier/overlays.ts} +0 -0
  303. /package/{parts → terrier/parts}/content-part.ts +0 -0
  304. /package/{parts → terrier/parts}/not-found-page.ts +0 -0
  305. /package/{parts → terrier/parts}/page-part.ts +0 -0
  306. /package/{parts → terrier/parts}/terrier-form-part.ts +0 -0
  307. /package/{parts → terrier/parts}/terrier-part.ts +0 -0
  308. /package/{schema.ts → terrier/schema.ts} +0 -0
  309. /package/{sheets.ts → terrier/sheets.ts} +0 -0
  310. /package/{tabs.ts → terrier/tabs.ts} +0 -0
  311. /package/{theme.ts → terrier/theme.ts} +0 -0
  312. /package/{toasts.ts → terrier/toasts.ts} +0 -0
  313. /package/{tooltips.ts → terrier/tooltips.ts} +0 -0
@@ -0,0 +1,139 @@
1
+ import {ModalPart} from "../../terrier/modals"
2
+ import TerrierPart from "../../terrier/parts/terrier-part"
3
+ import {DdDiveGroup, UnpersistedDdDiveGroup} from "../gen/models"
4
+ import Db from "../dd-db"
5
+ import {PartTag} from "tuff-core/parts"
6
+ import {messages} from "tuff-core"
7
+ import {DbErrors} from "../../terrier/db-client"
8
+ import DdSession from "../dd-session"
9
+ import Nav from "tuff-core/nav"
10
+ import {routes} from "../dd-routes"
11
+ import {TerrierFormFields} from "../../terrier/forms"
12
+
13
+ class GroupForm extends TerrierPart<{ group: UnpersistedDdDiveGroup }> {
14
+
15
+ fields!: TerrierFormFields<UnpersistedDdDiveGroup>
16
+
17
+ async init() {
18
+ this.fields = new TerrierFormFields(this, this.state.group)
19
+ }
20
+
21
+ setErrors(errors: DbErrors<UnpersistedDdDiveGroup>) {
22
+ this.fields.errors = errors
23
+ this.dirty()
24
+ }
25
+
26
+ get parentClasses(): Array<string> {
27
+ return ['tt-form', 'tt-flex', 'column', 'gap', 'padded']
28
+ }
29
+
30
+ render(parent: PartTag): any {
31
+ this.fields.renderErrorBubble(parent)
32
+ parent.div('.tt-flex.collapsible.gap', row => {
33
+ row.div('.stretch', col => {
34
+ col.label().text("Name")
35
+ this.fields.textInput(col, 'name')
36
+ // col.label().text("Types")
37
+ // col.div('.tt-flex.gap', typeRow => {
38
+ // for (const type of DdDiveEnumFields.visibility)
39
+ // })
40
+ })
41
+ row.div('.stretch', col => {
42
+ col.label().text("Description")
43
+ this.fields.textArea(col, 'description_raw')
44
+ })
45
+ })
46
+ }
47
+
48
+ async serialize(): Promise<UnpersistedDdDiveGroup> {
49
+ return this.fields.serialize()
50
+ }
51
+
52
+ }
53
+
54
+
55
+ export type GroupModalState = {
56
+ session: DdSession
57
+ group: UnpersistedDdDiveGroup
58
+ callback: (group: DdDiveGroup) => any
59
+ }
60
+
61
+ export class GroupEditorModal extends ModalPart<GroupModalState> {
62
+
63
+ form!: GroupForm
64
+ saveKey = messages.untypedKey()
65
+ deleteKey = messages.untypedKey()
66
+
67
+ async init() {
68
+ const group = this.state.group
69
+ this.form = this.makePart(GroupForm, {group})
70
+
71
+ this.setTitle(group.id?.length ? "Edit Group" : "New Group")
72
+ this.setIcon('glyp-grouped')
73
+
74
+ this.addAction({
75
+ title: 'Save',
76
+ icon: 'glyp-checkmark',
77
+ click: {key: this.saveKey}
78
+ })
79
+
80
+ if (group.id?.length && this.state.session.isSuper) {
81
+ this.addAction({
82
+ title: 'Delete',
83
+ icon: 'glyp-delete',
84
+ classes: ['alert'],
85
+ click: {key: this.deleteKey}
86
+ }, 'secondary')
87
+ }
88
+
89
+ this.onClick(this.saveKey, _ => {
90
+ this.save()
91
+ })
92
+
93
+
94
+ this.onClick(this.deleteKey, async _ => {
95
+ this.app.confirm({
96
+ title: 'Delete this group?',
97
+ body: "Are you sure you want to delete this group?",
98
+ icon: 'glyp-delete'
99
+ }, () => {
100
+ this.delete()
101
+ })
102
+ })
103
+ }
104
+
105
+ renderContent(parent: PartTag): void {
106
+ parent.part(this.form)
107
+ }
108
+
109
+ async save() {
110
+ this.startLoading()
111
+ const unpersistedGroup = await this.form.serialize()
112
+ const res = await Db().upsert('dd_dive_group', unpersistedGroup)
113
+ this.stopLoading()
114
+ if (res.status == 'success') {
115
+ this.state.callback(res.record)
116
+ this.successToast(`Saved group ${res.record?.name}`)
117
+ this.pop()
118
+ }
119
+ else {
120
+ this.alertToast(`Error saving group: ${res.message}`)
121
+ this.form.setErrors(res.errors)
122
+ }
123
+ }
124
+
125
+ async delete() {
126
+ const group = {...this.state.group}
127
+ group._state = 2
128
+ const res = await Db().upsert('dd_dive_group', group)
129
+ if (res.status == 'success') {
130
+ this.pop()
131
+ this.successToast(`Deleted group ${group.name}`)
132
+ Nav.visit(routes.list.path({}))
133
+ } else {
134
+ this.form.setErrors(res.errors)
135
+ }
136
+ }
137
+
138
+
139
+ }
@@ -0,0 +1,192 @@
1
+ // This file was automatically generated, DO NOT EDIT IT MANUALLY!
2
+
3
+ import { Query } from "../queries/queries"
4
+
5
+ import { DdUser } from "../dd-user"
6
+
7
+ import { FilterInput } from "../queries/filters"
8
+
9
+ import { OptionalProps } from "tuff-core/types"
10
+
11
+ import { Attachment } from "../../terrier/attachments"
12
+
13
+ export type DdDive = {
14
+ id: string
15
+ created_at: string
16
+ updated_at: string
17
+ _state: number
18
+ created_by_id?: string
19
+ created_by_name: string
20
+ extern_id?: string
21
+ updated_by_id?: string
22
+ updated_by_name?: string
23
+ owner_id?: string
24
+ dd_dive_group_id?: string
25
+ name: string
26
+ description_raw?: string
27
+ description_html?: string
28
+ visibility: "public" | "private"
29
+ sort_order?: number
30
+ query_data?: { queries: Query[] }
31
+ dive_types: string[]
32
+ created_by?: DdUser
33
+ updated_by?: DdUser
34
+ dd_dive_group?: DdDiveGroup
35
+ dd_dive_runs?: DdDiveRun[]
36
+ owner?: DdUser
37
+ }
38
+
39
+ export type UnpersistedDdDive = {
40
+ id?: string
41
+ created_at?: string
42
+ updated_at?: string
43
+ _state?: number
44
+ created_by_id?: string
45
+ created_by_name?: string
46
+ extern_id?: string
47
+ updated_by_id?: string
48
+ updated_by_name?: string
49
+ owner_id?: string
50
+ dd_dive_group_id?: string
51
+ name: string
52
+ description_raw?: string
53
+ description_html?: string
54
+ visibility: "public" | "private"
55
+ sort_order?: number
56
+ query_data?: { queries: Query[] }
57
+ dive_types: string[]
58
+ created_by?: DdUser
59
+ updated_by?: DdUser
60
+ dd_dive_group?: DdDiveGroup
61
+ dd_dive_runs?: OptionalProps<UnpersistedDdDiveRun, "dd_dive_id">[]
62
+ owner?: DdUser
63
+ }
64
+
65
+ export const DdDiveEnumFields = {
66
+ visibility: ["public", "private"] as const,
67
+ }
68
+
69
+ export type DdDiveGroup = {
70
+ id: string
71
+ created_at: string
72
+ updated_at: string
73
+ _state: number
74
+ created_by_id?: string
75
+ created_by_name: string
76
+ extern_id?: string
77
+ updated_by_id?: string
78
+ updated_by_name?: string
79
+ name: string
80
+ icon?: string
81
+ description_raw?: string
82
+ description_html?: string
83
+ sort_order?: number
84
+ group_types: string[]
85
+ created_by?: DdUser
86
+ updated_by?: DdUser
87
+ dd_dives?: DdDive[]
88
+ }
89
+
90
+ export type UnpersistedDdDiveGroup = {
91
+ id?: string
92
+ created_at?: string
93
+ updated_at?: string
94
+ _state?: number
95
+ created_by_id?: string
96
+ created_by_name?: string
97
+ extern_id?: string
98
+ updated_by_id?: string
99
+ updated_by_name?: string
100
+ name: string
101
+ icon?: string
102
+ description_raw?: string
103
+ description_html?: string
104
+ sort_order?: number
105
+ group_types: string[]
106
+ created_by?: DdUser
107
+ updated_by?: DdUser
108
+ dd_dives?: OptionalProps<UnpersistedDdDive, "dd_dive_group_id">[]
109
+ }
110
+
111
+ export type DdDiveRun = {
112
+ id: string
113
+ created_at: string
114
+ updated_at: string
115
+ _state: number
116
+ created_by_id?: string
117
+ created_by_name: string
118
+ extern_id?: string
119
+ updated_by_id?: string
120
+ updated_by_name?: string
121
+ dd_dive_id?: string
122
+ input_data?: { queries: Query[]; filters: FilterInput[] }
123
+ output_data?: object
124
+ output_file_data?: Attachment | { path: string }
125
+ status: "initial" | "running" | "success" | "error"
126
+ created_by?: DdUser
127
+ updated_by?: DdUser
128
+ dd_dive?: DdDive
129
+ output_file?: File
130
+ }
131
+
132
+ export type UnpersistedDdDiveRun = {
133
+ id?: string
134
+ created_at?: string
135
+ updated_at?: string
136
+ _state?: number
137
+ created_by_id?: string
138
+ created_by_name?: string
139
+ extern_id?: string
140
+ updated_by_id?: string
141
+ updated_by_name?: string
142
+ dd_dive_id?: string
143
+ input_data?: { queries: Query[]; filters: FilterInput[] }
144
+ output_data?: object
145
+ output_file_data?: Attachment | { path: string }
146
+ status: "initial" | "running" | "success" | "error"
147
+ created_by?: DdUser
148
+ updated_by?: DdUser
149
+ dd_dive?: DdDive
150
+ output_file?: File
151
+ }
152
+
153
+ export const DdDiveRunEnumFields = {
154
+ status: ["initial", "running", "success", "error"] as const,
155
+ }
156
+
157
+ /**
158
+ * Map model names to their types.
159
+ */
160
+ export type PersistedModelTypeMap = {
161
+ dd_dive: DdDive
162
+ dd_dive_group: DdDiveGroup
163
+ dd_dive_run: DdDiveRun
164
+ }
165
+
166
+ /**
167
+ * Map model names to their unpersisted types.
168
+ */
169
+ export type UnpersistedModelTypeMap = {
170
+ dd_dive: UnpersistedDdDive
171
+ dd_dive_group: UnpersistedDdDiveGroup
172
+ dd_dive_run: UnpersistedDdDiveRun
173
+ }
174
+
175
+ /**
176
+ * Map model names to their association names.
177
+ */
178
+ export type ModelIncludesMap = {
179
+ dd_dive: "created_by" | "dd_dive_group" | "dd_dive_runs" | "owner" | "updated_by"
180
+ dd_dive_group: "created_by" | "dd_dives" | "updated_by"
181
+ dd_dive_run: "created_by" | "dd_dive" | "updated_by"
182
+ }
183
+
184
+ /**
185
+ * Map "sluggable" model names to their types
186
+ */
187
+ export type SluggableModelTypeMap = {}
188
+
189
+ /**
190
+ * A type consisting of all possible model names.
191
+ */
192
+ export type ModelName = keyof PersistedModelTypeMap & keyof UnpersistedModelTypeMap
@@ -0,0 +1,355 @@
1
+ import {PartTag} from "tuff-core/parts"
2
+ import {ColumnDef, ModelDef, SchemaDef} from "../../terrier/schema"
3
+ import {TableRef, TableView} from "./tables"
4
+ import {Logger} from "tuff-core/logging"
5
+ import {FormFields, SelectOptions} from "tuff-core/forms"
6
+ import Forms from "../../terrier/forms"
7
+ import {arrays, messages} from "tuff-core"
8
+ import Objects from "tuff-core/objects"
9
+ import {ModalPart} from "../../terrier/modals";
10
+ import TerrierFormPart from "../../terrier/parts/terrier-form-part"
11
+ import {Dropdown} from "../../terrier/dropdowns"
12
+
13
+ const log = new Logger("Columns")
14
+
15
+ ////////////////////////////////////////////////////////////////////////////////
16
+ // Types
17
+ ////////////////////////////////////////////////////////////////////////////////
18
+
19
+ /**
20
+ * Possible functions used to aggregate a column.
21
+ */
22
+ const AggFunctions = ['count', 'min', 'max'] as const
23
+
24
+ export type AggFunction = typeof AggFunctions[number]
25
+
26
+
27
+ /**
28
+ * Possible functions used to manipulate a date column.
29
+ */
30
+ const DateFunctions = ['year', 'month', 'day'] as const
31
+
32
+ export type DateFunction = typeof DateFunctions[number]
33
+
34
+ export type Function = AggFunction | DateFunction
35
+
36
+ /**
37
+ * @param fun a function name
38
+ * @return the type of function
39
+ */
40
+ function functionType(fun: Function): 'aggregate' | 'time' | undefined {
41
+ if (AggFunctions.includes(fun as AggFunction)) {
42
+ return 'aggregate'
43
+ }
44
+ else if (DateFunctions.includes(fun as DateFunction)) {
45
+ return 'time'
46
+ }
47
+ return undefined
48
+ }
49
+
50
+ /**
51
+ * A reference to a single column, possibly grouped or with a function applied
52
+ */
53
+ export type ColumnRef = {
54
+ name: string
55
+ alias?: string
56
+ grouped?: boolean
57
+ function?: AggFunction | DateFunction
58
+ }
59
+
60
+
61
+
62
+ ////////////////////////////////////////////////////////////////////////////////
63
+ // Rendering
64
+ ////////////////////////////////////////////////////////////////////////////////
65
+
66
+ function render(parent: PartTag, col: ColumnRef) {
67
+ if (col.grouped) {
68
+ parent.i('.glyp-grouped')
69
+ }
70
+ if (col.function?.length) {
71
+ parent.i(`.glyp-function`)
72
+ parent.div('.function').text(`${col.function}(<strong>${col.name}</strong>)`)
73
+ } else {
74
+ parent.div('.name').text(col.name)
75
+ }
76
+ if (col.alias?.length) {
77
+ parent.div('.as').text('as')
78
+ parent.div('.alias').text(col.alias)
79
+ }
80
+ }
81
+
82
+
83
+ ////////////////////////////////////////////////////////////////////////////////
84
+ // Editor
85
+ ////////////////////////////////////////////////////////////////////////////////
86
+
87
+ export type ColumnsEditorState = {
88
+ schema: SchemaDef
89
+ tableView: TableView<TableRef>
90
+ }
91
+
92
+ const saveKey = messages.untypedKey()
93
+ const addKey = messages.untypedKey()
94
+ const removeKey = messages.typedKey<{id: string}>()
95
+
96
+ /**
97
+ * A modal that lets the user edit the columns being referenced for a particular table.
98
+ */
99
+ export class ColumnsEditorModal extends ModalPart<ColumnsEditorState> {
100
+
101
+ modelDef!: ModelDef
102
+ table!: TableRef
103
+ columnStates: ColumnState[] = []
104
+ columnCount = 0
105
+
106
+ tableFields!: FormFields<TableRef>
107
+
108
+ updateColumnEditors() {
109
+ this.assignCollection('columns', ColumnEditor, this.columnStates)
110
+ }
111
+
112
+ addState(col: ColumnRef) {
113
+ this.columnCount += 1
114
+ this.columnStates.push({schema: this.state.schema, columnsEditor: this, id: `column-${this.columnCount}`, ...col})
115
+ }
116
+
117
+
118
+ async init () {
119
+ this.table = this.state.tableView.table
120
+ this.modelDef = this.state.tableView.modelDef
121
+
122
+ this.tableFields = new FormFields(this, {...this.table})
123
+
124
+ // initialize the columns states
125
+ const columns: ColumnRef[] = this.table.columns || []
126
+ for (const col of columns) {
127
+ this.addState(col)
128
+ }
129
+ this.updateColumnEditors()
130
+
131
+ this.setTitle(`Columns for ${this.state.tableView.displayName}`)
132
+ this.setIcon('glyp-columns')
133
+
134
+ this.addAction({
135
+ title: 'Apply',
136
+ icon: 'glyp-checkmark',
137
+ click: {key: saveKey}
138
+ }, 'primary')
139
+
140
+ this.addAction({
141
+ title: 'Add Columns',
142
+ icon: 'glyp-plus',
143
+ click: {key: addKey}
144
+ }, 'secondary')
145
+
146
+ this.onClick(saveKey, _ => {
147
+ this.save()
148
+ })
149
+
150
+ this.onClick(removeKey, m => {
151
+ this.removeColumn(m.data.id)
152
+ })
153
+
154
+ this.onClick(addKey, m => {
155
+ const onSelected = (columns: string[]) => {
156
+ log.info(`Adding ${columns.length} columns`, columns)
157
+ for (const col of columns) {
158
+ const colDef = this.modelDef.columns[col]
159
+ if (colDef) {
160
+ this.addState({name: colDef.name})
161
+ }
162
+ }
163
+ this.updateColumnEditors()
164
+ }
165
+ this.toggleDropdown(SelectColumnsDropdown, {modelDef: this.modelDef, callback: onSelected}, m.event.target)
166
+ })
167
+ }
168
+
169
+ renderContent(parent: PartTag): void {
170
+ parent.div('.tt-flex.tt-form.padded.gap.justify-end.align-center', row => {
171
+ row.div('.tt-compound-field', field => {
172
+ field.label().text("Prefix:")
173
+ this.tableFields.textInput(field, 'prefix')
174
+ })
175
+ row.div('.stretch').text("All columns will be prefixed with this")
176
+ })
177
+ parent.div('.dd-columns-editor-table', table => {
178
+ table.div('.dd-editor-header', header => {
179
+ header.div('.name').label({text: "Name"})
180
+ header.div('.alias').label({text: "Alias"})
181
+ header.div('.function').label({text: "Function"})
182
+ header.div('.group-by').label({text: "Group By?"})
183
+ })
184
+ this.renderCollection(table, 'columns')
185
+ .class('dd-editor-row-container')
186
+ })
187
+ }
188
+
189
+ removeColumn(id: string) {
190
+ const col = arrays.find(this.columnStates, c => c.id == id)
191
+ if (col) {
192
+ this.columnStates = arrays.without(this.columnStates, col)
193
+ this.updateColumnEditors()
194
+ }
195
+ }
196
+
197
+ async save() {
198
+ const columns = this.columnStates.map(state => {
199
+ return Objects.omit(state, 'schema', 'columnsEditor', 'id') as ColumnRef
200
+ })
201
+ const tableData = await this.tableFields.serialize()
202
+ this.state.tableView.updateColumns(columns, tableData.prefix)
203
+ this.pop()
204
+ }
205
+
206
+ }
207
+
208
+ type ColumnState = ColumnRef & {
209
+ schema: SchemaDef
210
+ columnsEditor: ColumnsEditorModal
211
+ id: string
212
+ }
213
+
214
+ /**
215
+ * An editor row for an individual column.
216
+ */
217
+ class ColumnEditor extends TerrierFormPart<ColumnState> {
218
+
219
+ schema!: SchemaDef
220
+ modelDef!: ModelDef
221
+ columnDef!: ColumnDef
222
+
223
+ functionOptions!: SelectOptions
224
+
225
+ async init() {
226
+ this.schema = this.state.schema
227
+ this.modelDef = this.state.columnsEditor.modelDef
228
+ this.columnDef = this.modelDef.columns[this.state.name]
229
+ log.info(`Column ${this.state.name} definition:`, this.columnDef)
230
+
231
+ let funcs = Array.from<string>(AggFunctions)
232
+ if (this.columnDef.type == 'date' || this.columnDef.type.includes('time')) {
233
+ funcs = funcs.concat(Array.from(DateFunctions))
234
+ }
235
+ this.functionOptions = Forms.titleizeOptions(funcs, '')
236
+ }
237
+
238
+ get parentClasses(): Array<string> {
239
+ return super.parentClasses.concat(['dd-editor-row'])
240
+ }
241
+
242
+ render(parent: PartTag) {
243
+ parent.div('.name', col => {
244
+ col.div('.tt-readonly-field', {text: this.state.name})
245
+ })
246
+ parent.div('.alias', col => {
247
+ this.textInput(col, "alias", {placeholder: "Alias"})
248
+ })
249
+ parent.div('.function', col => {
250
+ this.select(col, "function", this.functionOptions)
251
+ })
252
+ parent.div('.group-by', col => {
253
+ this.checkbox(col, "grouped")
254
+ })
255
+ parent.div('.actions', actions => {
256
+ actions.a(a => {
257
+ a.i('.glyp-close')
258
+ }).emitClick(removeKey, {id: this.state.id})
259
+ })
260
+ }
261
+
262
+ }
263
+
264
+
265
+ ////////////////////////////////////////////////////////////////////////////////
266
+ // Add Column Dropdown
267
+ ////////////////////////////////////////////////////////////////////////////////
268
+
269
+ const checkAllKey = messages.untypedKey()
270
+ const applySelectionKey = messages.untypedKey()
271
+ const checkChangedKey = messages.typedKey<{column: string}>()
272
+
273
+ type SelectColumnsCallback = (columns: string[]) => any
274
+
275
+ /**
276
+ * Shows a dropdown that allows the user to select one or more columns from the given model.
277
+ */
278
+ class SelectColumnsDropdown extends Dropdown<{modelDef: ModelDef, callback: SelectColumnsCallback}> {
279
+
280
+ checked: Set<string> = new Set()
281
+ columns!: string[]
282
+
283
+ async init() {
284
+ this.columns = Object.keys(this.state.modelDef.columns).sort()
285
+
286
+ this.onClick(checkAllKey, _ => {
287
+ // toggle them all being checked
288
+ const trues = Object.values(this.checked).filter(b => b)
289
+ if (trues.length > this.columns.length / 2) {
290
+ this.checked = new Set()
291
+ }
292
+ else {
293
+ for (const c of this.columns) {
294
+ this.checked.add(c)
295
+ }
296
+ }
297
+ this.dirty()
298
+ })
299
+
300
+ this.onClick(applySelectionKey, _ => {
301
+ this.state.callback(Array.from(this.checked))
302
+ this.clear()
303
+ })
304
+
305
+ this.onChange(checkChangedKey, m => {
306
+ const col = m.data.column
307
+ const checked = (m.event.target as HTMLInputElement).checked
308
+ log.info(`Column '${col}' checkbox changed to`, checked)
309
+ if (checked) {
310
+ this.checked.add(col)
311
+ }
312
+ else {
313
+ this.checked.delete(col)
314
+ }
315
+ })
316
+ }
317
+
318
+
319
+ get parentClasses(): Array<string> {
320
+ return super.parentClasses.concat(['dd-select-columns-dropdown']);
321
+ }
322
+
323
+ renderContent(parent: PartTag) {
324
+ parent.a(a => {
325
+ a.i('.glyp-check_all')
326
+ a.span({text: "Toggle All"})
327
+ }).emitClick(checkAllKey)
328
+
329
+ for (const col of this.columns) {
330
+ parent.label(label => {
331
+ label.input({type: 'checkbox', checked: this.checked.has(col)})
332
+ .emitChange(checkChangedKey, {column: col})
333
+ label.div().text(col)
334
+ })
335
+ }
336
+
337
+ parent.a('.add', a => {
338
+ a.i('.glyp-checkmark')
339
+ a.span({text: "Add Selected"})
340
+ }).emitClick(applySelectionKey)
341
+ }
342
+
343
+ }
344
+
345
+
346
+ ////////////////////////////////////////////////////////////////////////////////
347
+ // Export
348
+ ////////////////////////////////////////////////////////////////////////////////
349
+
350
+ const Columns = {
351
+ render,
352
+ functionType
353
+ }
354
+
355
+ export default Columns