terrier-engine 4.3.3 → 4.4.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 (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/tsconfig.json +21 -0
  23. /package/{README.md → terrier/README.md} +0 -0
  24. /package/{api.ts → terrier/api.ts} +0 -0
  25. /package/{app.ts → terrier/app.ts} +0 -0
  26. /package/{attachments.ts → terrier/attachments.ts} +0 -0
  27. /package/{db-client.ts → terrier/db-client.ts} +0 -0
  28. /package/{dropdowns.ts → terrier/dropdowns.ts} +0 -0
  29. /package/{format.ts → terrier/format.ts} +0 -0
  30. /package/{forms.ts → terrier/forms.ts} +0 -0
  31. /package/{fragments.ts → terrier/fragments.ts} +0 -0
  32. /package/{gen → terrier/gen}/hub-icons.ts +0 -0
  33. /package/{glyps.ts → terrier/glyps.ts} +0 -0
  34. /package/{ids.ts → terrier/ids.ts} +0 -0
  35. /package/{images → terrier/images}/icons/active.svg +0 -0
  36. /package/{images → terrier/images}/icons/admin.svg +0 -0
  37. /package/{images → terrier/images}/icons/archive.svg +0 -0
  38. /package/{images → terrier/images}/icons/arrow_down.svg +0 -0
  39. /package/{images → terrier/images}/icons/arrow_left.svg +0 -0
  40. /package/{images → terrier/images}/icons/arrow_right.svg +0 -0
  41. /package/{images → terrier/images}/icons/arrow_up.svg +0 -0
  42. /package/{images → terrier/images}/icons/assign.svg +0 -0
  43. /package/{images → terrier/images}/icons/attachment.svg +0 -0
  44. /package/{images → terrier/images}/icons/back.svg +0 -0
  45. /package/{images → terrier/images}/icons/badge.svg +0 -0
  46. /package/{images → terrier/images}/icons/board.svg +0 -0
  47. /package/{images → terrier/images}/icons/branch.svg +0 -0
  48. /package/{images → terrier/images}/icons/bug.svg +0 -0
  49. /package/{images → terrier/images}/icons/calculator.svg +0 -0
  50. /package/{images → terrier/images}/icons/checkmark.svg +0 -0
  51. /package/{images → terrier/images}/icons/close.svg +0 -0
  52. /package/{images → terrier/images}/icons/clypboard.svg +0 -0
  53. /package/{images → terrier/images}/icons/comment.svg +0 -0
  54. /package/{images → terrier/images}/icons/complete.svg +0 -0
  55. /package/{images → terrier/images}/icons/dashboard.svg +0 -0
  56. /package/{images → terrier/images}/icons/data_pull.svg +0 -0
  57. /package/{images → terrier/images}/icons/data_update.svg +0 -0
  58. /package/{images → terrier/images}/icons/database.svg +0 -0
  59. /package/{images → terrier/images}/icons/day.svg +0 -0
  60. /package/{images → terrier/images}/icons/delete.svg +0 -0
  61. /package/{images → terrier/images}/icons/documentation.svg +0 -0
  62. /package/{images → terrier/images}/icons/edit.svg +0 -0
  63. /package/{images → terrier/images}/icons/feature.svg +0 -0
  64. /package/{images → terrier/images}/icons/flex.svg +0 -0
  65. /package/{images → terrier/images}/icons/forward.svg +0 -0
  66. /package/{images → terrier/images}/icons/github.svg +0 -0
  67. /package/{images → terrier/images}/icons/history.svg +0 -0
  68. /package/{images → terrier/images}/icons/home.svg +0 -0
  69. /package/{images → terrier/images}/icons/image.svg +0 -0
  70. /package/{images → terrier/images}/icons/inbox.svg +0 -0
  71. /package/{images → terrier/images}/icons/info.svg +0 -0
  72. /package/{images → terrier/images}/icons/issue.svg +0 -0
  73. /package/{images → terrier/images}/icons/lane.svg +0 -0
  74. /package/{images → terrier/images}/icons/lane_asap.svg +0 -0
  75. /package/{images → terrier/images}/icons/lane_days.svg +0 -0
  76. /package/{images → terrier/images}/icons/lane_hours.svg +0 -0
  77. /package/{images → terrier/images}/icons/lane_weeks.svg +0 -0
  78. /package/{images → terrier/images}/icons/lanes_board.svg +0 -0
  79. /package/{images → terrier/images}/icons/level_complete.svg +0 -0
  80. /package/{images → terrier/images}/icons/level_highway.svg +0 -0
  81. /package/{images → terrier/images}/icons/level_on_ramp.svg +0 -0
  82. /package/{images → terrier/images}/icons/level_parking.svg +0 -0
  83. /package/{images → terrier/images}/icons/minus.svg +0 -0
  84. /package/{images → terrier/images}/icons/night.svg +0 -0
  85. /package/{images → terrier/images}/icons/origin.svg +0 -0
  86. /package/{images → terrier/images}/icons/pending.svg +0 -0
  87. /package/{images → terrier/images}/icons/plus.svg +0 -0
  88. /package/{images → terrier/images}/icons/post.svg +0 -0
  89. /package/{images → terrier/images}/icons/pr_closed.svg +0 -0
  90. /package/{images → terrier/images}/icons/pr_merged.svg +0 -0
  91. /package/{images → terrier/images}/icons/pr_open.svg +0 -0
  92. /package/{images → terrier/images}/icons/prioritized.svg +0 -0
  93. /package/{images → terrier/images}/icons/project.svg +0 -0
  94. /package/{images → terrier/images}/icons/question.svg +0 -0
  95. /package/{images → terrier/images}/icons/reaction.svg +0 -0
  96. /package/{images → terrier/images}/icons/recent.svg +0 -0
  97. /package/{images → terrier/images}/icons/refresh.svg +0 -0
  98. /package/{images → terrier/images}/icons/request.svg +0 -0
  99. /package/{images → terrier/images}/icons/settings.svg +0 -0
  100. /package/{images → terrier/images}/icons/status.svg +0 -0
  101. /package/{images → terrier/images}/icons/step_deploy.svg +0 -0
  102. /package/{images → terrier/images}/icons/step_develop.svg +0 -0
  103. /package/{images → terrier/images}/icons/step_investigate.svg +0 -0
  104. /package/{images → terrier/images}/icons/step_review.svg +0 -0
  105. /package/{images → terrier/images}/icons/step_test.svg +0 -0
  106. /package/{images → terrier/images}/icons/steps.svg +0 -0
  107. /package/{images → terrier/images}/icons/steps_board.svg +0 -0
  108. /package/{images → terrier/images}/icons/subscribe.svg +0 -0
  109. /package/{images → terrier/images}/icons/support.svg +0 -0
  110. /package/{images → terrier/images}/icons/terrier.svg +0 -0
  111. /package/{images → terrier/images}/icons/thumbs_up.svg +0 -0
  112. /package/{images → terrier/images}/icons/type.svg +0 -0
  113. /package/{images → terrier/images}/icons/unprioritized.svg +0 -0
  114. /package/{images → terrier/images}/icons/upload.svg +0 -0
  115. /package/{images → terrier/images}/icons/user.svg +0 -0
  116. /package/{images → terrier/images}/icons/users.svg +0 -0
  117. /package/{images → terrier/images}/optimized/icon-active.svg +0 -0
  118. /package/{images → terrier/images}/optimized/icon-admin.svg +0 -0
  119. /package/{images → terrier/images}/optimized/icon-archive.svg +0 -0
  120. /package/{images → terrier/images}/optimized/icon-arrow_down.svg +0 -0
  121. /package/{images → terrier/images}/optimized/icon-arrow_left.svg +0 -0
  122. /package/{images → terrier/images}/optimized/icon-arrow_right.svg +0 -0
  123. /package/{images → terrier/images}/optimized/icon-arrow_up.svg +0 -0
  124. /package/{images → terrier/images}/optimized/icon-assign.svg +0 -0
  125. /package/{images → terrier/images}/optimized/icon-attachment.svg +0 -0
  126. /package/{images → terrier/images}/optimized/icon-back.svg +0 -0
  127. /package/{images → terrier/images}/optimized/icon-badge.svg +0 -0
  128. /package/{images → terrier/images}/optimized/icon-board.svg +0 -0
  129. /package/{images → terrier/images}/optimized/icon-branch.svg +0 -0
  130. /package/{images → terrier/images}/optimized/icon-bug.svg +0 -0
  131. /package/{images → terrier/images}/optimized/icon-calculator.svg +0 -0
  132. /package/{images → terrier/images}/optimized/icon-checkmark.svg +0 -0
  133. /package/{images → terrier/images}/optimized/icon-close.svg +0 -0
  134. /package/{images → terrier/images}/optimized/icon-clypboard.svg +0 -0
  135. /package/{images → terrier/images}/optimized/icon-comment.svg +0 -0
  136. /package/{images → terrier/images}/optimized/icon-complete.svg +0 -0
  137. /package/{images → terrier/images}/optimized/icon-dashboard.svg +0 -0
  138. /package/{images → terrier/images}/optimized/icon-data_pull.svg +0 -0
  139. /package/{images → terrier/images}/optimized/icon-data_update.svg +0 -0
  140. /package/{images → terrier/images}/optimized/icon-database.svg +0 -0
  141. /package/{images → terrier/images}/optimized/icon-day.svg +0 -0
  142. /package/{images → terrier/images}/optimized/icon-delete.svg +0 -0
  143. /package/{images → terrier/images}/optimized/icon-documentation.svg +0 -0
  144. /package/{images → terrier/images}/optimized/icon-edit.svg +0 -0
  145. /package/{images → terrier/images}/optimized/icon-feature.svg +0 -0
  146. /package/{images → terrier/images}/optimized/icon-flex.svg +0 -0
  147. /package/{images → terrier/images}/optimized/icon-forward.svg +0 -0
  148. /package/{images → terrier/images}/optimized/icon-github.svg +0 -0
  149. /package/{images → terrier/images}/optimized/icon-history.svg +0 -0
  150. /package/{images → terrier/images}/optimized/icon-home.svg +0 -0
  151. /package/{images → terrier/images}/optimized/icon-image.svg +0 -0
  152. /package/{images → terrier/images}/optimized/icon-inbox.svg +0 -0
  153. /package/{images → terrier/images}/optimized/icon-info.svg +0 -0
  154. /package/{images → terrier/images}/optimized/icon-issue.svg +0 -0
  155. /package/{images → terrier/images}/optimized/icon-lane.svg +0 -0
  156. /package/{images → terrier/images}/optimized/icon-lane_asap.svg +0 -0
  157. /package/{images → terrier/images}/optimized/icon-lane_days.svg +0 -0
  158. /package/{images → terrier/images}/optimized/icon-lane_hours.svg +0 -0
  159. /package/{images → terrier/images}/optimized/icon-lane_weeks.svg +0 -0
  160. /package/{images → terrier/images}/optimized/icon-lanes_board.svg +0 -0
  161. /package/{images → terrier/images}/optimized/icon-level_complete.svg +0 -0
  162. /package/{images → terrier/images}/optimized/icon-level_highway.svg +0 -0
  163. /package/{images → terrier/images}/optimized/icon-level_on_ramp.svg +0 -0
  164. /package/{images → terrier/images}/optimized/icon-level_parking.svg +0 -0
  165. /package/{images → terrier/images}/optimized/icon-minus.svg +0 -0
  166. /package/{images → terrier/images}/optimized/icon-night.svg +0 -0
  167. /package/{images → terrier/images}/optimized/icon-origin.svg +0 -0
  168. /package/{images → terrier/images}/optimized/icon-pending.svg +0 -0
  169. /package/{images → terrier/images}/optimized/icon-plus.svg +0 -0
  170. /package/{images → terrier/images}/optimized/icon-post.svg +0 -0
  171. /package/{images → terrier/images}/optimized/icon-pr_closed.svg +0 -0
  172. /package/{images → terrier/images}/optimized/icon-pr_merged.svg +0 -0
  173. /package/{images → terrier/images}/optimized/icon-pr_open.svg +0 -0
  174. /package/{images → terrier/images}/optimized/icon-prioritized.svg +0 -0
  175. /package/{images → terrier/images}/optimized/icon-project.svg +0 -0
  176. /package/{images → terrier/images}/optimized/icon-question.svg +0 -0
  177. /package/{images → terrier/images}/optimized/icon-reaction.svg +0 -0
  178. /package/{images → terrier/images}/optimized/icon-recent.svg +0 -0
  179. /package/{images → terrier/images}/optimized/icon-refresh.svg +0 -0
  180. /package/{images → terrier/images}/optimized/icon-request.svg +0 -0
  181. /package/{images → terrier/images}/optimized/icon-settings.svg +0 -0
  182. /package/{images → terrier/images}/optimized/icon-status.svg +0 -0
  183. /package/{images → terrier/images}/optimized/icon-step_deploy.svg +0 -0
  184. /package/{images → terrier/images}/optimized/icon-step_develop.svg +0 -0
  185. /package/{images → terrier/images}/optimized/icon-step_investigate.svg +0 -0
  186. /package/{images → terrier/images}/optimized/icon-step_review.svg +0 -0
  187. /package/{images → terrier/images}/optimized/icon-step_test.svg +0 -0
  188. /package/{images → terrier/images}/optimized/icon-steps.svg +0 -0
  189. /package/{images → terrier/images}/optimized/icon-steps_board.svg +0 -0
  190. /package/{images → terrier/images}/optimized/icon-subscribe.svg +0 -0
  191. /package/{images → terrier/images}/optimized/icon-support.svg +0 -0
  192. /package/{images → terrier/images}/optimized/icon-terrier.svg +0 -0
  193. /package/{images → terrier/images}/optimized/icon-thumbs_up.svg +0 -0
  194. /package/{images → terrier/images}/optimized/icon-type.svg +0 -0
  195. /package/{images → terrier/images}/optimized/icon-unprioritized.svg +0 -0
  196. /package/{images → terrier/images}/optimized/icon-upload.svg +0 -0
  197. /package/{images → terrier/images}/optimized/icon-user.svg +0 -0
  198. /package/{images → terrier/images}/optimized/icon-users.svg +0 -0
  199. /package/{images → terrier/images}/optimized/terrier-hub-favicon.svg +0 -0
  200. /package/{images → terrier/images}/optimized/terrier-hub-icon-dark.svg +0 -0
  201. /package/{images → terrier/images}/optimized/terrier-hub-icon-light.svg +0 -0
  202. /package/{images → terrier/images}/optimized/terrier-hub-loader.svg +0 -0
  203. /package/{images → terrier/images}/optimized/terrier-hub-logo-dark.svg +0 -0
  204. /package/{images → terrier/images}/optimized/terrier-hub-logo-light.svg +0 -0
  205. /package/{images → terrier/images}/raw/icon-active.svg +0 -0
  206. /package/{images → terrier/images}/raw/icon-admin.svg +0 -0
  207. /package/{images → terrier/images}/raw/icon-archive.svg +0 -0
  208. /package/{images → terrier/images}/raw/icon-arrow_down.svg +0 -0
  209. /package/{images → terrier/images}/raw/icon-arrow_left.svg +0 -0
  210. /package/{images → terrier/images}/raw/icon-arrow_right.svg +0 -0
  211. /package/{images → terrier/images}/raw/icon-arrow_up.svg +0 -0
  212. /package/{images → terrier/images}/raw/icon-assign.svg +0 -0
  213. /package/{images → terrier/images}/raw/icon-attachment.svg +0 -0
  214. /package/{images → terrier/images}/raw/icon-back.svg +0 -0
  215. /package/{images → terrier/images}/raw/icon-badge.svg +0 -0
  216. /package/{images → terrier/images}/raw/icon-board.svg +0 -0
  217. /package/{images → terrier/images}/raw/icon-branch.svg +0 -0
  218. /package/{images → terrier/images}/raw/icon-bug.svg +0 -0
  219. /package/{images → terrier/images}/raw/icon-calculator.svg +0 -0
  220. /package/{images → terrier/images}/raw/icon-checkmark.svg +0 -0
  221. /package/{images → terrier/images}/raw/icon-close.svg +0 -0
  222. /package/{images → terrier/images}/raw/icon-clypboard.svg +0 -0
  223. /package/{images → terrier/images}/raw/icon-comment.svg +0 -0
  224. /package/{images → terrier/images}/raw/icon-complete.svg +0 -0
  225. /package/{images → terrier/images}/raw/icon-dashboard.svg +0 -0
  226. /package/{images → terrier/images}/raw/icon-data_pull.svg +0 -0
  227. /package/{images → terrier/images}/raw/icon-data_update.svg +0 -0
  228. /package/{images → terrier/images}/raw/icon-database.svg +0 -0
  229. /package/{images → terrier/images}/raw/icon-day.svg +0 -0
  230. /package/{images → terrier/images}/raw/icon-delete.svg +0 -0
  231. /package/{images → terrier/images}/raw/icon-documentation.svg +0 -0
  232. /package/{images → terrier/images}/raw/icon-edit.svg +0 -0
  233. /package/{images → terrier/images}/raw/icon-feature.svg +0 -0
  234. /package/{images → terrier/images}/raw/icon-flex.svg +0 -0
  235. /package/{images → terrier/images}/raw/icon-forward.svg +0 -0
  236. /package/{images → terrier/images}/raw/icon-github.svg +0 -0
  237. /package/{images → terrier/images}/raw/icon-history.svg +0 -0
  238. /package/{images → terrier/images}/raw/icon-home.svg +0 -0
  239. /package/{images → terrier/images}/raw/icon-image.svg +0 -0
  240. /package/{images → terrier/images}/raw/icon-inbox.svg +0 -0
  241. /package/{images → terrier/images}/raw/icon-info.svg +0 -0
  242. /package/{images → terrier/images}/raw/icon-issue.svg +0 -0
  243. /package/{images → terrier/images}/raw/icon-lane.svg +0 -0
  244. /package/{images → terrier/images}/raw/icon-lane_asap.svg +0 -0
  245. /package/{images → terrier/images}/raw/icon-lane_days.svg +0 -0
  246. /package/{images → terrier/images}/raw/icon-lane_hours.svg +0 -0
  247. /package/{images → terrier/images}/raw/icon-lane_weeks.svg +0 -0
  248. /package/{images → terrier/images}/raw/icon-lanes_board.svg +0 -0
  249. /package/{images → terrier/images}/raw/icon-level_complete.svg +0 -0
  250. /package/{images → terrier/images}/raw/icon-level_highway.svg +0 -0
  251. /package/{images → terrier/images}/raw/icon-level_on_ramp.svg +0 -0
  252. /package/{images → terrier/images}/raw/icon-level_parking.svg +0 -0
  253. /package/{images → terrier/images}/raw/icon-minus.svg +0 -0
  254. /package/{images → terrier/images}/raw/icon-night.svg +0 -0
  255. /package/{images → terrier/images}/raw/icon-origin.svg +0 -0
  256. /package/{images → terrier/images}/raw/icon-pending.svg +0 -0
  257. /package/{images → terrier/images}/raw/icon-plus.svg +0 -0
  258. /package/{images → terrier/images}/raw/icon-post.svg +0 -0
  259. /package/{images → terrier/images}/raw/icon-pr_closed.svg +0 -0
  260. /package/{images → terrier/images}/raw/icon-pr_merged.svg +0 -0
  261. /package/{images → terrier/images}/raw/icon-pr_open.svg +0 -0
  262. /package/{images → terrier/images}/raw/icon-prioritized.svg +0 -0
  263. /package/{images → terrier/images}/raw/icon-project.svg +0 -0
  264. /package/{images → terrier/images}/raw/icon-question.svg +0 -0
  265. /package/{images → terrier/images}/raw/icon-reaction.svg +0 -0
  266. /package/{images → terrier/images}/raw/icon-recent.svg +0 -0
  267. /package/{images → terrier/images}/raw/icon-refresh.svg +0 -0
  268. /package/{images → terrier/images}/raw/icon-request.svg +0 -0
  269. /package/{images → terrier/images}/raw/icon-settings.svg +0 -0
  270. /package/{images → terrier/images}/raw/icon-status.svg +0 -0
  271. /package/{images → terrier/images}/raw/icon-step_deploy.svg +0 -0
  272. /package/{images → terrier/images}/raw/icon-step_develop.svg +0 -0
  273. /package/{images → terrier/images}/raw/icon-step_investigate.svg +0 -0
  274. /package/{images → terrier/images}/raw/icon-step_review.svg +0 -0
  275. /package/{images → terrier/images}/raw/icon-step_test.svg +0 -0
  276. /package/{images → terrier/images}/raw/icon-steps.svg +0 -0
  277. /package/{images → terrier/images}/raw/icon-steps_board.svg +0 -0
  278. /package/{images → terrier/images}/raw/icon-subscribe.svg +0 -0
  279. /package/{images → terrier/images}/raw/icon-support.svg +0 -0
  280. /package/{images → terrier/images}/raw/icon-terrier.svg +0 -0
  281. /package/{images → terrier/images}/raw/icon-thumbs_up.svg +0 -0
  282. /package/{images → terrier/images}/raw/icon-type.svg +0 -0
  283. /package/{images → terrier/images}/raw/icon-unprioritized.svg +0 -0
  284. /package/{images → terrier/images}/raw/icon-upload.svg +0 -0
  285. /package/{images → terrier/images}/raw/icon-user.svg +0 -0
  286. /package/{images → terrier/images}/raw/icon-users.svg +0 -0
  287. /package/{images → terrier/images}/raw/terrier-hub-favicon-alert.png +0 -0
  288. /package/{images → terrier/images}/raw/terrier-hub-favicon-dark.png +0 -0
  289. /package/{images → terrier/images}/raw/terrier-hub-favicon.png +0 -0
  290. /package/{images → terrier/images}/raw/terrier-hub-favicon.svg +0 -0
  291. /package/{images → terrier/images}/raw/terrier-hub-icon-dark.svg +0 -0
  292. /package/{images → terrier/images}/raw/terrier-hub-icon-light.png +0 -0
  293. /package/{images → terrier/images}/raw/terrier-hub-icon-light.svg +0 -0
  294. /package/{images → terrier/images}/raw/terrier-hub-loader.svg +0 -0
  295. /package/{images → terrier/images}/raw/terrier-hub-logo-dark.svg +0 -0
  296. /package/{images → terrier/images}/raw/terrier-hub-logo-light.png +0 -0
  297. /package/{images → terrier/images}/raw/terrier-hub-logo-light.svg +0 -0
  298. /package/{lightbox.ts → terrier/lightbox.ts} +0 -0
  299. /package/{loading.ts → terrier/loading.ts} +0 -0
  300. /package/{modals.ts → terrier/modals.ts} +0 -0
  301. /package/{overlays.ts → terrier/overlays.ts} +0 -0
  302. /package/{parts → terrier/parts}/content-part.ts +0 -0
  303. /package/{parts → terrier/parts}/not-found-page.ts +0 -0
  304. /package/{parts → terrier/parts}/page-part.ts +0 -0
  305. /package/{parts → terrier/parts}/panel-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,286 @@
1
+ import inflection from "inflection"
2
+ import dayjs from "dayjs"
3
+ import {Dropdown} from "../../terrier/dropdowns"
4
+ import {PartTag} from "tuff-core/parts"
5
+ import {messages} from "tuff-core"
6
+ import {Logger} from "tuff-core/logging"
7
+
8
+ const log = new Logger("Dates")
9
+
10
+
11
+ ////////////////////////////////////////////////////////////////////////////////
12
+ // Types
13
+ ////////////////////////////////////////////////////////////////////////////////
14
+
15
+ type d = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
16
+ type YYYY = `19${d}${d}` | `20${d}${d}`
17
+ type oneToNine = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
18
+ type MM = `0${oneToNine}` | `1${0 | 1 | 2}`
19
+ type DD = `${0}${oneToNine}` | `${1 | 2}${d}` | `3${0 | 1}`
20
+
21
+ /**
22
+ * YYYY-MM month literal.
23
+ */
24
+ export type MonthLiteral = `${YYYY}-${MM}`
25
+
26
+ /**
27
+ * YYYY-MM-DD date literal.
28
+ */
29
+ export type DateLiteral = `${MonthLiteral}-${DD}`
30
+
31
+
32
+ /**
33
+ * A date range described by literal start and end dates.
34
+ * NOTE: date ranges are always stored with the max being *exclusive*,
35
+ * but should be displayed as *inclusive*.
36
+ */
37
+ export type LiteralDateRange = {
38
+ min: DateLiteral
39
+ max: DateLiteral
40
+ }
41
+
42
+
43
+ const virtualPeriods = ['day', 'week', 'month', 'year'] as const
44
+
45
+ export type VirtualDatePeriod = typeof virtualPeriods[number]
46
+
47
+ /**
48
+ * A date range that's relative to the current date.
49
+ */
50
+ export type VirtualDateRange = {
51
+ period: VirtualDatePeriod
52
+ relative: number
53
+ }
54
+
55
+ export type DateRange = LiteralDateRange | VirtualDateRange
56
+
57
+
58
+ ////////////////////////////////////////////////////////////////////////////////
59
+ // Display
60
+ ////////////////////////////////////////////////////////////////////////////////
61
+
62
+ /**
63
+ * Format used for displaying dates to the user.
64
+ */
65
+ const displayFormat = 'MM/DD/YY'
66
+
67
+ /**
68
+ * Format used for storing dates.
69
+ */
70
+ const literalFormat = 'YYYY-MM-DD'
71
+
72
+ /**
73
+ * Formats the date literal into a human-friendly string.
74
+ * @param date
75
+ */
76
+ function display(date: DateLiteral): string {
77
+ return dayjs(date).format(displayFormat)
78
+ }
79
+
80
+ /**
81
+ * Computes a string that describes the given date range in human terms.
82
+ * @param range
83
+ */
84
+ function rangeDisplay(range: DateRange): string {
85
+ if ('min' in range) { // literal range
86
+ // special case for a single day
87
+ const dMin = dayjs(range.min)
88
+ if (range.max == dMin.add(1, 'day').format(literalFormat)) {
89
+ return dMin.format(displayFormat)
90
+ }
91
+ const max = dayjs(range.max).subtract(1, 'day').format(displayFormat)
92
+ return `${display(range.min)} - ${max}`
93
+ } else if ('period' in range) { // virtual range
94
+ // special day names
95
+ if (range.period == 'day') {
96
+ switch (range.relative) {
97
+ case 0:
98
+ return 'Today'
99
+ case -1:
100
+ return 'Yesterday'
101
+ case 1:
102
+ return 'Tomorrow'
103
+ }
104
+ }
105
+ if (range.relative == 0) {
106
+ return `This ${range.period}`
107
+ }
108
+ if (range.relative == -1) {
109
+ return `Last ${range.period}`
110
+ }
111
+ if (range.relative == 1) {
112
+ return `Next ${range.period}`
113
+ }
114
+ const plural = inflection.pluralize(range.period)
115
+ if (range.relative < 0) {
116
+ return `${range.relative*-1} ${plural} ago`
117
+ } else {
118
+ return `${range.relative} ${plural} from now`
119
+ }
120
+ } else {
121
+ return "Unknown Date Range"
122
+ }
123
+ }
124
+
125
+
126
+ ////////////////////////////////////////////////////////////////////////////////
127
+ // Calculation
128
+ ////////////////////////////////////////////////////////////////////////////////
129
+
130
+ /**
131
+ * Creates a literal date range based on a virtual one, relative to `today`
132
+ * @param range a virtual date range to materialize
133
+ * @param today the anchor for the relative range
134
+ */
135
+ function materializeVirtualRange(range: VirtualDateRange, today?: DateLiteral): LiteralDateRange {
136
+ const d = dayjs(today)
137
+ const min = d.add(range.relative, range.period).startOf(range.period)
138
+ const max = min.add(1, range.period)
139
+ return {
140
+ min: min.format(literalFormat) as DateLiteral,
141
+ max: max.format(literalFormat) as DateLiteral
142
+ }
143
+ }
144
+
145
+
146
+ ////////////////////////////////////////////////////////////////////////////////
147
+ // Periods
148
+ ////////////////////////////////////////////////////////////////////////////////
149
+
150
+ /**
151
+ * Parse a period string into a literal date range.
152
+ * @param period
153
+ */
154
+ function parsePeriod(period: string): LiteralDateRange {
155
+ const comps = period.split(':')
156
+ if (comps.length == 1) {
157
+ if (period.match(/^\d{4}$/)) {
158
+ // year
159
+ const y = parseInt(period)
160
+ return {
161
+ min: `${y}-01-01` as DateLiteral,
162
+ max: `${y+1}-01-01` as DateLiteral
163
+ }
164
+ }
165
+ if (period.match(/^\d{4}-\d{2}$/)) {
166
+ // month
167
+ const d = dayjs(`${period}-01`)
168
+ return {
169
+ min: d.format(literalFormat) as DateLiteral,
170
+ max: d.add(1, 'month').format(literalFormat) as DateLiteral
171
+ }
172
+ }
173
+ if (period.match(/^\d{4}-\d{2}-\d{2}$/)) {
174
+ // day
175
+ const d = dayjs(period)
176
+ return {
177
+ min: d.format(literalFormat) as DateLiteral,
178
+ max: d.add(1, 'day').format(literalFormat) as DateLiteral
179
+ }
180
+ }
181
+ }
182
+ else if (comps.length == 2) {
183
+ return {
184
+ min: comps[0] as DateLiteral,
185
+ max: comps[1] as DateLiteral
186
+ }
187
+ }
188
+ throw `Invalid period format ${period}`
189
+ }
190
+
191
+ /**
192
+ * Serializes a literal date range into a period string.
193
+ * @param range
194
+ */
195
+ function serializePeriod(range: LiteralDateRange): string {
196
+ return `${range.min}:${range.max}`
197
+ }
198
+
199
+
200
+ ////////////////////////////////////////////////////////////////////////////////
201
+ // Period Picker
202
+ ////////////////////////////////////////////////////////////////////////////////
203
+
204
+ export type DatePeriodPickerState = {
205
+ initial?: LiteralDateRange
206
+ callback: (period: LiteralDateRange) => any
207
+ }
208
+
209
+ /**
210
+ * Allows the user to pick a data period from a set of common ones.
211
+ */
212
+ export class DatePeriodPickerPart extends Dropdown<DatePeriodPickerState> {
213
+
214
+ periodKey = messages.typedKey<{period: string}>()
215
+
216
+ async init() {
217
+ await super.init()
218
+ this.onClick(this.periodKey, m => {
219
+ const range = parsePeriod(m.data.period)
220
+ log.info(`Picked period ${m.data.period}`, range)
221
+ this.state.callback(range)
222
+ this.clear()
223
+ })
224
+ }
225
+
226
+ get parentClasses(): Array<string> {
227
+ return ['tt-date-period-picker']
228
+ }
229
+
230
+ get autoClose(): boolean {
231
+ return true
232
+ }
233
+
234
+ renderContent(parent: PartTag): void {
235
+ const today = dayjs()
236
+ const pInitial = this.state.initial ? serializePeriod(this.state.initial) : ''
237
+ log.info(`Initial period is ${pInitial}`)
238
+ parent.div('.year-grid', grid => {
239
+ for (let year = today.year()-2; year < today.year()+1; year++) {
240
+ grid.div('.year-column', col => {
241
+ // year button
242
+ const pYear = serializePeriod(parsePeriod(year.toString()))
243
+ const yearClasses = ['year']
244
+ if (pYear == pInitial) {
245
+ yearClasses.push('current')
246
+ }
247
+ col.a({text: year.toString()})
248
+ .class(...yearClasses)
249
+ .emitClick(this.periodKey, {period: pYear})
250
+
251
+ // month buttons
252
+ for (let m = 0; m < 12; m++) {
253
+ const d = today.set('month', m)
254
+ const pMonth = serializePeriod(parsePeriod(`${year}-${d.format('MM')}`))
255
+ const monthClasses = ['month']
256
+ if (pMonth == pInitial) {
257
+ monthClasses.push('current')
258
+ }
259
+ col.a({text: d.format('MMMM')})
260
+ .class(...monthClasses)
261
+ .emitClick(this.periodKey, {period: pMonth})
262
+ }
263
+ })
264
+ }
265
+ })
266
+ }
267
+
268
+ }
269
+
270
+
271
+ ////////////////////////////////////////////////////////////////////////////////
272
+ // Exports
273
+ ////////////////////////////////////////////////////////////////////////////////
274
+
275
+ const Dates = {
276
+ displayFormat,
277
+ literalFormat,
278
+ display,
279
+ rangeDisplay,
280
+ materializeVirtualRange,
281
+ virtualPeriods,
282
+ parsePeriod,
283
+ serializePeriod
284
+ }
285
+
286
+ export default Dates