@nextsparkjs/theme-productivity 0.1.0-beta.44 → 0.1.0-beta.46
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/entities/boards/api/docs.md +131 -0
- package/entities/boards/api/presets.ts +113 -0
- package/entities/cards/api/docs.md +162 -0
- package/entities/cards/api/presets.ts +172 -0
- package/entities/lists/api/docs.md +143 -0
- package/entities/lists/api/presets.ts +81 -0
- package/lib/selectors.ts +2 -2
- package/package.json +3 -3
- package/styles/globals.css +19 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Boards API
|
|
2
|
+
|
|
3
|
+
Manage Trello-style boards for organizing lists and cards.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Boards API allows you to create, read, update, and archive board records. Boards are the top-level containers for organizing lists and cards in a Kanban-style workflow.
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All endpoints require authentication via:
|
|
12
|
+
- **Session cookie** (for browser-based requests)
|
|
13
|
+
- **API Key** header (for server-to-server requests)
|
|
14
|
+
|
|
15
|
+
## Endpoints
|
|
16
|
+
|
|
17
|
+
### List Boards
|
|
18
|
+
`GET /api/v1/boards`
|
|
19
|
+
|
|
20
|
+
Returns a paginated list of boards.
|
|
21
|
+
|
|
22
|
+
**Query Parameters:**
|
|
23
|
+
- `limit` (number, optional): Maximum records to return. Default: 20
|
|
24
|
+
- `offset` (number, optional): Number of records to skip. Default: 0
|
|
25
|
+
- `archived` (boolean, optional): Filter by archived status
|
|
26
|
+
- `search` (string, optional): Search by name, description
|
|
27
|
+
- `sortBy` (string, optional): Field to sort by. Default: position
|
|
28
|
+
- `sortOrder` (string, optional): Sort direction (asc, desc)
|
|
29
|
+
|
|
30
|
+
**Example Response:**
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"data": [
|
|
34
|
+
{
|
|
35
|
+
"id": "board_abc123",
|
|
36
|
+
"name": "Product Development",
|
|
37
|
+
"description": "Main product roadmap and feature tracking",
|
|
38
|
+
"color": "blue",
|
|
39
|
+
"archived": false,
|
|
40
|
+
"position": 1,
|
|
41
|
+
"createdAt": "2024-01-15T10:30:00Z",
|
|
42
|
+
"updatedAt": "2024-01-15T10:30:00Z"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"pagination": {
|
|
46
|
+
"total": 5,
|
|
47
|
+
"limit": 20,
|
|
48
|
+
"offset": 0
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Get Single Board
|
|
54
|
+
`GET /api/v1/boards/[id]`
|
|
55
|
+
|
|
56
|
+
Returns a single board by ID.
|
|
57
|
+
|
|
58
|
+
### Create Board
|
|
59
|
+
`POST /api/v1/boards`
|
|
60
|
+
|
|
61
|
+
Create a new board.
|
|
62
|
+
|
|
63
|
+
**Request Body:**
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"name": "New Project",
|
|
67
|
+
"description": "Board for tracking new project tasks",
|
|
68
|
+
"color": "purple"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Update Board
|
|
73
|
+
`PATCH /api/v1/boards/[id]`
|
|
74
|
+
|
|
75
|
+
Update an existing board. Supports partial updates.
|
|
76
|
+
|
|
77
|
+
### Archive Board
|
|
78
|
+
`PATCH /api/v1/boards/[id]`
|
|
79
|
+
|
|
80
|
+
Archive a board (soft delete).
|
|
81
|
+
|
|
82
|
+
**Request Body:**
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"archived": true
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Delete Board
|
|
90
|
+
`DELETE /api/v1/boards/[id]`
|
|
91
|
+
|
|
92
|
+
Permanently delete a board. This will also delete all associated lists and cards.
|
|
93
|
+
|
|
94
|
+
## Fields
|
|
95
|
+
|
|
96
|
+
| Field | Type | Required | Default | Description |
|
|
97
|
+
|-------|------|----------|---------|-------------|
|
|
98
|
+
| name | text | Yes | - | Board name |
|
|
99
|
+
| description | textarea | No | - | Board description |
|
|
100
|
+
| color | select | No | blue | Background color (blue, green, purple, orange, red, pink, gray) |
|
|
101
|
+
| archived | boolean | No | false | Whether board is archived |
|
|
102
|
+
| position | number | No | 0 | Display order |
|
|
103
|
+
| createdAt | datetime | Auto | - | Creation timestamp |
|
|
104
|
+
| updatedAt | datetime | Auto | - | Last update timestamp |
|
|
105
|
+
|
|
106
|
+
## Features
|
|
107
|
+
|
|
108
|
+
- **Searchable**: name, description
|
|
109
|
+
- **Sortable**: name, position, createdAt
|
|
110
|
+
- **Shared Access**: Boards are shared within the team
|
|
111
|
+
- **Soft Delete**: Use archive instead of permanent delete
|
|
112
|
+
|
|
113
|
+
## Permissions
|
|
114
|
+
|
|
115
|
+
- **Create/Update**: Owner, Admin
|
|
116
|
+
- **Delete**: Owner only
|
|
117
|
+
|
|
118
|
+
## Error Responses
|
|
119
|
+
|
|
120
|
+
| Status | Description |
|
|
121
|
+
|--------|-------------|
|
|
122
|
+
| 400 | Bad Request - Invalid parameters |
|
|
123
|
+
| 401 | Unauthorized - Missing or invalid auth |
|
|
124
|
+
| 403 | Forbidden - Insufficient permissions |
|
|
125
|
+
| 404 | Not Found - Board doesn't exist |
|
|
126
|
+
| 422 | Validation Error - Invalid data |
|
|
127
|
+
|
|
128
|
+
## Related APIs
|
|
129
|
+
|
|
130
|
+
- **[Lists](/api/v1/lists)** - Lists within boards
|
|
131
|
+
- **[Cards](/api/v1/cards)** - Cards within lists
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Presets for Boards Entity
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { defineApiEndpoint } from '@nextsparkjs/core/types/api-presets'
|
|
6
|
+
|
|
7
|
+
export default defineApiEndpoint({
|
|
8
|
+
summary: 'Manage kanban boards for task organization',
|
|
9
|
+
presets: [
|
|
10
|
+
{
|
|
11
|
+
id: 'list-all',
|
|
12
|
+
title: 'List All Boards',
|
|
13
|
+
description: 'Get all boards with pagination',
|
|
14
|
+
method: 'GET',
|
|
15
|
+
params: {
|
|
16
|
+
limit: 20
|
|
17
|
+
},
|
|
18
|
+
tags: ['read', 'list']
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'list-active',
|
|
22
|
+
title: 'List Active Boards',
|
|
23
|
+
description: 'Get all non-archived boards',
|
|
24
|
+
method: 'GET',
|
|
25
|
+
params: {
|
|
26
|
+
archived: 'false'
|
|
27
|
+
},
|
|
28
|
+
tags: ['read', 'filter']
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'list-archived',
|
|
32
|
+
title: 'List Archived Boards',
|
|
33
|
+
description: 'Get all archived boards',
|
|
34
|
+
method: 'GET',
|
|
35
|
+
params: {
|
|
36
|
+
archived: 'true'
|
|
37
|
+
},
|
|
38
|
+
tags: ['read', 'filter']
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'search-by-name',
|
|
42
|
+
title: 'Search by Name',
|
|
43
|
+
description: 'Search boards by name',
|
|
44
|
+
method: 'GET',
|
|
45
|
+
params: {
|
|
46
|
+
search: '{{name}}'
|
|
47
|
+
},
|
|
48
|
+
tags: ['read', 'search']
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: 'create-board',
|
|
52
|
+
title: 'Create Board',
|
|
53
|
+
description: 'Create a new board',
|
|
54
|
+
method: 'POST',
|
|
55
|
+
payload: {
|
|
56
|
+
name: 'New Board',
|
|
57
|
+
description: 'Board description',
|
|
58
|
+
color: 'blue'
|
|
59
|
+
},
|
|
60
|
+
tags: ['write', 'create']
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'update-board',
|
|
64
|
+
title: 'Update Board',
|
|
65
|
+
description: 'Update an existing board',
|
|
66
|
+
method: 'PATCH',
|
|
67
|
+
pathParams: {
|
|
68
|
+
id: '{{id}}'
|
|
69
|
+
},
|
|
70
|
+
payload: {
|
|
71
|
+
name: '{{name}}',
|
|
72
|
+
description: '{{description}}'
|
|
73
|
+
},
|
|
74
|
+
tags: ['write', 'update']
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'archive-board',
|
|
78
|
+
title: 'Archive Board',
|
|
79
|
+
description: 'Archive a board',
|
|
80
|
+
method: 'PATCH',
|
|
81
|
+
pathParams: {
|
|
82
|
+
id: '{{id}}'
|
|
83
|
+
},
|
|
84
|
+
payload: {
|
|
85
|
+
archived: true
|
|
86
|
+
},
|
|
87
|
+
tags: ['write', 'update']
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'restore-board',
|
|
91
|
+
title: 'Restore Board',
|
|
92
|
+
description: 'Restore an archived board',
|
|
93
|
+
method: 'PATCH',
|
|
94
|
+
pathParams: {
|
|
95
|
+
id: '{{id}}'
|
|
96
|
+
},
|
|
97
|
+
payload: {
|
|
98
|
+
archived: false
|
|
99
|
+
},
|
|
100
|
+
tags: ['write', 'update']
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: 'delete-board',
|
|
104
|
+
title: 'Delete Board',
|
|
105
|
+
description: 'Permanently delete a board',
|
|
106
|
+
method: 'DELETE',
|
|
107
|
+
pathParams: {
|
|
108
|
+
id: '{{id}}'
|
|
109
|
+
},
|
|
110
|
+
tags: ['write', 'delete']
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
})
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Cards API
|
|
2
|
+
|
|
3
|
+
Manage task cards within lists (the main work items).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Cards API allows you to create, read, update, and delete card records. Cards are the individual task items that can be dragged between lists within a board.
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All endpoints require authentication via:
|
|
12
|
+
- **Session cookie** (for browser-based requests)
|
|
13
|
+
- **API Key** header (for server-to-server requests)
|
|
14
|
+
|
|
15
|
+
## Endpoints
|
|
16
|
+
|
|
17
|
+
### List Cards
|
|
18
|
+
`GET /api/v1/cards`
|
|
19
|
+
|
|
20
|
+
Returns a paginated list of cards.
|
|
21
|
+
|
|
22
|
+
**Query Parameters:**
|
|
23
|
+
- `limit` (number, optional): Maximum records to return. Default: 20
|
|
24
|
+
- `offset` (number, optional): Number of records to skip. Default: 0
|
|
25
|
+
- `listId` (string, optional): Filter by parent list
|
|
26
|
+
- `boardId` (string, optional): Filter by parent board
|
|
27
|
+
- `priority` (string, optional): Filter by priority (low, medium, high, urgent)
|
|
28
|
+
- `assigneeId` (string, optional): Filter by assigned user
|
|
29
|
+
- `search` (string, optional): Search by title, description
|
|
30
|
+
- `sortBy` (string, optional): Field to sort by. Default: position
|
|
31
|
+
- `sortOrder` (string, optional): Sort direction (asc, desc)
|
|
32
|
+
|
|
33
|
+
**Example Response:**
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"data": [
|
|
37
|
+
{
|
|
38
|
+
"id": "card_abc123",
|
|
39
|
+
"title": "Implement user authentication",
|
|
40
|
+
"description": "Add login and registration functionality",
|
|
41
|
+
"position": 1,
|
|
42
|
+
"dueDate": "2024-02-01",
|
|
43
|
+
"priority": "high",
|
|
44
|
+
"labels": ["feature", "urgent"],
|
|
45
|
+
"assigneeId": "user_456",
|
|
46
|
+
"listId": "list_xyz",
|
|
47
|
+
"boardId": "board_abc",
|
|
48
|
+
"createdAt": "2024-01-15T10:30:00Z",
|
|
49
|
+
"updatedAt": "2024-01-15T10:30:00Z"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"pagination": {
|
|
53
|
+
"total": 15,
|
|
54
|
+
"limit": 20,
|
|
55
|
+
"offset": 0
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Get Single Card
|
|
61
|
+
`GET /api/v1/cards/[id]`
|
|
62
|
+
|
|
63
|
+
Returns a single card by ID.
|
|
64
|
+
|
|
65
|
+
### Create Card
|
|
66
|
+
`POST /api/v1/cards`
|
|
67
|
+
|
|
68
|
+
Create a new card.
|
|
69
|
+
|
|
70
|
+
**Request Body:**
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"title": "New Feature Request",
|
|
74
|
+
"description": "Detailed description of the feature",
|
|
75
|
+
"listId": "list_xyz789",
|
|
76
|
+
"boardId": "board_abc123",
|
|
77
|
+
"priority": "medium",
|
|
78
|
+
"dueDate": "2024-02-15",
|
|
79
|
+
"assigneeId": "user_456"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Update Card
|
|
84
|
+
`PATCH /api/v1/cards/[id]`
|
|
85
|
+
|
|
86
|
+
Update an existing card. Supports partial updates.
|
|
87
|
+
|
|
88
|
+
### Move Card
|
|
89
|
+
`PATCH /api/v1/cards/[id]`
|
|
90
|
+
|
|
91
|
+
Move a card to a different list (drag & drop).
|
|
92
|
+
|
|
93
|
+
**Request Body:**
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"listId": "list_newlist",
|
|
97
|
+
"position": 3
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Delete Card
|
|
102
|
+
`DELETE /api/v1/cards/[id]`
|
|
103
|
+
|
|
104
|
+
Delete a card.
|
|
105
|
+
|
|
106
|
+
## Fields
|
|
107
|
+
|
|
108
|
+
| Field | Type | Required | Default | Description |
|
|
109
|
+
|-------|------|----------|---------|-------------|
|
|
110
|
+
| title | text | Yes | - | Card title |
|
|
111
|
+
| description | textarea | No | - | Detailed description |
|
|
112
|
+
| position | number | No | 0 | Display order within list |
|
|
113
|
+
| dueDate | date | No | - | Due date |
|
|
114
|
+
| priority | select | No | - | Priority: low, medium, high, urgent |
|
|
115
|
+
| labels | multiselect | No | - | Labels: urgent, important, bug, feature, enhancement, documentation |
|
|
116
|
+
| assigneeId | reference | No | - | Assigned user ID |
|
|
117
|
+
| listId | reference | Yes | - | Parent list ID |
|
|
118
|
+
| boardId | reference | Yes | - | Parent board ID |
|
|
119
|
+
| createdAt | datetime | Auto | - | Creation timestamp |
|
|
120
|
+
| updatedAt | datetime | Auto | - | Last update timestamp |
|
|
121
|
+
|
|
122
|
+
## Labels
|
|
123
|
+
|
|
124
|
+
Cards can have multiple labels for categorization:
|
|
125
|
+
|
|
126
|
+
| Label | Description |
|
|
127
|
+
|-------|-------------|
|
|
128
|
+
| urgent | Needs immediate attention |
|
|
129
|
+
| important | High importance |
|
|
130
|
+
| bug | Bug fix needed |
|
|
131
|
+
| feature | New feature |
|
|
132
|
+
| enhancement | Improvement to existing feature |
|
|
133
|
+
| documentation | Documentation work |
|
|
134
|
+
|
|
135
|
+
## Features
|
|
136
|
+
|
|
137
|
+
- **Searchable**: title, description
|
|
138
|
+
- **Sortable**: title, position, dueDate, priority, createdAt
|
|
139
|
+
- **Filterable**: priority, labels
|
|
140
|
+
- **Drag & Drop**: Move between lists
|
|
141
|
+
- **Bulk Operations**: Supported
|
|
142
|
+
- **Shared Access**: Cards are shared within the team
|
|
143
|
+
|
|
144
|
+
## Permissions
|
|
145
|
+
|
|
146
|
+
- **Create/Update/Move**: Owner, Admin, Member
|
|
147
|
+
- **Delete**: Owner, Admin
|
|
148
|
+
|
|
149
|
+
## Error Responses
|
|
150
|
+
|
|
151
|
+
| Status | Description |
|
|
152
|
+
|--------|-------------|
|
|
153
|
+
| 400 | Bad Request - Invalid parameters |
|
|
154
|
+
| 401 | Unauthorized - Missing or invalid auth |
|
|
155
|
+
| 403 | Forbidden - Insufficient permissions |
|
|
156
|
+
| 404 | Not Found - Card, List, or Board doesn't exist |
|
|
157
|
+
| 422 | Validation Error - Invalid data |
|
|
158
|
+
|
|
159
|
+
## Related APIs
|
|
160
|
+
|
|
161
|
+
- **[Boards](/api/v1/boards)** - Parent boards
|
|
162
|
+
- **[Lists](/api/v1/lists)** - Parent lists
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Presets for Cards Entity
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { defineApiEndpoint } from '@nextsparkjs/core/types/api-presets'
|
|
6
|
+
|
|
7
|
+
export default defineApiEndpoint({
|
|
8
|
+
summary: 'Manage kanban cards (tasks) with priorities and assignments',
|
|
9
|
+
presets: [
|
|
10
|
+
{
|
|
11
|
+
id: 'list-all',
|
|
12
|
+
title: 'List All Cards',
|
|
13
|
+
description: 'Get all cards with pagination',
|
|
14
|
+
method: 'GET',
|
|
15
|
+
params: {
|
|
16
|
+
limit: 50
|
|
17
|
+
},
|
|
18
|
+
tags: ['read', 'list']
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'list-by-list',
|
|
22
|
+
title: 'List by List',
|
|
23
|
+
description: 'Get all cards for a specific list',
|
|
24
|
+
method: 'GET',
|
|
25
|
+
params: {
|
|
26
|
+
listId: '{{listId}}',
|
|
27
|
+
sortBy: 'position',
|
|
28
|
+
sortOrder: 'asc'
|
|
29
|
+
},
|
|
30
|
+
tags: ['read', 'filter']
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'list-by-board',
|
|
34
|
+
title: 'List by Board',
|
|
35
|
+
description: 'Get all cards for a specific board',
|
|
36
|
+
method: 'GET',
|
|
37
|
+
params: {
|
|
38
|
+
boardId: '{{boardId}}'
|
|
39
|
+
},
|
|
40
|
+
tags: ['read', 'filter']
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'list-my-cards',
|
|
44
|
+
title: 'List My Cards',
|
|
45
|
+
description: 'Get cards assigned to current user',
|
|
46
|
+
method: 'GET',
|
|
47
|
+
params: {
|
|
48
|
+
assigneeId: '{{userId}}'
|
|
49
|
+
},
|
|
50
|
+
tags: ['read', 'filter']
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'list-urgent',
|
|
54
|
+
title: 'List Urgent Cards',
|
|
55
|
+
description: 'Get all urgent priority cards',
|
|
56
|
+
method: 'GET',
|
|
57
|
+
params: {
|
|
58
|
+
priority: 'urgent'
|
|
59
|
+
},
|
|
60
|
+
tags: ['read', 'filter']
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'list-by-priority',
|
|
64
|
+
title: 'List by Priority',
|
|
65
|
+
description: 'Get cards filtered by priority level',
|
|
66
|
+
method: 'GET',
|
|
67
|
+
params: {
|
|
68
|
+
priority: '{{priority}}'
|
|
69
|
+
},
|
|
70
|
+
tags: ['read', 'filter']
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'search-by-title',
|
|
74
|
+
title: 'Search by Title',
|
|
75
|
+
description: 'Search cards by title',
|
|
76
|
+
method: 'GET',
|
|
77
|
+
params: {
|
|
78
|
+
search: '{{title}}'
|
|
79
|
+
},
|
|
80
|
+
tags: ['read', 'search']
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'create-card',
|
|
84
|
+
title: 'Create Card',
|
|
85
|
+
description: 'Create a new card in a list',
|
|
86
|
+
method: 'POST',
|
|
87
|
+
payload: {
|
|
88
|
+
title: 'New Card',
|
|
89
|
+
listId: '{{listId}}',
|
|
90
|
+
boardId: '{{boardId}}'
|
|
91
|
+
},
|
|
92
|
+
tags: ['write', 'create']
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'update-card',
|
|
96
|
+
title: 'Update Card',
|
|
97
|
+
description: 'Update card title and description',
|
|
98
|
+
method: 'PATCH',
|
|
99
|
+
pathParams: {
|
|
100
|
+
id: '{{id}}'
|
|
101
|
+
},
|
|
102
|
+
payload: {
|
|
103
|
+
title: '{{title}}',
|
|
104
|
+
description: '{{description}}'
|
|
105
|
+
},
|
|
106
|
+
tags: ['write', 'update']
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'move-card',
|
|
110
|
+
title: 'Move Card',
|
|
111
|
+
description: 'Move card to a different list',
|
|
112
|
+
method: 'PATCH',
|
|
113
|
+
pathParams: {
|
|
114
|
+
id: '{{id}}'
|
|
115
|
+
},
|
|
116
|
+
payload: {
|
|
117
|
+
listId: '{{newListId}}',
|
|
118
|
+
position: '{{position}}'
|
|
119
|
+
},
|
|
120
|
+
tags: ['write', 'update']
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: 'set-priority',
|
|
124
|
+
title: 'Set Priority',
|
|
125
|
+
description: 'Update card priority level',
|
|
126
|
+
method: 'PATCH',
|
|
127
|
+
pathParams: {
|
|
128
|
+
id: '{{id}}'
|
|
129
|
+
},
|
|
130
|
+
payload: {
|
|
131
|
+
priority: '{{priority}}'
|
|
132
|
+
},
|
|
133
|
+
tags: ['write', 'update']
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'assign-card',
|
|
137
|
+
title: 'Assign Card',
|
|
138
|
+
description: 'Assign card to a team member',
|
|
139
|
+
method: 'PATCH',
|
|
140
|
+
pathParams: {
|
|
141
|
+
id: '{{id}}'
|
|
142
|
+
},
|
|
143
|
+
payload: {
|
|
144
|
+
assigneeId: '{{userId}}'
|
|
145
|
+
},
|
|
146
|
+
tags: ['write', 'update']
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: 'set-due-date',
|
|
150
|
+
title: 'Set Due Date',
|
|
151
|
+
description: 'Set or update card due date',
|
|
152
|
+
method: 'PATCH',
|
|
153
|
+
pathParams: {
|
|
154
|
+
id: '{{id}}'
|
|
155
|
+
},
|
|
156
|
+
payload: {
|
|
157
|
+
dueDate: '{{dueDate}}'
|
|
158
|
+
},
|
|
159
|
+
tags: ['write', 'update']
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: 'delete-card',
|
|
163
|
+
title: 'Delete Card',
|
|
164
|
+
description: 'Delete a card',
|
|
165
|
+
method: 'DELETE',
|
|
166
|
+
pathParams: {
|
|
167
|
+
id: '{{id}}'
|
|
168
|
+
},
|
|
169
|
+
tags: ['write', 'delete']
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
})
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Lists API
|
|
2
|
+
|
|
3
|
+
Manage columns within boards (To Do, In Progress, Done, etc.).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Lists API allows you to create, read, update, and delete list records. Lists are the columns within a board that organize cards in a Kanban workflow.
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All endpoints require authentication via:
|
|
12
|
+
- **Session cookie** (for browser-based requests)
|
|
13
|
+
- **API Key** header (for server-to-server requests)
|
|
14
|
+
|
|
15
|
+
## Endpoints
|
|
16
|
+
|
|
17
|
+
### List Lists
|
|
18
|
+
`GET /api/v1/lists`
|
|
19
|
+
|
|
20
|
+
Returns a paginated list of lists.
|
|
21
|
+
|
|
22
|
+
**Query Parameters:**
|
|
23
|
+
- `limit` (number, optional): Maximum records to return. Default: 20
|
|
24
|
+
- `offset` (number, optional): Number of records to skip. Default: 0
|
|
25
|
+
- `boardId` (string, optional): Filter by parent board
|
|
26
|
+
- `search` (string, optional): Search by name
|
|
27
|
+
- `sortBy` (string, optional): Field to sort by. Default: position
|
|
28
|
+
- `sortOrder` (string, optional): Sort direction (asc, desc)
|
|
29
|
+
|
|
30
|
+
**Example Response:**
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"data": [
|
|
34
|
+
{
|
|
35
|
+
"id": "list_abc123",
|
|
36
|
+
"name": "To Do",
|
|
37
|
+
"position": 1,
|
|
38
|
+
"boardId": "board_xyz789",
|
|
39
|
+
"createdAt": "2024-01-15T10:30:00Z",
|
|
40
|
+
"updatedAt": "2024-01-15T10:30:00Z"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "list_def456",
|
|
44
|
+
"name": "In Progress",
|
|
45
|
+
"position": 2,
|
|
46
|
+
"boardId": "board_xyz789",
|
|
47
|
+
"createdAt": "2024-01-15T10:30:00Z",
|
|
48
|
+
"updatedAt": "2024-01-15T10:30:00Z"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "list_ghi789",
|
|
52
|
+
"name": "Done",
|
|
53
|
+
"position": 3,
|
|
54
|
+
"boardId": "board_xyz789",
|
|
55
|
+
"createdAt": "2024-01-15T10:30:00Z",
|
|
56
|
+
"updatedAt": "2024-01-15T10:30:00Z"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"pagination": {
|
|
60
|
+
"total": 3,
|
|
61
|
+
"limit": 20,
|
|
62
|
+
"offset": 0
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Get Single List
|
|
68
|
+
`GET /api/v1/lists/[id]`
|
|
69
|
+
|
|
70
|
+
Returns a single list by ID.
|
|
71
|
+
|
|
72
|
+
### Create List
|
|
73
|
+
`POST /api/v1/lists`
|
|
74
|
+
|
|
75
|
+
Create a new list.
|
|
76
|
+
|
|
77
|
+
**Request Body:**
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"name": "Review",
|
|
81
|
+
"boardId": "board_xyz789",
|
|
82
|
+
"position": 4
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Update List
|
|
87
|
+
`PATCH /api/v1/lists/[id]`
|
|
88
|
+
|
|
89
|
+
Update an existing list. Supports partial updates.
|
|
90
|
+
|
|
91
|
+
### Reorder Lists
|
|
92
|
+
`PATCH /api/v1/lists/[id]`
|
|
93
|
+
|
|
94
|
+
Update list position for drag & drop reordering.
|
|
95
|
+
|
|
96
|
+
**Request Body:**
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"position": 2
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Delete List
|
|
104
|
+
`DELETE /api/v1/lists/[id]`
|
|
105
|
+
|
|
106
|
+
Delete a list. This will also delete all cards within the list.
|
|
107
|
+
|
|
108
|
+
## Fields
|
|
109
|
+
|
|
110
|
+
| Field | Type | Required | Default | Description |
|
|
111
|
+
|-------|------|----------|---------|-------------|
|
|
112
|
+
| name | text | Yes | - | List name |
|
|
113
|
+
| position | number | No | 0 | Display order within board |
|
|
114
|
+
| boardId | reference | Yes | - | Parent board ID |
|
|
115
|
+
| createdAt | datetime | Auto | - | Creation timestamp |
|
|
116
|
+
| updatedAt | datetime | Auto | - | Last update timestamp |
|
|
117
|
+
|
|
118
|
+
## Features
|
|
119
|
+
|
|
120
|
+
- **Searchable**: name
|
|
121
|
+
- **Sortable**: name, position, createdAt
|
|
122
|
+
- **Drag & Drop**: Update position for reordering
|
|
123
|
+
- **Cascade Delete**: Deleting a list removes all its cards
|
|
124
|
+
|
|
125
|
+
## Permissions
|
|
126
|
+
|
|
127
|
+
- **Create/Update/Delete**: Owner, Admin, Member
|
|
128
|
+
- **Delete**: Owner, Admin
|
|
129
|
+
|
|
130
|
+
## Error Responses
|
|
131
|
+
|
|
132
|
+
| Status | Description |
|
|
133
|
+
|--------|-------------|
|
|
134
|
+
| 400 | Bad Request - Invalid parameters |
|
|
135
|
+
| 401 | Unauthorized - Missing or invalid auth |
|
|
136
|
+
| 403 | Forbidden - Insufficient permissions |
|
|
137
|
+
| 404 | Not Found - List or Board doesn't exist |
|
|
138
|
+
| 422 | Validation Error - Invalid data |
|
|
139
|
+
|
|
140
|
+
## Related APIs
|
|
141
|
+
|
|
142
|
+
- **[Boards](/api/v1/boards)** - Parent boards
|
|
143
|
+
- **[Cards](/api/v1/cards)** - Cards within lists
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Presets for Lists Entity
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { defineApiEndpoint } from '@nextsparkjs/core/types/api-presets'
|
|
6
|
+
|
|
7
|
+
export default defineApiEndpoint({
|
|
8
|
+
summary: 'Manage kanban lists (columns) within boards',
|
|
9
|
+
presets: [
|
|
10
|
+
{
|
|
11
|
+
id: 'list-all',
|
|
12
|
+
title: 'List All Lists',
|
|
13
|
+
description: 'Get all lists with pagination',
|
|
14
|
+
method: 'GET',
|
|
15
|
+
params: {
|
|
16
|
+
limit: 50
|
|
17
|
+
},
|
|
18
|
+
tags: ['read', 'list']
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'list-by-board',
|
|
22
|
+
title: 'List by Board',
|
|
23
|
+
description: 'Get all lists for a specific board',
|
|
24
|
+
method: 'GET',
|
|
25
|
+
params: {
|
|
26
|
+
boardId: '{{boardId}}',
|
|
27
|
+
sortBy: 'position',
|
|
28
|
+
sortOrder: 'asc'
|
|
29
|
+
},
|
|
30
|
+
tags: ['read', 'filter']
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'create-list',
|
|
34
|
+
title: 'Create List',
|
|
35
|
+
description: 'Create a new list in a board',
|
|
36
|
+
method: 'POST',
|
|
37
|
+
payload: {
|
|
38
|
+
name: 'New List',
|
|
39
|
+
boardId: '{{boardId}}',
|
|
40
|
+
position: 0
|
|
41
|
+
},
|
|
42
|
+
tags: ['write', 'create']
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'rename-list',
|
|
46
|
+
title: 'Rename List',
|
|
47
|
+
description: 'Rename an existing list',
|
|
48
|
+
method: 'PATCH',
|
|
49
|
+
pathParams: {
|
|
50
|
+
id: '{{id}}'
|
|
51
|
+
},
|
|
52
|
+
payload: {
|
|
53
|
+
name: '{{name}}'
|
|
54
|
+
},
|
|
55
|
+
tags: ['write', 'update']
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'reorder-list',
|
|
59
|
+
title: 'Reorder List',
|
|
60
|
+
description: 'Update list position within board',
|
|
61
|
+
method: 'PATCH',
|
|
62
|
+
pathParams: {
|
|
63
|
+
id: '{{id}}'
|
|
64
|
+
},
|
|
65
|
+
payload: {
|
|
66
|
+
position: '{{position}}'
|
|
67
|
+
},
|
|
68
|
+
tags: ['write', 'update']
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'delete-list',
|
|
72
|
+
title: 'Delete List',
|
|
73
|
+
description: 'Delete a list and all its cards',
|
|
74
|
+
method: 'DELETE',
|
|
75
|
+
pathParams: {
|
|
76
|
+
id: '{{id}}'
|
|
77
|
+
},
|
|
78
|
+
tags: ['write', 'delete']
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
})
|
package/lib/selectors.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - Cypress tests (via tests/cypress/src/selectors.ts)
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { createSelectorHelpers, CORE_SELECTORS } from '@nextsparkjs/
|
|
12
|
+
import { createSelectorHelpers, CORE_SELECTORS } from '@nextsparkjs/core/selectors'
|
|
13
13
|
|
|
14
14
|
// =============================================================================
|
|
15
15
|
// BLOCK SELECTORS
|
|
@@ -201,5 +201,5 @@ export type ThemeSelectorsType = typeof THEME_SELECTORS
|
|
|
201
201
|
export type BlockSelectorsType = typeof BLOCK_SELECTORS
|
|
202
202
|
export type EntitySelectorsType = typeof ENTITY_SELECTORS
|
|
203
203
|
export type KanbanSelectorsType = typeof KANBAN_SELECTORS
|
|
204
|
-
export type { Replacements } from '@nextsparkjs/
|
|
204
|
+
export type { Replacements } from '@nextsparkjs/core/selectors'
|
|
205
205
|
export { CORE_SELECTORS }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextsparkjs/theme-productivity",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.46",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./config/theme.config.ts",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"react": "^19.0.0",
|
|
13
13
|
"react-dom": "^19.0.0",
|
|
14
14
|
"zod": "^4.0.0",
|
|
15
|
-
"@nextsparkjs/core": "0.1.0-beta.
|
|
16
|
-
"@nextsparkjs/testing": "0.1.0-beta.
|
|
15
|
+
"@nextsparkjs/core": "0.1.0-beta.46",
|
|
16
|
+
"@nextsparkjs/testing": "0.1.0-beta.46"
|
|
17
17
|
},
|
|
18
18
|
"nextspark": {
|
|
19
19
|
"type": "theme",
|
package/styles/globals.css
CHANGED
|
@@ -3,10 +3,22 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Clean, modern design focused on productivity.
|
|
5
5
|
* Blue-tinted palette with clear visual hierarchy.
|
|
6
|
+
*
|
|
7
|
+
* ÚNICA FUENTE DE VERDAD para estilos del theme.
|
|
8
|
+
* Editar este archivo para customizar el design system.
|
|
6
9
|
*/
|
|
7
10
|
|
|
11
|
+
/* =============================================
|
|
12
|
+
IMPORTS
|
|
13
|
+
============================================= */
|
|
14
|
+
@import "tailwindcss";
|
|
15
|
+
@import "@nextsparkjs/core/styles/ui.css";
|
|
16
|
+
@import "@nextsparkjs/core/styles/utilities.css";
|
|
17
|
+
@import "@nextsparkjs/core/styles/docs.css";
|
|
18
|
+
@source "../../../**/*.{js,ts,jsx,tsx}";
|
|
19
|
+
|
|
8
20
|
/* ============================================================================
|
|
9
|
-
|
|
21
|
+
PRODUCTIVITY THEME - LIGHT MODE
|
|
10
22
|
============================================================================ */
|
|
11
23
|
|
|
12
24
|
:root {
|
|
@@ -249,7 +261,13 @@
|
|
|
249
261
|
Base Styles
|
|
250
262
|
============================================================================ */
|
|
251
263
|
|
|
264
|
+
* {
|
|
265
|
+
border-color: var(--border);
|
|
266
|
+
}
|
|
267
|
+
|
|
252
268
|
body {
|
|
269
|
+
background-color: var(--background);
|
|
270
|
+
color: var(--foreground);
|
|
253
271
|
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
|
|
254
272
|
}
|
|
255
273
|
|