@wrenautomation/aerie 0.4.4 → 0.4.5

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.
@@ -1,3 +1,4 @@
1
+ import type { Edit } from "./edit.js";
1
2
  import { type SortField, type TaskRecord, type TaskView } from "./filter.js";
2
3
  /** how a portal draws the value */
3
4
  export type FieldKind = "id" | "text" | "status" | "priority" | "area" | "people" | "labels" | "date" | "number" | "progress";
@@ -13,9 +14,23 @@ export interface Field {
13
14
  group?: boolean;
14
15
  /** known values in group order; others follow, by name */
15
16
  order?: readonly string[];
17
+ /**
18
+ * The write that moves `t` from group `from` to group `to` (null: the empty group), the inverse of `values`
19
+ * (D17). None: a Board cannot move cards on this field.
20
+ */
21
+ move?(t: TaskView, from: string | null, to: string | null): MoveEdit | null;
16
22
  }
23
+ /** a move's write: task fields, and `area` (a placement) */
24
+ export type MoveEdit = Edit & {
25
+ area?: string;
26
+ };
17
27
  export declare const FIELDS: readonly Field[];
18
28
  export declare const fieldOf: (key: string) => Field | undefined;
29
+ /**
30
+ * The write that moves `t` from group `from` to `to` on field `key`; null: nothing to write (the same group, a
31
+ * `from` the task is not in, a field with no move).
32
+ */
33
+ export declare function moveEdit(key: string, t: TaskView, from: string | null, to: string | null): MoveEdit | null;
19
34
  export declare const GROUP_KEYS: string[];
20
35
  export interface Group<T extends TaskView = TaskRecord> {
21
36
  /** null: the task has no value for this field */
@@ -6,6 +6,8 @@ import { lineage } from "./area.js";
6
6
  import { holdersOf, MARK } from "./filter.js";
7
7
  import { PRIORITIES, STATUSES } from "./task.js";
8
8
  const one = (v) => (v ? [v] : []);
9
+ /** one value: `to` sets it, null clears it */
10
+ const setTo = (k) => (_t, _from, to) => ({ [k]: to });
9
11
  const checks = (t) => {
10
12
  const all = [...t.ac, ...t.dod];
11
13
  return all.length ? [`${all.filter((c) => c.done).length}/${all.length}`] : [];
@@ -21,6 +23,7 @@ export const FIELDS = [
21
23
  sort: "status",
22
24
  group: true,
23
25
  order: STATUSES,
26
+ move: (_t, _from, to) => (to ? { status: to } : null),
24
27
  },
25
28
  {
26
29
  key: "priority",
@@ -30,26 +33,56 @@ export const FIELDS = [
30
33
  sort: "priority",
31
34
  group: true,
32
35
  order: PRIORITIES,
36
+ move: setTo("priority"),
37
+ },
38
+ {
39
+ key: "area",
40
+ label: "Area",
41
+ kind: "area",
42
+ values: (t) => [t.area],
43
+ sort: "area",
44
+ group: true,
45
+ move: (_t, _from, to) => (to ? { area: to } : null),
33
46
  },
34
- { key: "area", label: "Area", kind: "area", values: (t) => [t.area], sort: "area", group: true },
35
47
  {
36
48
  key: "assignee",
37
49
  label: "Assignee",
38
50
  kind: "people",
39
51
  values: (t) => t.assignees.filter((a) => !a.startsWith(MARK)),
40
52
  group: true,
53
+ // the empty group has no people: `to` null drops them all; `@peers:` marks stay
54
+ move: (t, from, to) => {
55
+ const kept = t.assignees.filter((a) => (to ? a !== from : a.startsWith(MARK)));
56
+ return { assignees: to && !kept.includes(to) ? [...kept, to] : kept };
57
+ },
41
58
  },
42
59
  { key: "holder", label: "Held by", kind: "people", values: (t) => holdersOf(t), group: true },
43
- { key: "labels", label: "Labels", kind: "labels", values: (t) => t.labels, group: true },
60
+ {
61
+ key: "labels",
62
+ label: "Labels",
63
+ kind: "labels",
64
+ values: (t) => t.labels,
65
+ group: true,
66
+ // the empty group has no labels: `to` null drops them all
67
+ move: (_t, from, to) => to ? { ...(from ? { removeLabels: [from] } : {}), addLabels: [to] } : { labels: [] },
68
+ },
44
69
  {
45
70
  key: "milestone",
46
71
  label: "Milestone",
47
72
  kind: "text",
48
73
  values: (t) => one(t.milestone),
49
74
  group: true,
75
+ move: setTo("milestone"),
50
76
  },
51
77
  { key: "parent", label: "Parent", kind: "id", values: (t) => one(t.parentId), group: true },
52
- { key: "type", label: "Type", kind: "text", values: (t) => one(t.type), group: true },
78
+ {
79
+ key: "type",
80
+ label: "Type",
81
+ kind: "text",
82
+ values: (t) => one(t.type),
83
+ group: true,
84
+ move: setTo("type"),
85
+ },
53
86
  { key: "checks", label: "Checks", kind: "progress", values: checks },
54
87
  {
55
88
  key: "createdAt",
@@ -74,6 +107,19 @@ export const FIELDS = [
74
107
  },
75
108
  ];
76
109
  export const fieldOf = (key) => FIELDS.find((f) => f.key === key);
110
+ /**
111
+ * The write that moves `t` from group `from` to `to` on field `key`; null: nothing to write (the same group, a
112
+ * `from` the task is not in, a field with no move).
113
+ */
114
+ export function moveEdit(key, t, from, to) {
115
+ const f = fieldOf(key);
116
+ if (!f?.move || from === to)
117
+ return null;
118
+ const now = f.values(t);
119
+ if (from === null ? now.length > 0 : !now.includes(from))
120
+ return null;
121
+ return f.move(t, from, to);
122
+ }
77
123
  export const GROUP_KEYS = FIELDS.filter((f) => f.group).map((f) => f.key);
78
124
  /**
79
125
  * Tasks into groups, in the field's order (known values first, then by name, empty last). `all`: also the
@@ -1 +1 @@
1
- {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/core/fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/core/fields.ts"],"names":[],"mappings":"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"}
@@ -8891,7 +8891,7 @@ var init_task = __esm({
8891
8891
  });
8892
8892
 
8893
8893
  // src/core/fields.ts
8894
- var one, checks, FIELDS, GROUP_KEYS;
8894
+ var one, setTo, checks, FIELDS, GROUP_KEYS;
8895
8895
  var init_fields = __esm({
8896
8896
  "src/core/fields.ts"() {
8897
8897
  "use strict";
@@ -8899,6 +8899,7 @@ var init_fields = __esm({
8899
8899
  init_filter();
8900
8900
  init_task();
8901
8901
  one = (v) => v ? [v] : [];
8902
+ setTo = (k) => (_t, _from, to) => ({ [k]: to });
8902
8903
  checks = (t) => {
8903
8904
  const all = [...t.ac, ...t.dod];
8904
8905
  return all.length ? [`${all.filter((c) => c.done).length}/${all.length}`] : [];
@@ -8913,7 +8914,8 @@ var init_fields = __esm({
8913
8914
  values: (t) => [t.status],
8914
8915
  sort: "status",
8915
8916
  group: true,
8916
- order: STATUSES
8917
+ order: STATUSES,
8918
+ move: (_t, _from, to) => to ? { status: to } : null
8917
8919
  },
8918
8920
  {
8919
8921
  key: "priority",
@@ -8922,27 +8924,57 @@ var init_fields = __esm({
8922
8924
  values: (t) => one(t.priority),
8923
8925
  sort: "priority",
8924
8926
  group: true,
8925
- order: PRIORITIES
8927
+ order: PRIORITIES,
8928
+ move: setTo("priority")
8929
+ },
8930
+ {
8931
+ key: "area",
8932
+ label: "Area",
8933
+ kind: "area",
8934
+ values: (t) => [t.area],
8935
+ sort: "area",
8936
+ group: true,
8937
+ move: (_t, _from, to) => to ? { area: to } : null
8926
8938
  },
8927
- { key: "area", label: "Area", kind: "area", values: (t) => [t.area], sort: "area", group: true },
8928
8939
  {
8929
8940
  key: "assignee",
8930
8941
  label: "Assignee",
8931
8942
  kind: "people",
8932
8943
  values: (t) => t.assignees.filter((a) => !a.startsWith(MARK)),
8933
- group: true
8944
+ group: true,
8945
+ // the empty group has no people: `to` null drops them all; `@peers:` marks stay
8946
+ move: (t, from, to) => {
8947
+ const kept = t.assignees.filter((a) => to ? a !== from : a.startsWith(MARK));
8948
+ return { assignees: to && !kept.includes(to) ? [...kept, to] : kept };
8949
+ }
8934
8950
  },
8935
8951
  { key: "holder", label: "Held by", kind: "people", values: (t) => holdersOf(t), group: true },
8936
- { key: "labels", label: "Labels", kind: "labels", values: (t) => t.labels, group: true },
8952
+ {
8953
+ key: "labels",
8954
+ label: "Labels",
8955
+ kind: "labels",
8956
+ values: (t) => t.labels,
8957
+ group: true,
8958
+ // the empty group has no labels: `to` null drops them all
8959
+ move: (_t, from, to) => to ? { ...from ? { removeLabels: [from] } : {}, addLabels: [to] } : { labels: [] }
8960
+ },
8937
8961
  {
8938
8962
  key: "milestone",
8939
8963
  label: "Milestone",
8940
8964
  kind: "text",
8941
8965
  values: (t) => one(t.milestone),
8942
- group: true
8966
+ group: true,
8967
+ move: setTo("milestone")
8943
8968
  },
8944
8969
  { key: "parent", label: "Parent", kind: "id", values: (t) => one(t.parentId), group: true },
8945
- { key: "type", label: "Type", kind: "text", values: (t) => one(t.type), group: true },
8970
+ {
8971
+ key: "type",
8972
+ label: "Type",
8973
+ kind: "text",
8974
+ values: (t) => one(t.type),
8975
+ group: true,
8976
+ move: setTo("type")
8977
+ },
8946
8978
  { key: "checks", label: "Checks", kind: "progress", values: checks },
8947
8979
  {
8948
8980
  key: "createdAt",