@skillcdn/console 0.1.15 → 0.1.17
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.
- package/README.md +2 -1
- package/dist/api.d.ts +3 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts +2 -0
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +91 -9
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts +7 -2
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +23 -2
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +28 -4
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +2 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/terminal.d.ts +5 -0
- package/dist/cli/terminal.d.ts.map +1 -1
- package/dist/cli/terminal.js +11 -1
- package/dist/cli/terminal.js.map +1 -1
- package/dist/client.d.ts +28 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +62 -2
- package/dist/client.js.map +1 -1
- package/dist/components/calendar.d.ts +35 -2
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +58 -19
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/comments.d.ts +59 -0
- package/dist/components/comments.d.ts.map +1 -0
- package/dist/components/comments.js +138 -0
- package/dist/components/comments.js.map +1 -0
- package/dist/components/event-feed.d.ts.map +1 -1
- package/dist/components/event-feed.js +2 -0
- package/dist/components/event-feed.js.map +1 -1
- package/dist/components/markdown.d.ts +6 -0
- package/dist/components/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +2 -1
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/projects.d.ts +4 -1
- package/dist/components/projects.d.ts.map +1 -1
- package/dist/components/projects.js +10 -2
- package/dist/components/projects.js.map +1 -1
- package/dist/components/task-form.d.ts.map +1 -1
- package/dist/components/task-form.js +1 -1
- package/dist/components/task-form.js.map +1 -1
- package/dist/components/task-view.d.ts +8 -3
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js +6 -4
- package/dist/components/task-view.js.map +1 -1
- package/dist/console.css +180 -32
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +23 -5
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +5 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +2 -0
- package/dist/data.js.map +1 -1
- package/dist/i18n/en.d.ts +15 -2
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +17 -4
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +17 -4
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +3 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +3 -0
- package/dist/limits.js.map +1 -1
- package/dist/rules.js +2 -2
- package/dist/rules.js.map +1 -1
- package/dist/schemas.d.ts +105 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +32 -1
- package/dist/schemas.js.map +1 -1
- package/dist/vocabulary.d.ts +1 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +1 -0
- package/dist/vocabulary.js.map +1 -1
- package/docs/specs/cli.md +8 -4
- package/docs/specs/rest.md +9 -2
- package/package.json +1 -1
- package/skills/working-the-board/SKILL.md +6 -4
- package/src/api.ts +12 -0
- package/src/cli/cli.ts +106 -9
- package/src/cli/format.ts +28 -1
- package/src/cli/help.ts +32 -3
- package/src/cli/main.ts +2 -1
- package/src/cli/terminal.ts +12 -1
- package/src/client.ts +112 -3
- package/src/components/calendar.tsx +216 -28
- package/src/components/comments.tsx +342 -0
- package/src/components/event-feed.tsx +2 -0
- package/src/components/markdown.tsx +9 -1
- package/src/components/projects.tsx +19 -6
- package/src/components/task-form.tsx +1 -0
- package/src/components/task-view.tsx +32 -33
- package/src/console.tsx +27 -3
- package/src/data.ts +8 -0
- package/src/i18n/en.ts +19 -4
- package/src/i18n/ko.ts +19 -4
- package/src/index.ts +12 -0
- package/src/limits.ts +3 -0
- package/src/rules.ts +2 -2
- package/src/schemas.ts +40 -1
- package/src/styles/console.css +180 -32
- package/src/vocabulary.ts +1 -0
package/dist/console.css
CHANGED
|
@@ -295,6 +295,7 @@ table {
|
|
|
295
295
|
.sc-answer-form > *,
|
|
296
296
|
.sc-run > *,
|
|
297
297
|
.sc-report > *,
|
|
298
|
+
.sc-comment > *,
|
|
298
299
|
.sc-feed > *,
|
|
299
300
|
.sc-card > *,
|
|
300
301
|
.sc-form > *,
|
|
@@ -468,12 +469,15 @@ table {
|
|
|
468
469
|
|
|
469
470
|
/* The tabs: the pages of the level the person is on, under the header's first row. */
|
|
470
471
|
|
|
472
|
+
/* The bar lies one pixel over the header's line, so that the current tab's underline sits on it;
|
|
473
|
+
the tabs scroll sideways where they do not fit, and nothing in the bar ever scrolls down. */
|
|
471
474
|
.sc-tabs {
|
|
472
475
|
width: 100%;
|
|
473
476
|
max-width: var(--sc-width-page);
|
|
474
477
|
margin-inline: auto;
|
|
478
|
+
margin-bottom: -1px;
|
|
475
479
|
padding-inline: var(--sc-space-5);
|
|
476
|
-
overflow
|
|
480
|
+
overflow: auto hidden;
|
|
477
481
|
scrollbar-width: none;
|
|
478
482
|
}
|
|
479
483
|
|
|
@@ -487,7 +491,6 @@ table {
|
|
|
487
491
|
align-items: center;
|
|
488
492
|
gap: var(--sc-space-2);
|
|
489
493
|
padding: var(--sc-space-2) 0 var(--sc-space-3);
|
|
490
|
-
margin-bottom: -1px;
|
|
491
494
|
border-bottom: 2px solid transparent;
|
|
492
495
|
color: var(--sc-color-text-muted);
|
|
493
496
|
font-size: var(--sc-text-sm);
|
|
@@ -743,6 +746,7 @@ table {
|
|
|
743
746
|
.sc-project,
|
|
744
747
|
.sc-decision,
|
|
745
748
|
.sc-run,
|
|
749
|
+
.sc-comment,
|
|
746
750
|
.sc-sign-in,
|
|
747
751
|
.sc-facts {
|
|
748
752
|
position: relative;
|
|
@@ -758,6 +762,7 @@ table {
|
|
|
758
762
|
.sc-project::before,
|
|
759
763
|
.sc-decision::before,
|
|
760
764
|
.sc-run::before,
|
|
765
|
+
.sc-comment::before,
|
|
761
766
|
.sc-sign-in::before,
|
|
762
767
|
.sc-facts::before {
|
|
763
768
|
content: "";
|
|
@@ -1071,9 +1076,15 @@ table {
|
|
|
1071
1076
|
border-radius: 50%;
|
|
1072
1077
|
}
|
|
1073
1078
|
|
|
1074
|
-
|
|
1079
|
+
/* The ring turns whatever the motion preference: it says that the page still waits, and a ring
|
|
1080
|
+
that stands still reads as a page that stopped. Where motion is to be reduced it turns slowly. */
|
|
1081
|
+
.sc-spinner-ring {
|
|
1082
|
+
animation: sc-spin 700ms linear infinite;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1075
1086
|
.sc-spinner-ring {
|
|
1076
|
-
animation:
|
|
1087
|
+
animation-duration: 1.6s;
|
|
1077
1088
|
}
|
|
1078
1089
|
}
|
|
1079
1090
|
|
|
@@ -2129,6 +2140,109 @@ table {
|
|
|
2129
2140
|
border-top: var(--sc-border);
|
|
2130
2141
|
}
|
|
2131
2142
|
|
|
2143
|
+
/* The discussion on a task (ADR-0024): what was said, the runs and the decisions, one thread in
|
|
2144
|
+
the order they came, with the way to say something at its end. */
|
|
2145
|
+
.sc-thread {
|
|
2146
|
+
display: grid;
|
|
2147
|
+
gap: var(--sc-space-3);
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
.sc-comment {
|
|
2151
|
+
display: grid;
|
|
2152
|
+
gap: var(--sc-space-3);
|
|
2153
|
+
padding: var(--sc-space-4) var(--sc-space-5);
|
|
2154
|
+
border-radius: var(--sc-radius-lg);
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
.sc-comment-header {
|
|
2158
|
+
display: flex;
|
|
2159
|
+
flex-wrap: wrap;
|
|
2160
|
+
align-items: center;
|
|
2161
|
+
gap: var(--sc-space-2);
|
|
2162
|
+
}
|
|
2163
|
+
|
|
2164
|
+
.sc-comment-meta {
|
|
2165
|
+
color: var(--sc-color-text-muted);
|
|
2166
|
+
font-size: var(--sc-text-sm);
|
|
2167
|
+
}
|
|
2168
|
+
|
|
2169
|
+
/* A picture in a comment is seen where it is, no taller than a screen's worth. */
|
|
2170
|
+
.sc-comment-picture img,
|
|
2171
|
+
.sc-comment .sc-prose img {
|
|
2172
|
+
display: block;
|
|
2173
|
+
max-width: 100%;
|
|
2174
|
+
max-height: 24rem;
|
|
2175
|
+
border: var(--sc-border);
|
|
2176
|
+
border-radius: var(--sc-radius-md);
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
.sc-comment-files {
|
|
2180
|
+
display: grid;
|
|
2181
|
+
gap: var(--sc-space-2);
|
|
2182
|
+
margin: 0;
|
|
2183
|
+
padding: 0;
|
|
2184
|
+
list-style: none;
|
|
2185
|
+
font-size: var(--sc-text-sm);
|
|
2186
|
+
}
|
|
2187
|
+
|
|
2188
|
+
.sc-comment-picture {
|
|
2189
|
+
display: grid;
|
|
2190
|
+
gap: var(--sc-space-1);
|
|
2191
|
+
justify-items: start;
|
|
2192
|
+
}
|
|
2193
|
+
|
|
2194
|
+
.sc-comment-form {
|
|
2195
|
+
display: grid;
|
|
2196
|
+
gap: var(--sc-space-2);
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
.sc-comment-chosen {
|
|
2200
|
+
display: flex;
|
|
2201
|
+
flex-wrap: wrap;
|
|
2202
|
+
gap: var(--sc-space-2);
|
|
2203
|
+
margin: 0;
|
|
2204
|
+
padding: 0;
|
|
2205
|
+
list-style: none;
|
|
2206
|
+
font-size: var(--sc-text-sm);
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
.sc-comment-chosen-file {
|
|
2210
|
+
display: inline-flex;
|
|
2211
|
+
align-items: center;
|
|
2212
|
+
gap: var(--sc-space-1);
|
|
2213
|
+
padding: var(--sc-space-1) var(--sc-space-2);
|
|
2214
|
+
border: var(--sc-border);
|
|
2215
|
+
border-radius: var(--sc-radius-md);
|
|
2216
|
+
background: var(--sc-color-sheet);
|
|
2217
|
+
}
|
|
2218
|
+
|
|
2219
|
+
.sc-comment-form-actions {
|
|
2220
|
+
display: flex;
|
|
2221
|
+
flex-wrap: wrap;
|
|
2222
|
+
align-items: center;
|
|
2223
|
+
justify-content: flex-end;
|
|
2224
|
+
gap: var(--sc-space-2);
|
|
2225
|
+
}
|
|
2226
|
+
|
|
2227
|
+
.sc-comment-form-actions label {
|
|
2228
|
+
position: relative;
|
|
2229
|
+
cursor: pointer;
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2232
|
+
/* The file input is the label's: there for the keyboard and the screen reader, not seen. */
|
|
2233
|
+
.sc-comment-file-input {
|
|
2234
|
+
position: absolute;
|
|
2235
|
+
width: 1px;
|
|
2236
|
+
height: 1px;
|
|
2237
|
+
overflow: hidden;
|
|
2238
|
+
clip-path: inset(50%);
|
|
2239
|
+
opacity: 0;
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
.sc-comment-form .sc-field-hint {
|
|
2243
|
+
margin-top: 0;
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2132
2246
|
.sc-connect {
|
|
2133
2247
|
display: grid;
|
|
2134
2248
|
gap: var(--sc-space-3);
|
|
@@ -2654,8 +2768,9 @@ table {
|
|
|
2654
2768
|
white-space: nowrap;
|
|
2655
2769
|
}
|
|
2656
2770
|
|
|
2771
|
+
/* Lit a little under the pointer by its colour, not by a filter, which would light the card within it too. */
|
|
2657
2772
|
.sc-calendar-bar:hover {
|
|
2658
|
-
|
|
2773
|
+
background: color-mix(in srgb, var(--sc-category-fill), white 12%);
|
|
2659
2774
|
}
|
|
2660
2775
|
|
|
2661
2776
|
.sc-calendar-bar-begins {
|
|
@@ -2712,6 +2827,7 @@ table {
|
|
|
2712
2827
|
|
|
2713
2828
|
/* A project's mark: its symbol on its colour. */
|
|
2714
2829
|
.sc-mark {
|
|
2830
|
+
position: relative;
|
|
2715
2831
|
display: inline-flex;
|
|
2716
2832
|
flex: none;
|
|
2717
2833
|
align-items: center;
|
|
@@ -2749,7 +2865,7 @@ table {
|
|
|
2749
2865
|
align-items: end;
|
|
2750
2866
|
}
|
|
2751
2867
|
|
|
2752
|
-
/* A project's own image,
|
|
2868
|
+
/* A project's own image over the symbol, filling the mark; the symbol shows until the image is there. */
|
|
2753
2869
|
.sc-mark-pictured {
|
|
2754
2870
|
padding: 0;
|
|
2755
2871
|
overflow: hidden;
|
|
@@ -2757,6 +2873,8 @@ table {
|
|
|
2757
2873
|
}
|
|
2758
2874
|
|
|
2759
2875
|
.sc-mark-image {
|
|
2876
|
+
position: absolute;
|
|
2877
|
+
inset: 0;
|
|
2760
2878
|
display: block;
|
|
2761
2879
|
width: 100%;
|
|
2762
2880
|
height: 100%;
|
|
@@ -3009,54 +3127,84 @@ table {
|
|
|
3009
3127
|
flex: 1 1 10rem;
|
|
3010
3128
|
}
|
|
3011
3129
|
|
|
3012
|
-
/*
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
.
|
|
3130
|
+
/* The task under the pointer in full: a card within its item with its title and the facts its page
|
|
3131
|
+
lists, above or below the item, whichever side has more room, and moved left where it would
|
|
3132
|
+
leave the window; the calendar measures that as the pointer arrives, since only the browser
|
|
3133
|
+
knows where the item is. The card lies out of the accessible tree and takes no pointer. */
|
|
3134
|
+
.sc-calendar-task,
|
|
3135
|
+
.sc-calendar-bar {
|
|
3016
3136
|
position: relative;
|
|
3017
3137
|
}
|
|
3018
3138
|
|
|
3019
|
-
.
|
|
3020
|
-
|
|
3139
|
+
/* The item under the pointer rises above its neighbours, which would otherwise paint over its card. */
|
|
3140
|
+
.sc-calendar-task:hover,
|
|
3141
|
+
.sc-calendar-task:focus-visible,
|
|
3142
|
+
.sc-calendar-bar:hover,
|
|
3143
|
+
.sc-calendar-bar:focus-visible {
|
|
3144
|
+
z-index: 20;
|
|
3145
|
+
}
|
|
3146
|
+
|
|
3147
|
+
.sc-task-tip {
|
|
3021
3148
|
position: absolute;
|
|
3022
|
-
bottom: calc(100% + var(--sc-space-1));
|
|
3023
3149
|
left: 0;
|
|
3024
3150
|
z-index: 20;
|
|
3025
3151
|
width: max-content;
|
|
3026
|
-
max-width:
|
|
3027
|
-
padding: var(--sc-space-
|
|
3152
|
+
max-width: 20rem;
|
|
3153
|
+
padding: var(--sc-space-2) var(--sc-space-3);
|
|
3028
3154
|
border: var(--sc-border);
|
|
3029
3155
|
border-radius: var(--sc-radius-md);
|
|
3030
3156
|
background: var(--sc-color-bg-inset);
|
|
3031
3157
|
box-shadow: var(--sc-shadow-stage);
|
|
3032
3158
|
color: var(--sc-color-text);
|
|
3033
3159
|
font-size: var(--sc-text-xs);
|
|
3034
|
-
font-weight: var(--sc-weight-
|
|
3160
|
+
font-weight: var(--sc-weight-normal);
|
|
3035
3161
|
line-height: 1.4;
|
|
3162
|
+
text-align: left;
|
|
3036
3163
|
text-decoration: none;
|
|
3037
3164
|
white-space: normal;
|
|
3038
3165
|
overflow-wrap: anywhere;
|
|
3039
|
-
opacity: 0;
|
|
3040
|
-
visibility: hidden;
|
|
3041
3166
|
pointer-events: none;
|
|
3167
|
+
animation: sc-task-tip-in 120ms ease-out 100ms backwards;
|
|
3042
3168
|
}
|
|
3043
3169
|
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
.sc-tip[data-clipped]:focus-visible {
|
|
3047
|
-
z-index: 20;
|
|
3170
|
+
.sc-task-tip-above {
|
|
3171
|
+
bottom: calc(100% + var(--sc-space-1));
|
|
3048
3172
|
}
|
|
3049
3173
|
|
|
3050
|
-
.sc-tip
|
|
3051
|
-
|
|
3052
|
-
opacity: 1;
|
|
3053
|
-
visibility: visible;
|
|
3174
|
+
.sc-task-tip-below {
|
|
3175
|
+
top: calc(100% + var(--sc-space-1));
|
|
3054
3176
|
}
|
|
3055
3177
|
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3178
|
+
.sc-task-tip-title {
|
|
3179
|
+
margin: 0 0 var(--sc-space-2);
|
|
3180
|
+
font-weight: var(--sc-weight-medium);
|
|
3181
|
+
}
|
|
3182
|
+
|
|
3183
|
+
.sc-task-tip-facts {
|
|
3184
|
+
display: grid;
|
|
3185
|
+
grid-template-columns: auto 1fr;
|
|
3186
|
+
gap: var(--sc-space-1) var(--sc-space-3);
|
|
3187
|
+
margin: 0;
|
|
3188
|
+
}
|
|
3189
|
+
|
|
3190
|
+
.sc-task-tip-facts > div {
|
|
3191
|
+
display: contents;
|
|
3192
|
+
}
|
|
3193
|
+
|
|
3194
|
+
.sc-task-tip-facts dt {
|
|
3195
|
+
color: var(--sc-color-text-faint);
|
|
3196
|
+
font-weight: var(--sc-weight-medium);
|
|
3197
|
+
}
|
|
3198
|
+
|
|
3199
|
+
.sc-task-tip-facts dd {
|
|
3200
|
+
margin: 0;
|
|
3201
|
+
}
|
|
3202
|
+
|
|
3203
|
+
/* The card arrives after a moment, so that a pointer passing over the days opens none. */
|
|
3204
|
+
@keyframes sc-task-tip-in {
|
|
3205
|
+
from {
|
|
3206
|
+
opacity: 0;
|
|
3207
|
+
}
|
|
3060
3208
|
}
|
|
3061
3209
|
|
|
3062
3210
|
/* One week on its own, the only row there is: its days are taller than a month's. */
|
|
@@ -3193,8 +3341,8 @@ table {
|
|
|
3193
3341
|
margin: 0;
|
|
3194
3342
|
}
|
|
3195
3343
|
|
|
3196
|
-
/* No pointer rests on a phone's calendar
|
|
3197
|
-
.sc-tip
|
|
3344
|
+
/* No pointer rests on a phone's calendar, and the lists below say the titles. */
|
|
3345
|
+
.sc-task-tip {
|
|
3198
3346
|
display: none;
|
|
3199
3347
|
}
|
|
3200
3348
|
|
package/dist/console.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.tsx"],"names":[],"mappings":"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"}
|
package/dist/console.js
CHANGED
|
@@ -206,7 +206,8 @@ function TaskPage(props) {
|
|
|
206
206
|
? data.tasks.find((candidate) => candidate.id === route.id)
|
|
207
207
|
: data.tasks.find((candidate) => candidate.number === route.number);
|
|
208
208
|
const [history, setHistory] = useState(undefined);
|
|
209
|
-
const
|
|
209
|
+
const [comments, setComments] = useState(undefined);
|
|
210
|
+
const { taskHistory, taskComments } = data.actions;
|
|
210
211
|
const taskId = task?.id;
|
|
211
212
|
const number = task?.number;
|
|
212
213
|
// A task named by its id is shown at its number's address.
|
|
@@ -230,19 +231,36 @@ function TaskPage(props) {
|
|
|
230
231
|
}
|
|
231
232
|
})
|
|
232
233
|
.catch(() => undefined);
|
|
234
|
+
taskComments(taskId, controller.signal)
|
|
235
|
+
.then((items) => {
|
|
236
|
+
if (!controller.signal.aborted) {
|
|
237
|
+
setComments(items);
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
.catch(() => undefined);
|
|
233
241
|
return () => controller.abort();
|
|
234
|
-
}, [taskId, taskHistory, feedLength]);
|
|
242
|
+
}, [taskId, taskHistory, taskComments, feedLength]);
|
|
235
243
|
if (task === undefined) {
|
|
236
244
|
return (_jsx(EmptyState, { title: words.task.noSuch.title, body: words.task.noSuch.body, action: _jsx(LinkButton, { href: projectHref(key), children: words.nav.board }) }));
|
|
237
245
|
}
|
|
238
246
|
const here = taskHref(key, task.number);
|
|
239
|
-
return (_jsx(components.TaskView, { task: task, people: data.people.filter(inWorkspace), tasks: data.tasks, decisions: data.decisions, runs: data.runs, history: history, categories: data.categories, goals: data.goals, taskHref: (candidate) => taskHref(key, candidate.number), decisionHref: (decisionId) => decisionHref(key, decisionId), goalHref: (goalId) => goalHref(key, goalId), fileHref: (
|
|
247
|
+
return (_jsx(components.TaskView, { task: task, people: data.people.filter(inWorkspace), tasks: data.tasks, decisions: data.decisions, runs: data.runs, comments: comments, history: history, categories: data.categories, goals: data.goals, taskHref: (candidate) => taskHref(key, candidate.number), decisionHref: (decisionId) => decisionHref(key, decisionId), goalHref: (goalId) => goalHref(key, goalId), fileHref: (fileId) => projectPath(key, "files", fileId), docHref: (path) => docHref(key, path), form: route.form, formHref: (form) => taskHref(key, task.number, form), onCancel: () => navigation.back(here), busy: busy, error: error, onChange: (target, patch) => void act(async () => {
|
|
240
248
|
await data.actions.updateTask(target.id, patch);
|
|
241
249
|
navigation.replace(here);
|
|
242
250
|
}), onMove: (target, state) => void act(() => data.actions.updateTask(target.id, { state })), onRaiseDecision: (input) => void act(async () => {
|
|
243
251
|
await data.actions.raiseDecision(input);
|
|
244
252
|
navigation.replace(here);
|
|
245
|
-
}), onAnswer: (decision, input) => void act(() => data.actions.answerDecision(decision.id, input)), onUpdateDecision: (decision, patch) => void act(() => data.actions.updateDecision(decision.id, patch)), onAbandonRun: (run) => void act(() => data.actions.abandonRun(run.id))
|
|
253
|
+
}), onAnswer: (decision, input) => void act(() => data.actions.answerDecision(decision.id, input)), onUpdateDecision: (decision, patch) => void act(() => data.actions.updateDecision(decision.id, patch)), onAbandonRun: (run) => void act(() => data.actions.abandonRun(run.id)), onComment: (draft) => void act(async () => {
|
|
254
|
+
await data.actions.comment(task.id, {
|
|
255
|
+
body: draft.body,
|
|
256
|
+
files: draft.files.map((file) => ({
|
|
257
|
+
name: file.name,
|
|
258
|
+
bytes: file,
|
|
259
|
+
...(file.type === "" ? {} : { contentType: file.type }),
|
|
260
|
+
})),
|
|
261
|
+
});
|
|
262
|
+
setComments(await taskComments(task.id));
|
|
263
|
+
}) }));
|
|
246
264
|
}
|
|
247
265
|
function ProjectPage(props) {
|
|
248
266
|
const words = useWords();
|
|
@@ -279,7 +297,7 @@ function ProjectPage(props) {
|
|
|
279
297
|
const overdue = open.filter((task) => task.dueOn !== null && task.dueOn < now).sort(byDue);
|
|
280
298
|
const unscheduled = open.filter((task) => task.dueOn === null).sort(byDue);
|
|
281
299
|
const calendar = words.calendar;
|
|
282
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "sc-page-head", children: [_jsx("h1", { className: "sc-page-title", children: calendar.title }), _jsx(LinkButton, { href: newTaskHref(key), variant: "primary", children: words.board.writeTask })] }), data.tasks.length > 0 && (_jsx(BoardFilters, { filter: route.filter, categories: data.categories, goals: data.goals, people: data.people.filter(inWorkspace), me: me, shown: shown.length, total: data.tasks.length, onChange: (filter) => navigation.replace(calendarHref(key, route.month, filter)) })), _jsx(components.Calendar, { tasks: shown, month: month, today: now, categories: data.categories, taskHref: href, monthHref: (wanted) => calendarHref(key, wanted, route.filter) }), _jsxs("div", { className: "sc-calendar-below", children: [_jsxs("section", { className: "sc-task-section", "aria-label": calendar.overdue, children: [_jsxs("h2", { className: "sc-section-title", children: [calendar.overdue, " ", _jsx("span", { className: "sc-column-count", children: overdue.length })] }), _jsx(TaskList, { tasks: overdue, taskHref: href, today: now, showState: true, empty: _jsx("p", { className: "sc-muted", children: calendar.nothingOverdue }) })] }), _jsxs("section", { className: "sc-task-section", "aria-label": calendar.unscheduled, children: [_jsxs("h2", { className: "sc-section-title", children: [calendar.unscheduled, " ", _jsx("span", { className: "sc-column-count", children: unscheduled.length })] }), _jsx(TaskList, { tasks: unscheduled, taskHref: href, today: now, showState: true, empty: _jsx("p", { className: "sc-muted", children: calendar.allScheduled }) })] })] }), open.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": calendar.workload.title, children: [_jsx("h2", { className: "sc-section-title", children: calendar.workload.title }), _jsx(Workload, { tasks: shown, today: now, personHref: (person) => boardHref(key, person === undefined ? {} : { person: person.id }) })] }))] }));
|
|
300
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "sc-page-head", children: [_jsx("h1", { className: "sc-page-title", children: calendar.title }), _jsx(LinkButton, { href: newTaskHref(key), variant: "primary", children: words.board.writeTask })] }), data.tasks.length > 0 && (_jsx(BoardFilters, { filter: route.filter, categories: data.categories, goals: data.goals, people: data.people.filter(inWorkspace), me: me, shown: shown.length, total: data.tasks.length, onChange: (filter) => navigation.replace(calendarHref(key, route.month, filter)) })), _jsx(components.Calendar, { tasks: shown, month: month, today: now, categories: data.categories, goals: data.goals, taskHref: href, monthHref: (wanted) => calendarHref(key, wanted, route.filter) }), _jsxs("div", { className: "sc-calendar-below", children: [_jsxs("section", { className: "sc-task-section", "aria-label": calendar.overdue, children: [_jsxs("h2", { className: "sc-section-title", children: [calendar.overdue, " ", _jsx("span", { className: "sc-column-count", children: overdue.length })] }), _jsx(TaskList, { tasks: overdue, taskHref: href, today: now, showState: true, empty: _jsx("p", { className: "sc-muted", children: calendar.nothingOverdue }) })] }), _jsxs("section", { className: "sc-task-section", "aria-label": calendar.unscheduled, children: [_jsxs("h2", { className: "sc-section-title", children: [calendar.unscheduled, " ", _jsx("span", { className: "sc-column-count", children: unscheduled.length })] }), _jsx(TaskList, { tasks: unscheduled, taskHref: href, today: now, showState: true, empty: _jsx("p", { className: "sc-muted", children: calendar.allScheduled }) })] })] }), open.length > 0 && (_jsxs("section", { className: "sc-task-section", "aria-label": calendar.workload.title, children: [_jsx("h2", { className: "sc-section-title", children: calendar.workload.title }), _jsx(Workload, { tasks: shown, today: now, personHref: (person) => boardHref(key, person === undefined ? {} : { person: person.id }) })] }))] }));
|
|
283
301
|
}
|
|
284
302
|
if (route.name === "roadmap" || route.name === "new-goal") {
|
|
285
303
|
const roadmap = words.roadmap;
|