Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
010a1d07d9 | ||
|
|
94d09b0014 | ||
|
|
d6ff442622 | ||
|
|
f7cc1abc8e | ||
|
|
bf7b1789ec | ||
|
|
cf9b482546 | ||
|
|
ad6da9bf37 | ||
|
|
d647884b91 | ||
|
|
0adde3e06d |
No files matched your search
@@ -1,3 +1,19 @@
|
||||
# v4.90 2021-01-28 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Create unique board names when importing](https://github.com/wekan/wekan/pull/3499).
|
||||
Thanks to jrsupplee.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Added missing backtick quotes](https://github.com/wekan/wekan/commit/bf7b1789ec16e3c52397318c799ec5a0fc2de3a5).
|
||||
Thanks to xet7.
|
||||
- [Fix some bugs when importing Wekan JSON](https://github.com/wekan/wekan/pull/3500).
|
||||
Thanks to jrsupplee.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.89 2021-01-28 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v4.89.0"
|
||||
appVersion: "v4.90.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -129,7 +129,7 @@ BlazeComponent.extendComponent({
|
||||
{
|
||||
sort: Boards.find({ archived: false }).count(),
|
||||
type: 'board',
|
||||
title: Boards.findOne(this.currentData()._id).copyTitle(),
|
||||
title: Boards.findOne(this.currentData()._id).title,
|
||||
},
|
||||
(err, res) => {
|
||||
if (err) {
|
||||
|
||||
@@ -13,38 +13,41 @@ template(name="import")
|
||||
template(name="importTextarea")
|
||||
form
|
||||
p: label(for='import-textarea') {{_ instruction}} {{_ 'import-board-instruction-about-errors'}}
|
||||
textarea.js-import-json(placeholder="{{_ importPlaceHolder}}" autofocus)
|
||||
textarea.js-import-json(id='import-textarea' placeholder="{{_ importPlaceHolder}}" autofocus)
|
||||
| {{jsonText}}
|
||||
input.primary.wide(type="submit" value="{{_ 'import'}}")
|
||||
|
||||
template(name="importMapMembers")
|
||||
h2 {{_ 'import-map-members'}}
|
||||
.map-members
|
||||
p {{_ 'import-members-map'}}
|
||||
.mapping-list
|
||||
each members
|
||||
a.mapping-item.js-select-member(class="{{#if wekanId}}filled{{/if}}")
|
||||
.profile-source
|
||||
.full-name= fullName
|
||||
.username
|
||||
| ({{username}})
|
||||
.wekan
|
||||
if wekanId
|
||||
+userAvatar(userId=wekanId)
|
||||
else
|
||||
a.member.add-member
|
||||
i.fa.fa-plus
|
||||
//-
|
||||
Due to the way the flewbox layout is working, we need to set some
|
||||
invisible items so that the last row items have a consistent width.
|
||||
See http://jsfiddle.net/Ln4h3c4n/ for an minimal example of the issue.
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
form
|
||||
input.primary.wide(type="submit" value="{{_ 'done'}}")
|
||||
if usersLoaded.get
|
||||
.map-members
|
||||
p {{_ 'import-members-map'}}
|
||||
.mapping-list
|
||||
each members
|
||||
a.mapping-item.js-select-member(class="{{#if wekanId}}filled{{/if}}")
|
||||
.profile-source
|
||||
.full-name= fullName
|
||||
.username
|
||||
| ({{username}})
|
||||
.wekan
|
||||
if wekanId
|
||||
+userAvatar(userId=wekanId)
|
||||
else
|
||||
a.member.add-member
|
||||
i.fa.fa-plus
|
||||
//-
|
||||
Due to the way the flewbox layout is working, we need to set some
|
||||
invisible items so that the last row items have a consistent width.
|
||||
See http://jsfiddle.net/Ln4h3c4n/ for an minimal example of the issue.
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
.mapping-item.ghost-item
|
||||
form
|
||||
input.primary.wide(type="submit" value="{{_ 'done'}}")
|
||||
else
|
||||
+spinner
|
||||
|
||||
template(name="importMapMembersAddPopup")
|
||||
.select-member
|
||||
|
||||
@@ -150,14 +150,39 @@ BlazeComponent.extendComponent({
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.usersLoaded = new ReactiveVar(false);
|
||||
|
||||
this.autorun(() => {
|
||||
this.parentComponent()
|
||||
.membersToMap.get()
|
||||
.forEach(({ wekanId }) => {
|
||||
if (wekanId) {
|
||||
this.subscribe('user-miniprofile', wekanId);
|
||||
const handle = this.subscribe(
|
||||
'user-miniprofile',
|
||||
this.members().map(member => {
|
||||
return member.username;
|
||||
}),
|
||||
);
|
||||
Tracker.nonreactive(() => {
|
||||
Tracker.autorun(() => {
|
||||
if (
|
||||
handle.ready() &&
|
||||
!this.usersLoaded.get() &&
|
||||
this.members().length
|
||||
) {
|
||||
this._refreshMembers(
|
||||
this.members().map(member => {
|
||||
if (!member.wekanId) {
|
||||
const user = Users.findOne({ username: member.username });
|
||||
if (user) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('found username:', user.username);
|
||||
member.wekanId = user._id;
|
||||
}
|
||||
}
|
||||
return member;
|
||||
}),
|
||||
);
|
||||
}
|
||||
this.usersLoaded.set(handle.ready());
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
+19
-14
@@ -510,6 +510,7 @@ Boards.helpers({
|
||||
const oldId = this._id;
|
||||
delete this._id;
|
||||
delete this.slug;
|
||||
this.title = this.copyTitle();
|
||||
const _id = Boards.insert(this);
|
||||
|
||||
// Copy all swimlanes in board
|
||||
@@ -569,20 +570,7 @@ Boards.helpers({
|
||||
* @returns {string|null}
|
||||
*/
|
||||
copyTitle() {
|
||||
const m = this.title.match(/^(?<title>.*?)\s*(\[(?<num>\d+)]\s*$|\s*$)/);
|
||||
const title = escapeForRegex(m.groups.title);
|
||||
let num = 0;
|
||||
Boards.find({ title: new RegExp(`^${title}\\s*\\[\\d+]\\s*$`) }).forEach(
|
||||
board => {
|
||||
const m = board.title.match(/^(?<title>.*?)\s*\[(?<num>\d+)]\s*$/);
|
||||
if (m) {
|
||||
const n = parseInt(m.groups.num, 10);
|
||||
num = num < n ? n : num;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
return `${title} [${num + 1}]`;
|
||||
return Boards.uniqueTitle(this.title);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -1274,6 +1262,23 @@ function boardRemover(userId, doc) {
|
||||
);
|
||||
}
|
||||
|
||||
Boards.uniqueTitle = title => {
|
||||
const m = title.match(`/^(?<title>.*?)\s*(\[(?<num>\d+)]\s*$|\s*$)/`);
|
||||
const base = escapeForRegex(m.groups.title);
|
||||
let num = 0;
|
||||
Boards.find({ title: new RegExp(`^${base}\\s*\\[\\d+]\\s*$`) }).forEach(
|
||||
board => {
|
||||
const m = board.title.match(`/^(?<title>.*?)\s*\[(?<num>\d+)]\s*$/`);
|
||||
if (m) {
|
||||
const n = parseInt(m.groups.num, 10);
|
||||
num = num < n ? n : num;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
return `${base} [${num + 1}]`;
|
||||
};
|
||||
|
||||
Boards.userSearch = (
|
||||
userId,
|
||||
selector = {},
|
||||
|
||||
@@ -69,24 +69,28 @@ CustomFields.attachSchema(
|
||||
* should we show on the cards this custom field
|
||||
*/
|
||||
type: Boolean,
|
||||
defaultValue: false,
|
||||
},
|
||||
automaticallyOnCard: {
|
||||
/**
|
||||
* should the custom fields automatically be added on cards?
|
||||
*/
|
||||
type: Boolean,
|
||||
defaultValue: false,
|
||||
},
|
||||
alwaysOnCard: {
|
||||
/**
|
||||
* should the custom field be automatically added to all cards?
|
||||
*/
|
||||
type: Boolean,
|
||||
defaultValue: false,
|
||||
},
|
||||
showLabelOnMiniCard: {
|
||||
/**
|
||||
* should the label of the custom field be shown on minicards?
|
||||
*/
|
||||
type: Boolean,
|
||||
defaultValue: false,
|
||||
},
|
||||
createdAt: {
|
||||
type: Date,
|
||||
|
||||
@@ -177,7 +177,7 @@ export class TrelloCreator {
|
||||
permission: this.getPermission(trelloBoard.prefs.permissionLevel),
|
||||
slug: getSlug(trelloBoard.name) || 'board',
|
||||
stars: 0,
|
||||
title: trelloBoard.name,
|
||||
title: Boards.uniqueTitle(trelloBoard.name),
|
||||
};
|
||||
// now add other members
|
||||
if (trelloBoard.memberships) {
|
||||
|
||||
@@ -253,13 +253,14 @@ export class WekanCreator {
|
||||
permission: boardToImport.permission,
|
||||
slug: getSlug(boardToImport.title) || 'board',
|
||||
stars: 0,
|
||||
title: boardToImport.title,
|
||||
title: Boards.uniqueTitle(boardToImport.title),
|
||||
};
|
||||
// now add other members
|
||||
if (boardToImport.members) {
|
||||
boardToImport.members.forEach(wekanMember => {
|
||||
// do we already have it in our list?
|
||||
// is it defined and do we already have it in our list?
|
||||
if (
|
||||
wekanMember.wekanId &&
|
||||
!boardToCreate.members.some(
|
||||
member => member.wekanId === wekanMember.wekanId,
|
||||
)
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v4.89.0",
|
||||
"version": "v4.90.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v4.89.0",
|
||||
"version": "v4.90.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
+2696
-183
File diff suppressed because it is too large.
Load diff
+624
-1
@@ -1,7 +1,7 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v4.89
|
||||
version: v4.90
|
||||
description: |
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
@@ -134,6 +134,198 @@ paths:
|
||||
description: |
|
||||
Error in registration
|
||||
|
||||
/api/boards:
|
||||
get:
|
||||
operationId: get_public_boards
|
||||
summary: Get all public boards
|
||||
tags:
|
||||
- Boards
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
_id:
|
||||
type: string
|
||||
title:
|
||||
type: string
|
||||
post:
|
||||
operationId: new_board
|
||||
summary: Create a board
|
||||
description: |
|
||||
This allows to create a board.
|
||||
|
||||
The color has to be chosen between `belize`, `nephritis`, `pomegranate`,
|
||||
`pumpkin`, `wisteria`, `moderatepink`, `strongcyan`,
|
||||
`limegreen`, `midnight`, `dark`, `relax`, `corteza`:
|
||||
|
||||
<img src="https://wekan.github.io/board-colors.png" width="40%" alt="Wekan logo" />
|
||||
tags:
|
||||
- Boards
|
||||
consumes:
|
||||
- multipart/form-data
|
||||
- application/json
|
||||
parameters:
|
||||
- name: title
|
||||
in: formData
|
||||
description: |
|
||||
the new title of the board
|
||||
type: string
|
||||
required: true
|
||||
- name: owner
|
||||
in: formData
|
||||
description: |
|
||||
"ABCDE12345" <= User ID in Wekan.
|
||||
(Not username or email)
|
||||
type: string
|
||||
required: true
|
||||
- name: isAdmin
|
||||
in: formData
|
||||
description: |
|
||||
is the owner an admin of the board (default true)
|
||||
type: boolean
|
||||
required: false
|
||||
- name: isActive
|
||||
in: formData
|
||||
description: |
|
||||
is the board active (default true)
|
||||
type: boolean
|
||||
required: false
|
||||
- name: isNoComments
|
||||
in: formData
|
||||
description: |
|
||||
disable comments (default false)
|
||||
type: boolean
|
||||
required: false
|
||||
- name: isCommentOnly
|
||||
in: formData
|
||||
description: |
|
||||
only enable comments (default false)
|
||||
type: boolean
|
||||
required: false
|
||||
- name: isWorker
|
||||
in: formData
|
||||
description: |
|
||||
only move cards, assign himself to card and comment (default false)
|
||||
type: boolean
|
||||
required: false
|
||||
- name: permission
|
||||
in: formData
|
||||
description: |
|
||||
"private" board <== Set to "public" if you
|
||||
want public Wekan board
|
||||
type: string
|
||||
required: false
|
||||
- name: color
|
||||
in: formData
|
||||
description: |
|
||||
the color of the board
|
||||
type: string
|
||||
required: false
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
_id:
|
||||
type: string
|
||||
defaultSwimlaneId:
|
||||
type: string
|
||||
/api/boards/{board}:
|
||||
get:
|
||||
operationId: get_board
|
||||
summary: Get the board with that particular ID
|
||||
tags:
|
||||
- Boards
|
||||
parameters:
|
||||
- name: board
|
||||
in: path
|
||||
description: |
|
||||
the ID of the board to retrieve the data
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
$ref: "#/definitions/Boards"
|
||||
delete:
|
||||
operationId: delete_board
|
||||
summary: Delete a board
|
||||
tags:
|
||||
- Boards
|
||||
parameters:
|
||||
- name: board
|
||||
in: path
|
||||
description: |
|
||||
the ID of the board
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
/api/boards/{board}/attachments:
|
||||
get:
|
||||
operationId: get_board_attachments
|
||||
summary: Get the list of attachments of a board
|
||||
tags:
|
||||
- Boards
|
||||
parameters:
|
||||
- name: board
|
||||
in: path
|
||||
description: |
|
||||
the board ID
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
attachmentId:
|
||||
type: string
|
||||
attachmentName:
|
||||
type: string
|
||||
attachmentType:
|
||||
type: string
|
||||
cardId:
|
||||
type: string
|
||||
listId:
|
||||
type: string
|
||||
swimlaneId:
|
||||
type: string
|
||||
/api/boards/{board}/cards/{card}/checklists:
|
||||
get:
|
||||
operationId: get_all_checklists
|
||||
@@ -1096,6 +1288,40 @@ paths:
|
||||
200 response
|
||||
schema:
|
||||
$ref: "#/definitions/Integrations"
|
||||
/api/boards/{board}/labels:
|
||||
put:
|
||||
operationId: add_board_label
|
||||
summary: Add a label to a board
|
||||
description: |
|
||||
If the board doesn't have the name/color label, this function
|
||||
adds the label to the board.
|
||||
tags:
|
||||
- Boards
|
||||
consumes:
|
||||
- multipart/form-data
|
||||
- application/json
|
||||
parameters:
|
||||
- name: label
|
||||
in: formData
|
||||
description: the label value
|
||||
type: string
|
||||
required: true
|
||||
- name: board
|
||||
in: path
|
||||
description: |
|
||||
the board
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
type: string
|
||||
/api/boards/{board}/lists:
|
||||
get:
|
||||
operationId: get_all_lists
|
||||
@@ -1577,6 +1803,61 @@ paths:
|
||||
properties:
|
||||
_id:
|
||||
type: string
|
||||
/api/boards/{board}/members/{member}:
|
||||
post:
|
||||
operationId: set_board_member_permission
|
||||
summary: Change the permission of a member of a board
|
||||
tags:
|
||||
- Boards
|
||||
- Users
|
||||
consumes:
|
||||
- multipart/form-data
|
||||
- application/json
|
||||
parameters:
|
||||
- name: isAdmin
|
||||
in: formData
|
||||
description: |
|
||||
admin capability
|
||||
type: boolean
|
||||
required: true
|
||||
- name: isNoComments
|
||||
in: formData
|
||||
description: |
|
||||
NoComments capability
|
||||
type: boolean
|
||||
required: true
|
||||
- name: isCommentOnly
|
||||
in: formData
|
||||
description: |
|
||||
CommentsOnly capability
|
||||
type: boolean
|
||||
required: true
|
||||
- name: isWorker
|
||||
in: formData
|
||||
description: |
|
||||
Worker capability
|
||||
type: boolean
|
||||
required: true
|
||||
- name: board
|
||||
in: path
|
||||
description: |
|
||||
the ID of the board that we are changing
|
||||
type: string
|
||||
required: true
|
||||
- name: member
|
||||
in: path
|
||||
description: |
|
||||
the ID of the user to change permissions
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
/api/boards/{board}/members/{user}/add:
|
||||
post:
|
||||
operationId: add_board_member
|
||||
@@ -2033,7 +2314,349 @@ paths:
|
||||
properties:
|
||||
_id:
|
||||
type: string
|
||||
/api/users/{user}/boards:
|
||||
get:
|
||||
operationId: get_boards_from_user
|
||||
summary: Get all boards attached to a user
|
||||
tags:
|
||||
- Boards
|
||||
parameters:
|
||||
- name: user
|
||||
in: path
|
||||
description: |
|
||||
the ID of the user to retrieve the data
|
||||
type: string
|
||||
required: true
|
||||
produces:
|
||||
- application/json
|
||||
security:
|
||||
- UserSecurity: []
|
||||
responses:
|
||||
'200':
|
||||
description: |-
|
||||
200 response
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
_id:
|
||||
type: string
|
||||
title:
|
||||
type: string
|
||||
definitions:
|
||||
Boards:
|
||||
type: object
|
||||
description: This is a Board.
|
||||
properties:
|
||||
title:
|
||||
description: |
|
||||
The title of the board
|
||||
type: string
|
||||
slug:
|
||||
description: |
|
||||
The title slugified.
|
||||
type: string
|
||||
archived:
|
||||
description: |
|
||||
Is the board archived?
|
||||
type: boolean
|
||||
createdAt:
|
||||
description: |
|
||||
Creation time of the board
|
||||
type: string
|
||||
modifiedAt:
|
||||
description: |
|
||||
Last modification time of the board
|
||||
type: string
|
||||
x-nullable: true
|
||||
stars:
|
||||
description: |
|
||||
How many stars the board has
|
||||
type: number
|
||||
labels:
|
||||
description: |
|
||||
List of labels attached to a board
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/definitions/BoardsLabels"
|
||||
members:
|
||||
description: |
|
||||
List of members of a board
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/definitions/BoardsMembers"
|
||||
permission:
|
||||
description: |
|
||||
visibility of the board
|
||||
type: string
|
||||
enum:
|
||||
- public
|
||||
- private
|
||||
color:
|
||||
description: |
|
||||
The color of the board.
|
||||
type: string
|
||||
enum:
|
||||
- belize
|
||||
- nephritis
|
||||
- pomegranate
|
||||
- pumpkin
|
||||
- wisteria
|
||||
- moderatepink
|
||||
- strongcyan
|
||||
- limegreen
|
||||
- midnight
|
||||
- dark
|
||||
- relax
|
||||
- corteza
|
||||
- clearblue
|
||||
- natural
|
||||
- modern
|
||||
- moderndark
|
||||
description:
|
||||
description: |
|
||||
The description of the board
|
||||
type: string
|
||||
x-nullable: true
|
||||
subtasksDefaultBoardId:
|
||||
description: |
|
||||
The default board ID assigned to subtasks.
|
||||
type: string
|
||||
x-nullable: true
|
||||
subtasksDefaultListId:
|
||||
description: |
|
||||
The default List ID assigned to subtasks.
|
||||
type: string
|
||||
x-nullable: true
|
||||
dateSettingsDefaultBoardId:
|
||||
type: string
|
||||
x-nullable: true
|
||||
dateSettingsDefaultListId:
|
||||
type: string
|
||||
x-nullable: true
|
||||
allowsSubtasks:
|
||||
description: |
|
||||
Does the board allows subtasks?
|
||||
type: boolean
|
||||
allowsAttachments:
|
||||
description: |
|
||||
Does the board allows attachments?
|
||||
type: boolean
|
||||
allowsChecklists:
|
||||
description: |
|
||||
Does the board allows checklists?
|
||||
type: boolean
|
||||
allowsComments:
|
||||
description: |
|
||||
Does the board allows comments?
|
||||
type: boolean
|
||||
allowsDescriptionTitle:
|
||||
description: |
|
||||
Does the board allows description title?
|
||||
type: boolean
|
||||
allowsDescriptionText:
|
||||
description: |
|
||||
Does the board allows description text?
|
||||
type: boolean
|
||||
allowsActivities:
|
||||
description: |
|
||||
Does the board allows comments?
|
||||
type: boolean
|
||||
allowsLabels:
|
||||
description: |
|
||||
Does the board allows labels?
|
||||
type: boolean
|
||||
allowsAssignee:
|
||||
description: |
|
||||
Does the board allows assignee?
|
||||
type: boolean
|
||||
allowsMembers:
|
||||
description: |
|
||||
Does the board allows members?
|
||||
type: boolean
|
||||
allowsRequestedBy:
|
||||
description: |
|
||||
Does the board allows requested by?
|
||||
type: boolean
|
||||
allowsAssignedBy:
|
||||
description: |
|
||||
Does the board allows requested by?
|
||||
type: boolean
|
||||
allowsReceivedDate:
|
||||
description: |
|
||||
Does the board allows received date?
|
||||
type: boolean
|
||||
allowsStartDate:
|
||||
description: |
|
||||
Does the board allows start date?
|
||||
type: boolean
|
||||
allowsEndDate:
|
||||
description: |
|
||||
Does the board allows end date?
|
||||
type: boolean
|
||||
allowsDueDate:
|
||||
description: |
|
||||
Does the board allows due date?
|
||||
type: boolean
|
||||
presentParentTask:
|
||||
description: |
|
||||
Controls how to present the parent task:
|
||||
|
||||
- `prefix-with-full-path`: add a prefix with the full path
|
||||
- `prefix-with-parent`: add a prefisx with the parent name
|
||||
- `subtext-with-full-path`: add a subtext with the full path
|
||||
- `subtext-with-parent`: add a subtext with the parent name
|
||||
- `no-parent`: does not show the parent at all
|
||||
type: string
|
||||
enum:
|
||||
- prefix-with-full-path
|
||||
- prefix-with-parent
|
||||
- subtext-with-full-path
|
||||
- subtext-with-parent
|
||||
- no-parent
|
||||
x-nullable: true
|
||||
startAt:
|
||||
description: |
|
||||
Starting date of the board.
|
||||
type: string
|
||||
x-nullable: true
|
||||
dueAt:
|
||||
description: |
|
||||
Due date of the board.
|
||||
type: string
|
||||
x-nullable: true
|
||||
endAt:
|
||||
description: |
|
||||
End date of the board.
|
||||
type: string
|
||||
x-nullable: true
|
||||
spentTime:
|
||||
description: |
|
||||
Time spent in the board.
|
||||
type: number
|
||||
x-nullable: true
|
||||
isOvertime:
|
||||
description: |
|
||||
Is the board overtimed?
|
||||
type: boolean
|
||||
x-nullable: true
|
||||
type:
|
||||
description: |
|
||||
The type of board
|
||||
type: string
|
||||
sort:
|
||||
description: |
|
||||
Sort value
|
||||
type: number
|
||||
required:
|
||||
- title
|
||||
- slug
|
||||
- archived
|
||||
- createdAt
|
||||
- stars
|
||||
- labels
|
||||
- members
|
||||
- permission
|
||||
- color
|
||||
- allowsSubtasks
|
||||
- allowsAttachments
|
||||
- allowsChecklists
|
||||
- allowsComments
|
||||
- allowsDescriptionTitle
|
||||
- allowsDescriptionText
|
||||
- allowsActivities
|
||||
- allowsLabels
|
||||
- allowsAssignee
|
||||
- allowsMembers
|
||||
- allowsRequestedBy
|
||||
- allowsAssignedBy
|
||||
- allowsReceivedDate
|
||||
- allowsStartDate
|
||||
- allowsEndDate
|
||||
- allowsDueDate
|
||||
- type
|
||||
- sort
|
||||
BoardsLabels:
|
||||
type: object
|
||||
properties:
|
||||
_id:
|
||||
description: |
|
||||
Unique id of a label
|
||||
type: string
|
||||
name:
|
||||
description: |
|
||||
Name of a label
|
||||
type: string
|
||||
color:
|
||||
description: |
|
||||
color of a label.
|
||||
|
||||
Can be amongst `green`, `yellow`, `orange`, `red`, `purple`,
|
||||
`blue`, `sky`, `lime`, `pink`, `black`,
|
||||
`silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`,
|
||||
`slateblue`, `magenta`, `gold`, `navy`, `gray`,
|
||||
`saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`
|
||||
type: string
|
||||
enum:
|
||||
- green
|
||||
- yellow
|
||||
- orange
|
||||
- red
|
||||
- purple
|
||||
- blue
|
||||
- sky
|
||||
- lime
|
||||
- pink
|
||||
- black
|
||||
- silver
|
||||
- peachpuff
|
||||
- crimson
|
||||
- plum
|
||||
- darkgreen
|
||||
- slateblue
|
||||
- magenta
|
||||
- gold
|
||||
- navy
|
||||
- gray
|
||||
- saddlebrown
|
||||
- paleturquoise
|
||||
- mistyrose
|
||||
- indigo
|
||||
required:
|
||||
- _id
|
||||
- color
|
||||
BoardsMembers:
|
||||
type: object
|
||||
properties:
|
||||
userId:
|
||||
description: |
|
||||
The uniq ID of the member
|
||||
type: string
|
||||
isAdmin:
|
||||
description: |
|
||||
Is the member an admin of the board?
|
||||
type: boolean
|
||||
isActive:
|
||||
description: |
|
||||
Is the member active?
|
||||
type: boolean
|
||||
isNoComments:
|
||||
description: |
|
||||
Is the member not allowed to make comments
|
||||
type: boolean
|
||||
isCommentOnly:
|
||||
description: |
|
||||
Is the member only allowed to comment on the board
|
||||
type: boolean
|
||||
isWorker:
|
||||
description: |
|
||||
Is the member only allowed to move card, assign himself to card and comment
|
||||
type: boolean
|
||||
required:
|
||||
- userId
|
||||
- isAdmin
|
||||
- isActive
|
||||
CardComments:
|
||||
type: object
|
||||
description: A comment on a card
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 489,
|
||||
appVersion = 490,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "4.89.0~2021-01-28"),
|
||||
appMarketingVersion = (defaultText = "4.90.0~2021-01-28"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
Meteor.publish('user-miniprofile', function(userId) {
|
||||
check(userId, String);
|
||||
Meteor.publish('user-miniprofile', function(usernames) {
|
||||
check(usernames, Array);
|
||||
|
||||
return Users.find(userId, {
|
||||
fields: {
|
||||
username: 1,
|
||||
'profile.fullname': 1,
|
||||
'profile.avatarUrl': 1,
|
||||
'profile.initials': 1,
|
||||
},
|
||||
});
|
||||
// eslint-disable-next-line no-console
|
||||
// console.log('usernames:', usernames);
|
||||
return Users.find(
|
||||
{ username: { $in: usernames } },
|
||||
{ fields: Users.safeFields },
|
||||
);
|
||||
});
|
||||
|
||||
Meteor.publish('user-admin', function() {
|
||||
|
||||
Reference in new issue
Block a user