convex-feedback 0.1.5 → 0.2.0-beta.0

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 (69) hide show
  1. package/README.md +70 -27
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/client/api.d.ts +76 -1
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/config.d.ts +1 -1
  6. package/dist/client/index.d.ts +9 -5
  7. package/dist/client/index.d.ts.map +1 -1
  8. package/dist/client/index.js +253 -8
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/component/_generated/api.d.ts +4 -0
  11. package/dist/component/_generated/api.d.ts.map +1 -1
  12. package/dist/component/_generated/api.js.map +1 -1
  13. package/dist/component/_generated/component.d.ts +293 -5
  14. package/dist/component/_generated/component.d.ts.map +1 -1
  15. package/dist/component/admin.d.ts +130 -0
  16. package/dist/component/admin.d.ts.map +1 -0
  17. package/dist/component/admin.js +125 -0
  18. package/dist/component/admin.js.map +1 -0
  19. package/dist/component/comments.d.ts +7 -5
  20. package/dist/component/comments.d.ts.map +1 -1
  21. package/dist/component/comments.js +3 -3
  22. package/dist/component/comments.js.map +1 -1
  23. package/dist/component/entries.d.ts +29 -18
  24. package/dist/component/entries.d.ts.map +1 -1
  25. package/dist/component/entries.js +27 -6
  26. package/dist/component/entries.js.map +1 -1
  27. package/dist/component/helpers.d.ts +3 -1
  28. package/dist/component/helpers.d.ts.map +1 -1
  29. package/dist/component/helpers.js +28 -0
  30. package/dist/component/helpers.js.map +1 -1
  31. package/dist/component/model.d.ts +140 -24
  32. package/dist/component/model.d.ts.map +1 -1
  33. package/dist/component/model.js +30 -1
  34. package/dist/component/model.js.map +1 -1
  35. package/dist/component/roadmap.d.ts +166 -0
  36. package/dist/component/roadmap.d.ts.map +1 -0
  37. package/dist/component/roadmap.js +534 -0
  38. package/dist/component/roadmap.js.map +1 -0
  39. package/dist/component/schema.d.ts +61 -5
  40. package/dist/component/schema.d.ts.map +1 -1
  41. package/dist/component/schema.js +48 -2
  42. package/dist/component/schema.js.map +1 -1
  43. package/dist/component/tags.d.ts +58 -0
  44. package/dist/component/tags.d.ts.map +1 -0
  45. package/dist/component/tags.js +216 -0
  46. package/dist/component/tags.js.map +1 -0
  47. package/dist/react/index.d.ts +169 -12
  48. package/dist/react/index.d.ts.map +1 -1
  49. package/dist/react/index.js +72 -1
  50. package/dist/react/index.js.map +1 -1
  51. package/dist/test.d.ts +61 -5
  52. package/dist/test.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/client/README.md +1 -1
  55. package/src/client/api.ts +176 -0
  56. package/src/client/config.ts +1 -1
  57. package/src/client/index.ts +330 -13
  58. package/src/component/README.md +1 -1
  59. package/src/component/_generated/api.ts +4 -0
  60. package/src/component/_generated/component.ts +371 -9
  61. package/src/component/admin.ts +180 -0
  62. package/src/component/comments.ts +3 -2
  63. package/src/component/entries.ts +29 -5
  64. package/src/component/helpers.ts +44 -1
  65. package/src/component/model.ts +65 -4
  66. package/src/component/roadmap.ts +627 -0
  67. package/src/component/schema.ts +51 -1
  68. package/src/react/README.md +2 -2
  69. package/src/react/index.ts +139 -4
@@ -5,11 +5,13 @@ declare const schema: import("convex/server").SchemaDefinition<{
5
5
  standard?: Record<string, string | number | boolean> | undefined;
6
6
  additional?: Record<string, string | number | boolean> | undefined;
7
7
  } | undefined;
8
+ priority?: "low" | "medium" | "high" | undefined;
8
9
  statusFilter?: "open" | "closed" | undefined;
10
+ roadmapId?: import("convex/values").GenericId<"roadmap"> | undefined;
11
+ title: string;
12
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
9
13
  actorId: string;
10
14
  kind: "feedback" | "feature_request" | "bug_report";
11
- status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
12
- title: string;
13
15
  body: string;
14
16
  upvoteCount: number;
15
17
  commentCount: number;
@@ -34,7 +36,9 @@ declare const schema: import("convex/server").SchemaDefinition<{
34
36
  standard: import("convex/values").VRecord<Record<string, string | number | boolean> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VUnion<string | number | boolean, [import("convex/values").VString<string, "required">, import("convex/values").VFloat64<number, "required">, import("convex/values").VBoolean<boolean, "required">], "required", never>, "optional", string>;
35
37
  additional: import("convex/values").VRecord<Record<string, string | number | boolean> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VUnion<string | number | boolean, [import("convex/values").VString<string, "required">, import("convex/values").VFloat64<number, "required">, import("convex/values").VBoolean<boolean, "required">], "required", never>, "optional", string>;
36
38
  }, "optional", "standard" | "additional" | `standard.${string}` | `additional.${string}`>;
37
- }, "required", "actorId" | "kind" | "status" | "title" | "body" | "upvoteCount" | "commentCount" | "updatedAt" | "metadata" | "metadata.standard" | "metadata.additional" | `metadata.standard.${string}` | `metadata.additional.${string}` | "statusFilter" | "normalizedTitle" | "searchText">, {
39
+ priority: import("convex/values").VUnion<"low" | "medium" | "high" | undefined, [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">], "optional", never>;
40
+ roadmapId: import("convex/values").VId<import("convex/values").GenericId<"roadmap"> | undefined, "optional">;
41
+ }, "required", "title" | "status" | "updatedAt" | "actorId" | "kind" | "body" | "upvoteCount" | "commentCount" | "metadata" | "metadata.standard" | "metadata.additional" | `metadata.standard.${string}` | `metadata.additional.${string}` | "priority" | "statusFilter" | "normalizedTitle" | "searchText" | "roadmapId">, {
38
42
  by_kind: ["kind", "_creationTime"];
39
43
  by_status: ["status", "_creationTime"];
40
44
  by_kind_status: ["kind", "status", "_creationTime"];
@@ -48,12 +52,64 @@ declare const schema: import("convex/server").SchemaDefinition<{
48
52
  by_kind_status_filter_upvotes: ["kind", "statusFilter", "upvoteCount", "_creationTime"];
49
53
  by_normalized_title: ["normalizedTitle", "_creationTime"];
50
54
  by_kind_normalized_title: ["kind", "normalizedTitle", "_creationTime"];
55
+ by_priority: ["priority", "_creationTime"];
56
+ by_roadmap_id: ["roadmapId", "_creationTime"];
51
57
  }, {
52
58
  search: {
53
59
  searchField: "searchText";
54
- filterFields: "kind" | "status" | "statusFilter";
60
+ filterFields: "status" | "kind" | "priority" | "statusFilter";
55
61
  };
56
62
  }, {}>;
63
+ roadmap: import("convex/server").TableDefinition<import("convex/values").VObject<{
64
+ description?: string | undefined;
65
+ deletingAt?: number | undefined;
66
+ rebalanceId?: string | undefined;
67
+ rebalanceRank?: number | undefined;
68
+ rebalancePosition?: number | undefined;
69
+ title: string;
70
+ status: "planned" | "in_progress" | "shipped";
71
+ position: number;
72
+ createdAt: number;
73
+ updatedAt: number;
74
+ feedbackCount: number;
75
+ }, {
76
+ title: import("convex/values").VString<string, "required">;
77
+ description: import("convex/values").VString<string | undefined, "optional">;
78
+ status: import("convex/values").VUnion<"planned" | "in_progress" | "shipped", [import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"shipped", "required">], "required", never>;
79
+ position: import("convex/values").VFloat64<number, "required">;
80
+ feedbackCount: import("convex/values").VFloat64<number, "required">;
81
+ createdAt: import("convex/values").VFloat64<number, "required">;
82
+ updatedAt: import("convex/values").VFloat64<number, "required">;
83
+ deletingAt: import("convex/values").VFloat64<number | undefined, "optional">;
84
+ rebalanceId: import("convex/values").VString<string | undefined, "optional">;
85
+ rebalanceRank: import("convex/values").VFloat64<number | undefined, "optional">;
86
+ rebalancePosition: import("convex/values").VFloat64<number | undefined, "optional">;
87
+ }, "required", "title" | "description" | "status" | "position" | "createdAt" | "updatedAt" | "feedbackCount" | "deletingAt" | "rebalanceId" | "rebalanceRank" | "rebalancePosition">, {
88
+ by_status_and_position: ["status", "position", "_creationTime"];
89
+ by_status_deleting_at_position: ["status", "deletingAt", "position", "_creationTime"];
90
+ by_deleting_at_and_position: ["deletingAt", "position", "_creationTime"];
91
+ by_status_rebalance_rank: ["status", "rebalanceId", "rebalanceRank", "_creationTime"];
92
+ by_status_deleting_at_rebalance_id_position: ["status", "deletingAt", "rebalanceId", "rebalancePosition", "_creationTime"];
93
+ by_position: ["position", "_creationTime"];
94
+ }, {
95
+ search_title: {
96
+ searchField: "title";
97
+ filterFields: "status" | "deletingAt";
98
+ };
99
+ }, {}>;
100
+ roadmapRebalances: import("convex/server").TableDefinition<import("convex/values").VObject<{
101
+ visibleGeneration?: string | undefined;
102
+ activeGeneration?: string | undefined;
103
+ status: "planned" | "in_progress" | "shipped";
104
+ nextGeneration: number;
105
+ }, {
106
+ status: import("convex/values").VUnion<"planned" | "in_progress" | "shipped", [import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"shipped", "required">], "required", never>;
107
+ nextGeneration: import("convex/values").VFloat64<number, "required">;
108
+ visibleGeneration: import("convex/values").VString<string | undefined, "optional">;
109
+ activeGeneration: import("convex/values").VString<string | undefined, "optional">;
110
+ }, "required", "status" | "nextGeneration" | "visibleGeneration" | "activeGeneration">, {
111
+ by_status: ["status", "_creationTime"];
112
+ }, {}, {}>;
57
113
  comments: import("convex/server").TableDefinition<import("convex/values").VObject<{
58
114
  updatedAt?: number | undefined;
59
115
  parentCommentId?: import("convex/values").GenericId<"comments"> | undefined;
@@ -74,7 +130,7 @@ declare const schema: import("convex/server").SchemaDefinition<{
74
130
  replyCount: import("convex/values").VFloat64<number, "required">;
75
131
  updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
76
132
  deletedAt: import("convex/values").VFloat64<number | undefined, "optional">;
77
- }, "required", "actorId" | "body" | "updatedAt" | "entryId" | "parentCommentId" | "depth" | "likeCount" | "replyCount" | "deletedAt">, {
133
+ }, "required", "updatedAt" | "actorId" | "body" | "entryId" | "parentCommentId" | "depth" | "likeCount" | "replyCount" | "deletedAt">, {
78
134
  by_entry_parent: ["entryId", "parentCommentId", "_creationTime"];
79
135
  by_entry_parent_likes: ["entryId", "parentCommentId", "likeCount", "_creationTime"];
80
136
  }, {}, {}>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA8DV,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA8GV,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { defineSchema, defineTable } from "convex/server";
2
2
  import { v } from "convex/values";
3
- import { entryKindValidator, entryStatusFilterValidator, entryStatusValidator, feedbackMetadataValidator, } from "./model.js";
3
+ import { entryKindValidator, entryPriorityValidator, entryStatusFilterValidator, entryStatusValidator, feedbackMetadataValidator, roadmapStatusValidator, } from "./model.js";
4
4
  const schema = defineSchema({
5
5
  entries: defineTable({
6
6
  actorId: v.string(),
@@ -15,6 +15,8 @@ const schema = defineSchema({
15
15
  commentCount: v.number(),
16
16
  updatedAt: v.optional(v.number()),
17
17
  metadata: v.optional(feedbackMetadataValidator),
18
+ priority: v.optional(entryPriorityValidator),
19
+ roadmapId: v.optional(v.id("roadmap")),
18
20
  })
19
21
  .index("by_kind", ["kind"])
20
22
  .index("by_status", ["status"])
@@ -33,10 +35,54 @@ const schema = defineSchema({
33
35
  ])
34
36
  .index("by_normalized_title", ["normalizedTitle"])
35
37
  .index("by_kind_normalized_title", ["kind", "normalizedTitle"])
38
+ .index("by_priority", ["priority"])
39
+ .index("by_roadmap_id", ["roadmapId"])
36
40
  .searchIndex("search", {
37
41
  searchField: "searchText",
38
- filterFields: ["kind", "status", "statusFilter"],
42
+ filterFields: ["kind", "status", "statusFilter", "priority"],
39
43
  }),
44
+ roadmap: defineTable({
45
+ title: v.string(),
46
+ description: v.optional(v.string()),
47
+ status: roadmapStatusValidator,
48
+ position: v.number(),
49
+ feedbackCount: v.number(),
50
+ createdAt: v.number(),
51
+ updatedAt: v.number(),
52
+ deletingAt: v.optional(v.number()),
53
+ rebalanceId: v.optional(v.string()),
54
+ rebalanceRank: v.optional(v.number()),
55
+ rebalancePosition: v.optional(v.number()),
56
+ })
57
+ .index("by_status_and_position", ["status", "position"])
58
+ .index("by_status_deleting_at_position", [
59
+ "status",
60
+ "deletingAt",
61
+ "position",
62
+ ])
63
+ .index("by_deleting_at_and_position", ["deletingAt", "position"])
64
+ .index("by_status_rebalance_rank", [
65
+ "status",
66
+ "rebalanceId",
67
+ "rebalanceRank",
68
+ ])
69
+ .index("by_status_deleting_at_rebalance_id_position", [
70
+ "status",
71
+ "deletingAt",
72
+ "rebalanceId",
73
+ "rebalancePosition",
74
+ ])
75
+ .index("by_position", ["position"])
76
+ .searchIndex("search_title", {
77
+ searchField: "title",
78
+ filterFields: ["status", "deletingAt"],
79
+ }),
80
+ roadmapRebalances: defineTable({
81
+ status: roadmapStatusValidator,
82
+ nextGeneration: v.number(),
83
+ visibleGeneration: v.optional(v.string()),
84
+ activeGeneration: v.optional(v.string()),
85
+ }).index("by_status", ["status"]),
40
86
  comments: defineTable({
41
87
  entryId: v.id("entries"),
42
88
  parentCommentId: v.optional(v.id("comments")),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,GAAG,YAAY,CAAC;IAC1B,OAAO,EAAE,WAAW,CAAC;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,oBAAoB;QAC5B,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACpD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC5C,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KACvC,CAAC;SACC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;SAC1B,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;SAC9B,KAAK,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC3C,KAAK,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC;SAC3C,KAAK,CAAC,uBAAuB,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;SACxD,KAAK,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,CAAC;SACpC,KAAK,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;SACjD,KAAK,CAAC,mBAAmB,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;SACrD,KAAK,CAAC,wBAAwB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;SAClE,KAAK,CAAC,0BAA0B,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;SAClE,KAAK,CAAC,+BAA+B,EAAE;QACtC,MAAM;QACN,cAAc;QACd,aAAa;KACd,CAAC;SACD,KAAK,CAAC,qBAAqB,EAAE,CAAC,iBAAiB,CAAC,CAAC;SACjD,KAAK,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;SAC9D,KAAK,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC;SAClC,KAAK,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC;SACrC,WAAW,CAAC,QAAQ,EAAE;QACrB,WAAW,EAAE,YAAY;QACzB,YAAY,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC;KAC7D,CAAC;IAEJ,OAAO,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,sBAAsB;QAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;SACC,KAAK,CAAC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;SACvD,KAAK,CAAC,gCAAgC,EAAE;QACvC,QAAQ;QACR,YAAY;QACZ,UAAU;KACX,CAAC;SACD,KAAK,CAAC,6BAA6B,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;SAChE,KAAK,CAAC,0BAA0B,EAAE;QACjC,QAAQ;QACR,aAAa;QACb,eAAe;KAChB,CAAC;SACD,KAAK,CAAC,6CAA6C,EAAE;QACpD,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,mBAAmB;KACpB,CAAC;SACD,KAAK,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC;SAClC,WAAW,CAAC,cAAc,EAAE;QAC3B,WAAW,EAAE,OAAO;QACpB,YAAY,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;KACvC,CAAC;IAEJ,iBAAiB,EAAE,WAAW,CAAC;QAC7B,MAAM,EAAE,sBAAsB;QAC9B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACzC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACzC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEjC,QAAQ,EAAE,WAAW,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxB,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAClC,CAAC;SACC,KAAK,CAAC,iBAAiB,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;SACxD,KAAK,CAAC,uBAAuB,EAAE;QAC9B,SAAS;QACT,iBAAiB;QACjB,WAAW;KACZ,CAAC;IAEJ,SAAS,EAAE,WAAW,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;KACxC,CAAC;SACC,KAAK,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SAC/C,KAAK,CAAC,kBAAkB,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;CACvD,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,58 @@
1
+ export declare const list: import("convex/server").RegisteredQuery<"public", {}, Promise<{
2
+ color?: string | undefined;
3
+ id: string;
4
+ creationTime: number;
5
+ name: string;
6
+ updatedAt: number;
7
+ }[]>>;
8
+ export declare const create: import("convex/server").RegisteredMutation<"public", {
9
+ color?: string | undefined;
10
+ name: string;
11
+ actor: {
12
+ id: string;
13
+ isAdmin: boolean;
14
+ };
15
+ }, Promise<import("convex/values").GenericId<"tags">>>;
16
+ export declare const update: import("convex/server").RegisteredMutation<"public", {
17
+ color?: string | undefined;
18
+ name: string;
19
+ tagId: import("convex/values").GenericId<"tags">;
20
+ actor: {
21
+ id: string;
22
+ isAdmin: boolean;
23
+ };
24
+ }, Promise<null>>;
25
+ export declare const remove: import("convex/server").RegisteredMutation<"public", {
26
+ tagId: import("convex/values").GenericId<"tags">;
27
+ actor: {
28
+ id: string;
29
+ isAdmin: boolean;
30
+ };
31
+ }, Promise<null>>;
32
+ export declare const removeBatch: import("convex/server").RegisteredMutation<"internal", {
33
+ tagId: import("convex/values").GenericId<"tags">;
34
+ cursor: string | null;
35
+ }, Promise<{
36
+ processed: number;
37
+ hasMore: boolean;
38
+ }>>;
39
+ export declare const finalizeRemoval: import("convex/server").RegisteredMutation<"internal", {
40
+ tagId: import("convex/values").GenericId<"tags">;
41
+ }, Promise<null>>;
42
+ export declare const attach: import("convex/server").RegisteredMutation<"public", {
43
+ entryId: import("convex/values").GenericId<"entries">;
44
+ tagId: import("convex/values").GenericId<"tags">;
45
+ actor: {
46
+ id: string;
47
+ isAdmin: boolean;
48
+ };
49
+ }, Promise<null>>;
50
+ export declare const detach: import("convex/server").RegisteredMutation<"public", {
51
+ entryId: import("convex/values").GenericId<"entries">;
52
+ tagId: import("convex/values").GenericId<"tags">;
53
+ actor: {
54
+ id: string;
55
+ isAdmin: boolean;
56
+ };
57
+ }, Promise<null>>;
58
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/component/tags.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,IAAI;;;;;;KAUf,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;sDA6BjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;iBAoCjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;iBAejB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;GAyCtB,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAS1B,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;iBA4BjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;iBAqBjB,CAAC"}
@@ -0,0 +1,216 @@
1
+ import { ConvexError, v } from "convex/values";
2
+ import { internal } from "./_generated/api.js";
3
+ import { internalMutation, mutation, query } from "./_generated/server.js";
4
+ import { normalizeRequiredText, serializeTag } from "./helpers.js";
5
+ import { actorValidator, tagValidator } from "./model.js";
6
+ const deletionBatchSize = 100;
7
+ function assertAdmin(actor) {
8
+ if (!actor.isAdmin)
9
+ throw new ConvexError("Admin access is required.");
10
+ }
11
+ function normalizeName(name) {
12
+ return name.trim().replace(/\s+/g, " ").toLocaleLowerCase("en-US");
13
+ }
14
+ function normalizeColor(color) {
15
+ const value = color?.trim();
16
+ if (value === undefined || value.length === 0)
17
+ return undefined;
18
+ if (!/^#[0-9a-fA-F]{6}$/.test(value)) {
19
+ throw new ConvexError("Tag color must be a six-digit hexadecimal color.");
20
+ }
21
+ return value.toUpperCase();
22
+ }
23
+ export const list = query({
24
+ args: {},
25
+ returns: v.array(tagValidator),
26
+ handler: async (ctx) => {
27
+ const tags = await ctx.db
28
+ .query("tags")
29
+ .withIndex("by_normalized_name")
30
+ .collect();
31
+ return tags.filter((tag) => tag.deletingAt === undefined).map(serializeTag);
32
+ },
33
+ });
34
+ export const create = mutation({
35
+ args: {
36
+ actor: actorValidator,
37
+ name: v.string(),
38
+ color: v.optional(v.string()),
39
+ },
40
+ returns: v.id("tags"),
41
+ handler: async (ctx, args) => {
42
+ assertAdmin(args.actor);
43
+ const name = normalizeRequiredText(args.name, "Tag name", 48);
44
+ const normalizedName = normalizeName(name);
45
+ const existing = await ctx.db
46
+ .query("tags")
47
+ .withIndex("by_normalized_name", (q) => q.eq("normalizedName", normalizedName))
48
+ .unique();
49
+ if (existing !== null)
50
+ throw new ConvexError("A tag with this name exists.");
51
+ return await ctx.db.insert("tags", {
52
+ name,
53
+ normalizedName,
54
+ ...(normalizeColor(args.color) === undefined
55
+ ? {}
56
+ : { color: normalizeColor(args.color) }),
57
+ updatedAt: Date.now(),
58
+ });
59
+ },
60
+ });
61
+ export const update = mutation({
62
+ args: {
63
+ actor: actorValidator,
64
+ tagId: v.id("tags"),
65
+ name: v.string(),
66
+ color: v.optional(v.string()),
67
+ },
68
+ returns: v.null(),
69
+ handler: async (ctx, args) => {
70
+ assertAdmin(args.actor);
71
+ const tag = await ctx.db.get("tags", args.tagId);
72
+ if (tag === null) {
73
+ throw new ConvexError("Tag not found.");
74
+ }
75
+ if (tag.deletingAt !== undefined) {
76
+ throw new ConvexError("Tag is being deleted.");
77
+ }
78
+ const name = normalizeRequiredText(args.name, "Tag name", 48);
79
+ const normalizedName = normalizeName(name);
80
+ const duplicate = await ctx.db
81
+ .query("tags")
82
+ .withIndex("by_normalized_name", (q) => q.eq("normalizedName", normalizedName))
83
+ .unique();
84
+ if (duplicate !== null && duplicate._id !== args.tagId) {
85
+ throw new ConvexError("A tag with this name exists.");
86
+ }
87
+ await ctx.db.patch("tags", args.tagId, {
88
+ name,
89
+ normalizedName,
90
+ color: normalizeColor(args.color),
91
+ updatedAt: Date.now(),
92
+ });
93
+ return null;
94
+ },
95
+ });
96
+ export const remove = mutation({
97
+ args: { actor: actorValidator, tagId: v.id("tags") },
98
+ returns: v.null(),
99
+ handler: async (ctx, args) => {
100
+ assertAdmin(args.actor);
101
+ const tag = await ctx.db.get("tags", args.tagId);
102
+ if (tag === null || tag.deletingAt !== undefined)
103
+ return null;
104
+ await ctx.db.patch("tags", args.tagId, { deletingAt: Date.now() });
105
+ await ctx.scheduler.runAfter(0, internal.tags.removeBatch, {
106
+ tagId: args.tagId,
107
+ cursor: null,
108
+ });
109
+ return null;
110
+ },
111
+ });
112
+ export const removeBatch = internalMutation({
113
+ args: {
114
+ tagId: v.id("tags"),
115
+ cursor: v.union(v.string(), v.null()),
116
+ },
117
+ returns: v.object({ processed: v.number(), hasMore: v.boolean() }),
118
+ handler: async (ctx, args) => {
119
+ const tag = await ctx.db.get("tags", args.tagId);
120
+ if (tag === null || tag.deletingAt === undefined) {
121
+ return { processed: 0, hasMore: false };
122
+ }
123
+ const page = await ctx.db.query("entries").paginate({
124
+ cursor: args.cursor,
125
+ numItems: deletionBatchSize,
126
+ });
127
+ const now = Date.now();
128
+ for (const entry of page.page) {
129
+ const current = entry.tagIds ?? [];
130
+ if (!current.includes(args.tagId))
131
+ continue;
132
+ const remaining = current.filter((tagId) => tagId !== args.tagId);
133
+ await ctx.db.patch("entries", entry._id, {
134
+ tagIds: remaining.length === 0 ? undefined : remaining,
135
+ updatedAt: now,
136
+ });
137
+ }
138
+ if (page.isDone) {
139
+ await ctx.scheduler.runAfter(0, internal.tags.finalizeRemoval, {
140
+ tagId: args.tagId,
141
+ });
142
+ }
143
+ else {
144
+ await ctx.scheduler.runAfter(0, internal.tags.removeBatch, {
145
+ tagId: args.tagId,
146
+ cursor: page.continueCursor,
147
+ });
148
+ }
149
+ return { processed: page.page.length, hasMore: !page.isDone };
150
+ },
151
+ });
152
+ export const finalizeRemoval = internalMutation({
153
+ args: { tagId: v.id("tags") },
154
+ returns: v.null(),
155
+ handler: async (ctx, args) => {
156
+ const tag = await ctx.db.get("tags", args.tagId);
157
+ if (tag === null || tag.deletingAt === undefined)
158
+ return null;
159
+ await ctx.db.delete("tags", args.tagId);
160
+ return null;
161
+ },
162
+ });
163
+ export const attach = mutation({
164
+ args: {
165
+ actor: actorValidator,
166
+ entryId: v.id("entries"),
167
+ tagId: v.id("tags"),
168
+ },
169
+ returns: v.null(),
170
+ handler: async (ctx, args) => {
171
+ assertAdmin(args.actor);
172
+ const [entry, tag] = await Promise.all([
173
+ ctx.db.get("entries", args.entryId),
174
+ ctx.db.get("tags", args.tagId),
175
+ ]);
176
+ if (entry === null)
177
+ throw new ConvexError("Entry not found.");
178
+ if (tag === null)
179
+ throw new ConvexError("Tag not found.");
180
+ if (tag.deletingAt !== undefined) {
181
+ throw new ConvexError("Tag is being deleted.");
182
+ }
183
+ const tagIds = entry.tagIds ?? [];
184
+ if (tagIds.includes(args.tagId))
185
+ return null;
186
+ await ctx.db.patch("entries", args.entryId, {
187
+ tagIds: [...tagIds, args.tagId],
188
+ updatedAt: Date.now(),
189
+ });
190
+ return null;
191
+ },
192
+ });
193
+ export const detach = mutation({
194
+ args: {
195
+ actor: actorValidator,
196
+ entryId: v.id("entries"),
197
+ tagId: v.id("tags"),
198
+ },
199
+ returns: v.null(),
200
+ handler: async (ctx, args) => {
201
+ assertAdmin(args.actor);
202
+ const entry = await ctx.db.get("entries", args.entryId);
203
+ if (entry === null)
204
+ throw new ConvexError("Entry not found.");
205
+ const current = entry.tagIds ?? [];
206
+ if (!current.includes(args.tagId))
207
+ return null;
208
+ const remaining = current.filter((tagId) => tagId !== args.tagId);
209
+ await ctx.db.patch("entries", args.entryId, {
210
+ tagIds: remaining.length === 0 ? undefined : remaining,
211
+ updatedAt: Date.now(),
212
+ });
213
+ return null;
214
+ },
215
+ });
216
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/component/tags.ts"],"names":[],"mappings":"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"}