Compare commits

...
54 Commits
Author SHA1 Message Date
Lauri Ojansivu dec21f34e9 v4.96 2021-02-13 15:06:15 +02:00
Lauri Ojansivu c8605b0cdf Updated translations. 2021-02-13 14:47:57 +02:00
Lauri Ojansivu 3d6d191d59 Updated ChangeLog. 2021-02-13 14:34:10 +02:00
Lauri Ojansivu 8f61278b33 Updated ChangeLog. 2021-02-13 02:43:33 +02:00
Lauri Ojansivu 5723c0c96f Merge pull request #3572 from mfilser/master
Lists, show also 0 cards at column description
2021-02-13 02:42:44 +02:00
Martin Filser 2830bdc075 Lists, show also 0 cards at column description 2021-02-13 01:13:10 +01:00
Lauri Ojansivu 37ab621a7e Updated ChangeLog. 2021-02-12 21:58:09 +02:00
Lauri Ojansivu f9f286e896 Merge pull request #3571 from mfilser/master
Checklist drag handle now at the left side (same place as for the checklist items)
2021-02-12 21:56:58 +02:00
Lauri Ojansivu e47545aa91 Updated ChangeLog. 2021-02-12 21:55:11 +02:00
Lauri Ojansivu 799417e0e8 Merge pull request #3570 from meerkampdvv/master
Helm: Made SecretEnv a secret and added default mongodb name as Wekan
2021-02-12 21:54:44 +02:00
Lauri Ojansivu cea5f0a30c Updated translations. 2021-02-12 21:51:43 +02:00
Lauri Ojansivu ce61e80261 Updated ChangeLog. 2021-02-12 21:46:39 +02:00
Lauri Ojansivu ec23124242 Merge pull request #3569 from helioguardabaxo/master
Modern theme: Remove font color when the card has a color
2021-02-12 21:46:10 +02:00
Lauri Ojansivu 678cc56836 Updated ChangeLog. 2021-02-12 21:44:14 +02:00
Lauri Ojansivu adf94b5e21 Merge pull request #3564 from lindhork/currency_decimal_separator
added replacement from comma to dot
2021-02-12 21:43:47 +02:00
Martin Filser d4e40c376a Checklist drag handle now at the left side (same place as for the checklist items)
- most people scroll with their right thumb, so it happens sometimes
  that they move whole checklists by accident.
- this fixes the problem, and also it looks more clean than a drag
  handle in the middle of the screen
2021-02-12 20:42:58 +01:00
Lauri Ojansivu 3cbf678671 Updated ChangeLog. 2021-02-12 21:42:07 +02:00
Lauri Ojansivu c7ec07ed47 Added ChangeLog update script. 2021-02-12 21:40:16 +02:00
Lauri Ojansivu 754d7d099b Updated ChangeLog. 2021-02-12 21:37:42 +02:00
Lauri Ojansivu c4cc3f176e Merge pull request #3563 from mfilser/master
Mobile View, list header is now always at top and only lists/cards view have a scroll area
2021-02-12 21:36:28 +02:00
Jan Meerkamp 79a2921e1d fixed fail when no secretEnv was defined 2021-02-12 18:54:56 +01:00
Jan Meerkamp d64a61bab9 removed not used var 2021-02-12 18:42:05 +01:00
Jan Meerkamp 0ee78865e1 Helm: Made SecretEnv a secret and added default mongodb name as Wekan 2021-02-12 18:34:55 +01:00
helioguardabaxo 2c29b150c5 Modern theme: Remove font color when the card has a color 2021-02-12 13:56:46 -03:00
lindhork 0801a2fbc4 added explanatory comment 2021-02-12 01:25:14 +01:00
lindhork af7ef25c9d added replacement from comma to dot 2021-02-12 01:17:11 +01:00
Martin Filser f852474b56 Mobile View, list header is now always at top and only lists/cards view have a scroll area 2021-02-12 00:34:50 +01:00
Lauri Ojansivu 54cfe5984b Updated ChangeLog. 2021-02-11 19:10:23 +02:00
Lauri Ojansivu 1bc07b1b4a Teams/Organizations: Added more code to Admin Panel for saving and editing. In Progress.
Thanks to xet7 !

Related #802
2021-02-11 19:07:34 +02:00
Lauri Ojansivu b8d52a5aa8 Updated ChangeLog. 2021-02-11 18:13:37 +02:00
Lauri Ojansivu af58b1039e Merge pull request #3561 from bronger/issue-3133
Changed default behaviour for BIGEVENTS that no activity matches it.
2021-02-11 18:11:47 +02:00
Torsten Bronger a124f1dc38 Changed default behaviour for BIGEVENTS that no activity matches it.
Previously, all changes to due dates notified all board members.  Now, you have
to set the environment variable BIGEVENTS_PATTERN explicitly to "due" to
restore this behaviour.  By default, no activity is considered a "big event".
Fixes <https://github.com/wekan/wekan/issues/3133>.
2021-02-11 16:21:36 +01:00
Lauri Ojansivu fa3e6267fd Updated ChangeLog. 2021-02-11 16:49:15 +02:00
Lauri Ojansivu 011f86f368 Updated Node.js to v12.20.2
Thanks to Node.js developers!
2021-02-11 16:46:40 +02:00
Lauri Ojansivu 0f6edc477e Removed package-lock.json. 2021-02-11 16:29:40 +02:00
Lauri Ojansivu bade652c02 Updated translations. 2021-02-11 16:28:02 +02:00
Lauri Ojansivu 03ab067d3a Updated ChangeLog. 2021-02-11 16:22:46 +02:00
Lauri Ojansivu e3a29ae82f Merge pull request #3559 from lindhork/header_padding
added padding
2021-02-11 16:21:51 +02:00
Lauri Ojansivu 3a9ce0f6ce Updated ChangeLog. 2021-02-11 16:19:07 +02:00
Lauri Ojansivu d6d40b35a5 Merge pull request #3557 from lindhork/master
Added possibility to specify hours in single digits in 24 hour format
2021-02-11 16:18:02 +02:00
Lauri Ojansivu 8baecb5911 Updated ChangeLog. 2021-02-11 16:16:38 +02:00
Lauri Ojansivu 3bb8fe9076 Merge pull request #3560 from mfilser/member_avatar_remove_red_line
Minicard, remove red line below member avatar icon
2021-02-11 16:15:20 +02:00
Lauri Ojansivu b93d66ce0b Updated ChangeLog. 2021-02-11 16:00:28 +02:00
Lauri Ojansivu b71fde7ff3 Merge pull request #3556 from pichouk/master
Add /api/boards_count endpoint for statistics
2021-02-11 15:57:35 +02:00
lindhork 5c7b060f19 moved the house icon slightly right 2021-02-11 13:39:51 +01:00
Martin Filser 1f544fff52 Minicard, remove red line below member avatar icon
- fixes comment at #3515
  https://github.com/wekan/wekan/issues/3515#issuecomment-777312174
2021-02-11 12:04:22 +01:00
lindhork 019520a793 added padding 2021-02-11 04:26:56 +01:00
lindhork 29c22efed0 Error message corrected 2021-02-11 03:55:16 +01:00
lindhork 650519683c Added compatibility for single digit hours in 24 hours format 2021-02-11 03:54:12 +01:00
Kyâne bcf5a586c7 Add /api/boards_count endpoint for statistics 2021-02-11 00:49:34 +01:00
Lauri Ojansivu 5d8f5beb2a Updated translations. 2021-02-10 18:09:22 +02:00
Lauri Ojansivu 7e58627eaf Updated ChangeLog. 2021-02-09 20:37:00 +02:00
Lauri Ojansivu 89be0f80b9 Merge pull request #3551 from mfilser/checklistitems-not_always_insert_at_the_end
Checklistitems are now inserted always at the end of the checklist
2021-02-09 20:35:32 +02:00
Martin Filser e8b6b78dfa Checklistitems are now inserted always at the end of the checklist 2021-02-09 16:08:05 +01:00
103 changed files with 63397 additions and 53924 deletions

No files matched your search

+1 -1
View File
@@ -10,7 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive
ENV \
DEBUG=false \
NODE_VERSION=v12.20.1 \
NODE_VERSION=v12.20.2 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
+1 -1
View File
@@ -81,7 +81,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.20.1
node-engine: 12.20.2
node-packages:
- node-gyp
- node-pre-gyp
+1 -1
View File
@@ -83,7 +83,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.20.1
node-engine: 12.20.2
node-packages:
- node-gyp
- node-pre-gyp
+1 -1
View File
@@ -3,7 +3,7 @@ sudo: required
env:
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
TRAVIS_NODE_VERSION: 12.20.1
TRAVIS_NODE_VERSION: 12.20.2
TRAVIS_NPM_VERSION: latest
before_install:
+46
View File
@@ -1,3 +1,49 @@
# v4.96 2021-02-13 Wekan release
This release adds the following new features:
- [Add /api/boards_count endpoint for statistics](https://github.com/wekan/wekan/pull/3556).
Thanks to pichouk.
- [Added possibility to specify hours in single digits in 24 hour format](https://github.com/wekan/wekan/pull/3557).
Thanks to lindhork.
- [Added replacement from comma to dot](https://github.com/wekan/wekan/pull/3564).
Thanks to lindhork.
and adds the following improvements:
- [Checklistitems are now inserted always at the end of the checklist](https://github.com/wekan/wekan/pull/3551).
Thanks to mfilser.
- [Teams/Organizations: Added more code to Admin Panel for saving and editing. In Progress, does not work yet](https://github.com/wekan/wekan/commit/1bc07b1b4a3e8cd1a177f3f1776ed8e189bc627a).
Thanks to xet7.
- [Mobile View, list header is now always at top and only lists/cards view have a scroll area](https://github.com/wekan/wekan/pull/3563).
Thanks to mfilser.
- [Added ChangeLog update script](https://github.com/wekan/wekan/commit/c7ec07ed4748fe9b00f622af7472fd291cf1a3ce).
Thanks to xet7.
- [Helm: Made SecretEnv a secret and added default mongodb name as Wekan](https://github.com/wekan/wekan/pull/3570).
Thanks to meerkampdvv.
- [Checklist drag handle now at the left side (same place as for the checklist items)](https://github.com/wekan/wekan/pull/3571).
Thanks to mfilser.
- [Lists, show also 0 cards at column description](https://github.com/wekan/wekan/pull/3572).
Thanks to mfilser.
and adds the following updates:
- [Updated Node.js to v12.20.2](https://github.com/wekan/wekan/commit/011f86f368a83c2e70f597c11ec60ec857e0fab0).
Thanks to Node.js developers.
and fixes the following bugs:
- [Minicard, remove red line below member avatar icon](https://github.com/wekan/wekan/pull/3560).
Thanks to mfilser.
- [Added padding](https://github.com/wekan/wekan/pull/3559).
Thanks to lindhork.
- [Changed default behaviour for BIGEVENTS that no activity matches it](https://github.com/wekan/wekan/pull/3561).
Thanks to bronger.
- [Modern theme: Remove font color when the card has a color](https://github.com/wekan/wekan/pull/3569).
Thanks to helioguardabaxo.
Thanks to above GitHub users for their contributions and translators for their translations.
# v4.95 2021-02-08 Wekan release
This release adds back the following features:
+1 -1
View File
@@ -12,7 +12,7 @@ ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
DEBUG=false \
NODE_VERSION=v12.20.1 \
NODE_VERSION=v12.20.2 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
+2 -2
View File
@@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder
ENV QEMU_VERSION=v4.2.0-6 \
QEMU_ARCHITECTURE=aarch64 \
NODE_ARCHITECTURE=linux-arm64 \
NODE_VERSION=v12.20.1 \
NODE_VERSION=v12.20.2 \
WEKAN_VERSION=3.96 \
WEKAN_ARCHITECTURE=arm64
@@ -40,7 +40,7 @@ LABEL maintainer="wekan"
# Set the environment variables (defaults where required)
ENV QEMU_ARCHITECTURE=aarch64 \
NODE_ARCHITECTURE=linux-arm64 \
NODE_VERSION=v12.20.1 \
NODE_VERSION=v12.20.2 \
NODE_ENV=production \
NPM_VERSION=latest \
WITH_API=true \
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v4.95.0"
appVersion: "v4.96.0"
files:
userUploads:
- README.md
@@ -654,7 +654,6 @@ setBoardClear(color1,color2)
/* Card changes */
.minicard
background: #FFF
padding: 15px 15px 10px
box-shadow: 0 3px 8px rgba(0,0,0,.05)
+2 -1
View File
@@ -121,7 +121,8 @@ CardCustomField.register('cardCustomField');
{
'submit .js-card-customfield-currency'(event) {
event.preventDefault();
const value = Number(this.find('input').value, 10);
// To allow input separated by comma, the comma is replaced by a period.
const value = Number(this.find('input').value.replace(/,/i, '.'), 10);
this.card.setCustomField(this.customFieldId, value);
},
},
+33 -7
View File
@@ -1,3 +1,11 @@
// Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours
function adjustedTimeFormat() {
return moment
.localeData()
.longDateFormat('LT')
.replace(/HH/i, 'H');
}
// Edit received, start, due & end dates
BlazeComponent.extendComponent({
template() {
@@ -59,7 +67,11 @@ BlazeComponent.extendComponent({
},
'keyup .js-time-field'() {
// parse for localized time format in strict mode
const dateMoment = moment(this.find('#time').value, 'LT', true);
const dateMoment = moment(
this.find('#time').value,
adjustedTimeFormat(),
true,
);
if (dateMoment.isValid()) {
this.error.set('');
}
@@ -71,16 +83,30 @@ BlazeComponent.extendComponent({
const time =
evt.target.time.value ||
moment(new Date().setHours(12, 0, 0)).format('LT');
const newTime = moment(time, adjustedTimeFormat(), true);
const newDate = moment(evt.target.date.value, 'L', true);
const dateString = `${evt.target.date.value} ${time}`;
const newDate = moment(dateString, 'L LT', true);
if (newDate.isValid()) {
this._storeDate(newDate.toDate());
Popup.close();
} else {
const newCompleteDate = moment(
dateString,
'L ' + adjustedTimeFormat(),
true,
);
if (!newTime.isValid()) {
this.error.set('invalid-time');
evt.target.time.focus();
}
if (!newDate.isValid()) {
this.error.set('invalid-date');
evt.target.date.focus();
}
if (newCompleteDate.isValid()) {
this._storeDate(newCompleteDate.toDate());
Popup.close();
} else {
if (!this.error) {
this.error.set('invalid');
}
}
},
'click .js-delete-date'(evt) {
evt.preventDefault();
+1 -1
View File
@@ -111,7 +111,7 @@ BlazeComponent.extendComponent({
title,
checklistId: checklist._id,
cardId: checklist.cardId,
sort: checklist.itemCount(),
sort: Utils.calculateIndexData(checklist.lastItem()).base,
});
}
// We keep the form opened, empty it.
+2 -2
View File
@@ -44,8 +44,8 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
span.fa.checklist-handle
padding-right: 20px
padding-top: 6px
float: right
padding-top: 3px
float: left
.js-confirm-checklist-delete
+3 -1
View File
@@ -166,7 +166,6 @@
.minicard-assignees
float: right
margin-left: 5px
border-bottom: 1px solid red
margin-bottom: 4px
.member
@@ -185,6 +184,9 @@
+ .badges
margin-top: 5px
.minicard-assignees
border-bottom: 1px solid red
.minicard-members:empty,
.minicard-assignees:empty
display: none
+2 -1
View File
@@ -180,7 +180,8 @@
border-bottom: 1px solid darken(white, 20%)
.list
display: block
display: contents
flex-basis: auto
width: 100%
border-left: 0px
&:first-child
+1 -1
View File
@@ -82,7 +82,7 @@ BlazeComponent.extendComponent({
showCardsCountForList(count) {
const limit = this.limitToShowCardsCount();
return limit >= 0 && count > limit;
return limit >= 0 && count >= limit;
},
events() {
+2 -2
View File
@@ -37,7 +37,7 @@ template(name="header")
img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0")
unless currentSetting.customTopLeftCornerLogoImageUrl
img(src="{{pathFor '/logo-header.png'}}" alt="")
span
span.allBoards
a(href="{{pathFor 'home'}}")
span.fa.fa-home
| {{_ 'all-boards'}}
@@ -51,7 +51,7 @@ template(name="header")
a(href="{{pathFor 'board' id=_id slug=slug}}")
= title
else
li.current {{_ 'quick-access-description'}}
li.current.empty {{_ 'quick-access-description'}}
// Next line is used only for spacing at header,
// there is no visible clickable icon.
+8 -1
View File
@@ -102,6 +102,9 @@
z-index: 21
padding: 10px 0px
.allBoards
padding: 0 0 0 10px
#header-user-bar,
#header-new-board-icon,
ul li
@@ -135,6 +138,9 @@
&.current
color: darken(white, 5%)
&.current.empty
padding: 12px 10px 12px 10px
&:first-child .fa-home,&:nth-child(3) .fa-globe
margin-right: 5px
@@ -210,7 +216,8 @@
.fa-home
font-size: 26px
margin-top: -2px
margin-right: 20px
margin-right: 10px
margin-left: 10px
#header-new-board-icon
display: none
+35 -43
View File
@@ -74,7 +74,6 @@ template(name="orgGeneral")
th {{_ 'description'}}
th {{_ 'shortName'}}
th {{_ 'website'}}
th {{_ 'teams'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
th
@@ -134,25 +133,21 @@ template(name="newUserRow")
template(name="orgRow")
tr
if orgData.loginDisabled
td <s>{{ orgData.displayName }}</s>
td <s>{{ orgData.orgDisplayName }}</s>
else
td {{ orgData.displayName }}
td {{ orgData.orgDisplayName }}
if orgData.loginDisabled
td <s>{{ orgData.orgDesc }}</s>
else
td {{ orgData.desc }}
td {{ orgData.orgDesc }}
if orgData.loginDisabled
td <s>{{ orgData.name }}</s>
td <s>{{ orgData.orgName }}</s>
else
td {{ orgData.name }}
td {{ orgData.orgName }}
if orgData.loginDisabled
td <s>{{ orgData.website }}</s>
td <s>{{ orgData.orgWebsite }}</s>
else
td {{ orgData.website }}
if orgData.loginDisabled
td <s>{{ orgData.teams }}</s>
else
td {{ orgData.teams }}
td {{ orgData.orgWebsite }}
if orgData.loginDisabled
td <s>{{ moment orgData.createdAt 'LLL' }}</s>
else
@@ -172,21 +167,21 @@ template(name="orgRow")
template(name="teamRow")
tr
if teamData.loginDisabled
td <s>{{ teamData.displayName }}</s>
td <s>{{ teamData.teamDisplayName }}</s>
else
td {{ teamData.displayName }}
td {{ teamData.teamDisplayName }}
if teamData.loginDisabled
td <s>{{ teamData.desc }}</s>
td <s>{{ teamData.teamDesc }}</s>
else
td {{ teamData.desc }}
td {{ teamData.teamDesc }}
if teamData.loginDisabled
td <s>{{ teamData.dame }}</s>
td <s>{{ teamData.teamName }}</s>
else
td {{ teamData.name }}
td {{ teamData.teamName }}
if teamData.loginDisabled
td <s>{{ teamData.website }}</s>
td <s>{{ teamData.teamWebsite }}</s>
else
td {{ teamData.website }}
td {{ teamData.teamWebsite }}
if orgData.loginDisabled
td <s>{{ moment teamData.createdAt 'LLL' }}</s>
else
@@ -273,19 +268,19 @@ template(name="editOrgPopup")
form
label.hide.orgId(type="text" value=org._id)
label
| {{_ 'orgDisplayName'}}
| {{_ 'displayName'}}
input.js-orgDisplayName(type="text" value=org.displayName required)
span.error.hide.orgname-taken
| {{_ 'error-orgname-taken'}}
label
| {{_ 'orgDesc'}}
input.js-orgDesc(type="text" value=org.desc required)
| {{_ 'description'}}
input.js-orgDesc(type="text" value=org.orgDesc required)
label
| {{_ 'orgName'}}
input.js-orgName(type="text" value=org.name required)
| {{_ 'shortName'}}
input.js-orgShortName(type="text" value=org.orgShortName required)
label
| {{_ 'orgWebsite'}}
input.js-orgWebsite(type="text" value=org.website required)
| {{_ 'website'}}
input.js-orgWebsite(type="text" value=org.orgWebsite required)
label
| {{_ 'active'}}
select.select-active.js-org-isactive
@@ -300,18 +295,18 @@ template(name="editTeamPopup")
label.hide.teamId(type="text" value=team._id)
label
| {{_ 'displayName'}}
input.js-teamDisplayName(type="text" value=team.displayName required)
input.js-teamDisplayName(type="text" value=team.teamDisplayName required)
span.error.hide.teamname-taken
| {{_ 'error-teamname-taken'}}
label
| {{_ 'description'}}
input.js-orgDesc(type="text" value=org.desc required)
input.js-teamDesc(type="text" value=team.teamDesc required)
label
| {{_ 'name'}}
input.js-orgName(type="text" value=org.name required)
| {{_ 'shortName'}}
input.js-teamShortName(type="text" value=team.teamShortName required)
label
| {{_ 'website'}}
input.js-orgWebsite(type="text" value=org.website required)
input.js-teamWebsite(type="text" value=team.teamWebsite required)
label
| {{_ 'active'}}
select.select-active.js-team-isactive
@@ -384,22 +379,19 @@ template(name="newOrgPopup")
//label.hide.userId(type="text" value=user._id)
label
| {{_ 'displayName'}}
input.js-displayName(type="text" value="" required)
input.js-orgDisplayName(type="text" value="" required)
label
| {{_ 'description'}}
input.js-desc(type="text" value="" required)
input.js-orgDesc(type="text" value="" required)
label
| {{_ 'shortName'}}
input.js-name(type="text" value="")
label
| {{_ 'teams'}}
input.js-teams(type="text" value="")
input.js-orgName(type="text" value="" required)
label
| {{_ 'website'}}
input.js-website(type="text" value="")
input.js-orgWebsite(type="text" value="" required)
label
| {{_ 'active'}}
select.select-active.js-profile-isactive
select.select-active.js-org-isactive
option(value="false" selected="selected") {{_ 'yes'}}
option(value="true") {{_ 'no'}}
hr
@@ -417,13 +409,13 @@ template(name="newTeamPopup")
input.js-teamDesc(type="text" value="" required)
label
| {{_ 'shortName'}}
input.js-teamName(type="text" value="")
input.js-teamName(type="text" value="" required)
label
| {{_ 'website'}}
input.js-teamWebsite(type="text" value="")
input.js-teamWebsite(type="text" value="" required)
label
| {{_ 'active'}}
select.select-active.js-profile-isactive
select.select-active.js-team-isactive
option(value="false" selected="selected") {{_ 'yes'}}
option(value="true") {{_ 'no'}}
hr
+121 -30
View File
@@ -404,6 +404,88 @@ BlazeComponent.extendComponent({
},
}).register('newUserRow');
Template.editOrgPopup.events({
submit(event, templateInstance) {
event.preventDefault();
const org = Orgs.findOne(this.orgId);
const orgDisplayName = templateInstance
.find('.js-orgDisplayName')
.value.trim();
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
const orgIsActive = templateInstance.find('.js-org-isactive').value.trim();
const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName;
const isChangeOrgDesc = orgDesc !== org.orgDesc;
const isChangeOrgShortName = orgShortName !== org.orgShortName;
const isChangeOrgWebsite = orgWebsite !== org.orgWebsite;
const isChangeOrgIsActive = orgIsActive !== org.orgIsActive;
if (isChangeOrgDisplayName) {
Meteor.call('setOrgDisplayName', org, orgDisplayName);
}
if (isChangeOrgDesc) {
Meteor.call('setOrgDesc', org, orgDesc);
}
if (isChangeOrgShortName) {
Meteor.call('setOrgShortName', org, orgShortName);
}
if (isChangeOrgIsActive) {
Meteor.call('setOrgIsActive', org, orgIsActive);
}
Popup.close();
},
});
Template.editTeamPopup.events({
submit(event, templateInstance) {
event.preventDefault();
const team = Teams.findOne(this.teamId);
const teamDisplayName = templateInstance
.find('.js-teamDisplayName')
.value.trim();
const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
const teamShortName = templateInstance
.find('.js-teamShortName')
.value.trim();
const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
const teamIsActive = templateInstance
.find('.js-team-isactive')
.value.trim();
const isChangeTeamDisplayName = teamDisplayName !== team.teamDisplayName;
const isChangeTeamDesc = teamDesc !== team.teamDesc;
const isChangeTeamShortName = teamShortName !== team.teamShortName;
const isChangeTeamWebsite = teamWebsite !== team.teamWebsite;
const isChangeTeamIsActive = teamIsActive !== team.teamIsActive;
if (isChangeTeamDisplayName) {
Meteor.call('setTeamDisplayName', team, teamDisplayName);
}
if (isChangeTeamDesc) {
Meteor.call('setTeamDesc', team, teamDesc);
}
if (isChangeTeamShortName) {
Meteor.call('setTeamShortName', team, teamShortName);
}
if (isChangeTeamIsActive) {
Meteor.call('setTeamIsActive', team, teamIsActive);
}
Popup.close();
},
});
Template.editUserPopup.events({
submit(event, templateInstance) {
event.preventDefault();
@@ -520,39 +602,48 @@ Template.editUserPopup.events({
Template.newOrgPopup.events({
submit(event, templateInstance) {
event.preventDefault();
const displayName = templateInstance.find('.js-displayName').value.trim();
const desc = templateInstance.find('.js-desc').value.trim();
const name = templateInstance.find('.js-name').value.trim();
const teams = templateInstance.find('.js-teams').value.trim();
const website = templateInstance.find('.js-website').value.trim();
const isActive = templateInstance.find('.js-profile-isactive').value.trim();
const orgDisplayName = templateInstance
.find('.js-orgDisplayName')
.value.trim();
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
const orgIsActive = templateInstance.find('.js-org-isactive').value.trim();
Meteor.call(
'setCreateOrg',
displayName,
desc,
name,
teams,
website,
isActive,
email.toLowerCase(),
function(error) {
const nameMessageElement = templateInstance.$('.name-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'name-already-taken') {
nameMessageElement.show();
emailMessageElement.hide();
} else if (errorElement === 'email-already-taken') {
usernameMessageElement.hide();
emailMessageElement.show();
}
} else {
usernameMessageElement.hide();
emailMessageElement.hide();
Popup.close();
}
},
orgDisplayName,
orgDesc,
orgShortName,
orgWebsite,
orgIsActive,
);
Popup.close();
},
});
Template.newTeamPopup.events({
submit(event, templateInstance) {
event.preventDefault();
const teamDisplayName = templateInstance
.find('.js-teamDisplayName')
.value.trim();
const teamDesc = templateInstance.find('.js-teamDesc').value.trim();
const teamShortName = templateInstance
.find('.js-teamShortName')
.value.trim();
const teamWebsite = templateInstance.find('.js-teamWebsite').value.trim();
const teamIsActive = templateInstance
.find('.js-team-isactive')
.value.trim();
Meteor.call(
'setCreateTeam',
teamDisplayName,
teamDesc,
teamShortName,
teamWebsite,
teamIsActive,
);
Popup.close();
},
+33 -7
View File
@@ -1,3 +1,11 @@
// Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours
function adjustedTimeFormat() {
return moment
.localeData()
.longDateFormat('LT')
.replace(/HH/i, 'H');
}
DatePicker = BlazeComponent.extendComponent({
template() {
return 'datepicker';
@@ -77,7 +85,11 @@ DatePicker = BlazeComponent.extendComponent({
},
'keyup .js-time-field'() {
// parse for localized time format in strict mode
const dateMoment = moment(this.find('#time').value, 'LT', true);
const dateMoment = moment(
this.find('#time').value,
adjustedTimeFormat(),
true,
);
if (dateMoment.isValid()) {
this.error.set('');
}
@@ -89,16 +101,30 @@ DatePicker = BlazeComponent.extendComponent({
const time =
evt.target.time.value ||
moment(new Date().setHours(12, 0, 0)).format('LT');
const newTime = moment(time, adjustedTimeFormat(), true);
const newDate = moment(evt.target.date.value, 'L', true);
const dateString = `${evt.target.date.value} ${time}`;
const newDate = moment(dateString, 'L LT', true);
if (newDate.isValid()) {
this._storeDate(newDate.toDate());
Popup.close();
} else {
const newCompleteDate = moment(
dateString,
'L ' + adjustedTimeFormat(),
true,
);
if (!newTime.isValid()) {
this.error.set('invalid-time');
evt.target.time.focus();
}
if (!newDate.isValid()) {
this.error.set('invalid-date');
evt.target.date.focus();
}
if (newCompleteDate.isValid()) {
this._storeDate(newCompleteDate.toDate());
Popup.close();
} else {
if (!this.error) {
this.error.set('invalid');
}
}
},
'click .js-delete-date'(evt) {
evt.preventDefault();
+1 -1
View File
@@ -1,5 +1,5 @@
name: wekan
version: 1.0.2
version: 1.0.3
apiVersion: v1
description: Open Source kanban
home: https://wekan.github.io/
+1 -1
View File
@@ -81,7 +81,7 @@ else use user-provided URL.
{{- $release := .Release.Name -}}
{{- $replicaSetName := (index .Values "mongodb" "replicaSetName") -}}
{{- $mongodbSvcName := include "wekan.mongodb.svcname" . -}}
mongodb://{{- range $v := until $count }}{{ $release }}-mongodb-{{ $v }}.{{ $mongodbSvcName }}:27017{{ if ne $v (sub $count 1) }},{{- end -}}{{- end -}}?replicaSet={{ $replicaSetName }}
mongodb://{{- range $v := until $count }}{{ $release }}-mongodb-{{ $v }}.{{ $mongodbSvcName }}:27017{{ if ne $v (sub $count 1) }},{{- end -}}{{- end -}}/{{ .Values.dbname }}?replicaSet={{ $replicaSetName }}
{{- else -}}
{{- index .Values "mongodb" "url" -}}
{{- end -}}
+4 -1
View File
@@ -46,7 +46,10 @@ spec:
{{- range $key := .Values.secretEnv }}
{{- if .value }}
- name: {{ .name }}
value: {{ .value | quote }}
valueFrom:
secretKeyRef:
name: {{ template "wekan.fullname" $ }}-secret
key: {{ .name }}
{{- end }}
{{- end }}
livenessProbe:
+11
View File
@@ -0,0 +1,11 @@
{{ if .Values.secretEnv }}
apiVersion: v1
kind: Secret
metadata:
name: {{ template "wekan.fullname" $ }}-secret
type: Opaque
data:
{{- range $key := .Values.secretEnv }}
{{ $key.name }}: {{ $key.value | b64enc }}
{{- end}}
{{ end }}
+4 -3
View File
@@ -21,6 +21,7 @@ image:
##
replicaCount: 1
dbname: wekan
## Specify additional environmental variables for the Deployment
##
@@ -32,9 +33,9 @@ env:
## Deployment. These can e.g. be provided by a Secret and allow
## to store passwords separately
##
secretEnv:
- name: ""
value: ""
secretEnv: {}
# - name: ""
# value: ""
service:
type: NodePort
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+73 -73
View File
@@ -327,8 +327,8 @@
"export-board-json": "Exportovat tablo do JSON",
"export-board-csv": "Exportovat tablo do CSV",
"export-board-tsv": "Exportovat tablo do TSV",
"export-board-excel": "Export board to Excel",
"user-can-not-export-excel": "User can not export Excel",
"export-board-excel": "Exportovat tablo do Excelu",
"user-can-not-export-excel": "Uživatel nemůže exportovat do Excelu",
"export-board-html": "Exportovat tablo do HTML",
"exportBoardPopup-title": "Exportovat tablo",
"sort": "řadit",
@@ -384,7 +384,7 @@
"import-csv-placeholder": "Zde vložte vaše platné CSV/TSV data",
"import-map-members": "Mapovat členy",
"import-members-map": "Toto importované tablo obsahuje několik osob. Prosím namapujte osoby z importu na místní uživatelské účty.",
"import-members-map-note": "Note: Unmapped members will be assigned to the current user.",
"import-members-map-note": "Modifikováno",
"import-show-user-mapping": "Zkontrolovat namapování členů",
"import-user-select": "Vyberte existující uživatelský účet, kterého chcete použít pro tuto osobu",
"importMapMembersAddPopup-title": "Zvolte osobu",
@@ -531,7 +531,7 @@
"custom-login-logo-link-url": "URL odkazu vlastního loga přihlášení",
"text-below-custom-login-logo": "Text pod vlastním logem přihlášení",
"username": "Uživatelské jméno",
"import-usernames": "Import Usernames",
"import-usernames": "Importovat uživatelská jména",
"view-it": "Zobrazit",
"warn-list-archived": "varování: tato karta je v seznamu v Archivu",
"watch": "Sledovat",
@@ -603,8 +603,8 @@
"minutes": "minut",
"seconds": "sekund",
"show-field-on-card": "Ukázat toto pole na kartě",
"automatically-field-on-card": "Add field to new cards",
"always-field-on-card": "Add field to all cards",
"automatically-field-on-card": "Přidat pole na nové karty",
"always-field-on-card": "Přidat pole na všechny karty",
"showLabel-field-on-card": "Ukázat štítek pole na minikartě",
"yes": "Ano",
"no": "Ne",
@@ -612,7 +612,7 @@
"accounts-allowEmailChange": "Povolit změnu Emailu",
"accounts-allowUserNameChange": "Povolit změnu uživatelského jména",
"createdAt": "Vytvořeno v",
"modifiedAt": "Modified at",
"modifiedAt": "Modifikováno",
"verified": "Ověřen",
"active": "Aktivní",
"card-received": "Přijato",
@@ -871,19 +871,19 @@
"dueCardsViewChange-choice-all": "Všechny",
"dueCardsViewChange-choice-all-description": "Zobrazí všechny nedokončené karty s *Termínem dokončení* z každého tabla, ke kterému má uživatel oprávnění.",
"broken-cards": "Rozbité karty",
"board-title-not-found": "Board '%s' not found.",
"swimlane-title-not-found": "Swimlane '%s' not found.",
"list-title-not-found": "List '%s' not found.",
"label-not-found": "Label '%s' not found.",
"label-color-not-found": "Label color %s not found.",
"user-username-not-found": "Username '%s' not found.",
"comment-not-found": "Card with comment containing text '%s' not found.",
"globalSearch-title": "Search All Boards",
"no-cards-found": "No Cards Found",
"one-card-found": "One Card Found",
"n-cards-found": "%s Cards Found",
"n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
"operator-board": "board",
"board-title-not-found": "Tablo '%s' nenalezeno.",
"swimlane-title-not-found": "Swimlane '%s' nenalezena.",
"list-title-not-found": "Sloupec '%s' nenalezen.",
"label-not-found": "Štítek '%s' nenalezen.",
"label-color-not-found": "Barva štítku %s nenalezena.",
"user-username-not-found": "Uživatelské jméno '%s' nenalezeno.",
"comment-not-found": "Karta s komentářem obsahujícím text '%s' nenalezena.",
"globalSearch-title": "Vyhledat všechna tabla",
"no-cards-found": "Žádné karty nebyly nalezeny",
"one-card-found": "Nalezena jedna karta",
"n-cards-found": "nalezeny %s karty",
"n-n-of-n-cards-found": "__start__-__end__ z __total__ karet nalezeno",
"operator-board": "tablo",
"operator-board-abbrev": "b",
"operator-swimlane": "swimlane",
"operator-swimlane-abbrev": "s",
@@ -891,65 +891,65 @@
"operator-list-abbrev": "l",
"operator-label": "štítek",
"operator-label-abbrev": "#",
"operator-user": "user",
"operator-user": "uživatel",
"operator-user-abbrev": "@",
"operator-member": "člen",
"operator-member-abbrev": "m",
"operator-assignee": "assignee",
"operator-assignee": "řešitel",
"operator-assignee-abbrev": "a",
"operator-status": "status",
"operator-status": "stav",
"operator-due": "do",
"operator-created": "created",
"operator-modified": "modified",
"operator-sort": "sort",
"operator-comment": "comment",
"predicate-archived": "archived",
"predicate-ended": "ended",
"predicate-all": "all",
"predicate-overdue": "overdue",
"predicate-week": "week",
"predicate-month": "month",
"predicate-quarter": "quarter",
"predicate-year": "year",
"operator-created": "vytvořeno",
"operator-modified": "modifikováno",
"operator-sort": "třídění",
"operator-comment": "komentář",
"predicate-archived": "archivováno",
"predicate-ended": "ukončeno",
"predicate-all": "vše",
"predicate-overdue": "po termínu",
"predicate-week": "týden",
"predicate-month": "měsíc",
"predicate-quarter": "čtvrtletí",
"predicate-year": "rok",
"predicate-due": "do",
"predicate-modified": "modified",
"predicate-created": "created",
"operator-unknown-error": "%s is not an operator",
"operator-number-expected": "operator __operator__ expected a number, got '__value__'",
"operator-sort-invalid": "sort of '%s' is invalid",
"operator-status-invalid": "'%s' is not a valid status",
"next-page": "Next Page",
"previous-page": "Previous Page",
"heading-notes": "Notes",
"globalSearch-instructions-heading": "Search Instructions",
"globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).",
"globalSearch-instructions-operators": "Available operators:",
"globalSearch-instructions-operator-board": "`__operator_board__:title` - cards in boards matching the specified title",
"globalSearch-instructions-operator-list": "`__operator_list__:title` - cards in lists matching the specified title",
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:title` - cards in swimlanes matching the specified title",
"globalSearch-instructions-operator-comment": "`__operator_comment__:text` - cards with a comment containing *text*.",
"globalSearch-instructions-operator-label": "`__operator_label__:color` `__operator_label__:name` - cards that have a label matching the given color or name",
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__label` - shorthand for `__operator_label__:label`",
"globalSearch-instructions-operator-user": "`__operator_user__:username` - cards where the specified user is a *member* or *assignee*",
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:username`",
"globalSearch-instructions-operator-member": "`__operator_member__:username` - cards where the specified user is a *member*",
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:username` - cards where the specified user is an *assignee*",
"globalSearch-instructions-operator-due": "`__operator_due__:n` - cards which are due *n* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.",
"globalSearch-instructions-operator-created": "`__operator_created__:n` - cards which were created *n* days ago",
"globalSearch-instructions-operator-modified": "`__operator_modified__:n` - cards which were modified *n* days ago",
"globalSearch-instructions-status-archived": "`__operator_status__:__predicate_archived__` - cards that are archived.",
"globalSearch-instructions-status-all": "`__operator_status__:__predicate_all__` - all archived and unarchived cards.",
"globalSearch-instructions-status-ended": "`__operator_status__:__predicate_ended__` - cards with an end date.",
"globalSearch-instructions-notes-1": "Multiple operators may be specified.",
"globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.",
"globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.",
"globalSearch-instructions-notes-3-2": "Days can be specified as an integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__`",
"globalSearch-instructions-notes-4": "Text searches are case insensitive.",
"globalSearch-instructions-notes-5": "Currently archived cards are not searched.",
"link-to-search": "Link to this search",
"predicate-modified": "modifikováno",
"predicate-created": "vytvořeno",
"operator-unknown-error": "%s není operátor",
"operator-number-expected": "operátor __operator__ očekával číslo, ale dostal '__value__'",
"operator-sort-invalid": "pořadí '%s' není platné",
"operator-status-invalid": "'%s' není platný stav",
"next-page": "Následující stránka",
"previous-page": "Předchozí stránka",
"heading-notes": "Poznámky",
"globalSearch-instructions-heading": "Vyhledat instrukce",
"globalSearch-instructions-description": "Vyhledávání lze za účelem zacílení doplnit o operátory. Operátory jsou zadávány napsáním názvu operátoru a hodnoty, které jsou odděleny dvojtečkou. Například specifikace operátoru `list:Blocked` omezí vyhledávání na karty obsažené ve sloupci *Blocked*. Pokud hodnota obsahuje mezerynebo speciální znaky, musí se nacházet v uvozovkách (např. `__operator_list__:\"To Review\"`).",
"globalSearch-instructions-operators": "Dostupné operátory:",
"globalSearch-instructions-operator-board": "`__operator_board__:title` - karty v tablech odpovídají zadanému názvu",
"globalSearch-instructions-operator-list": "`__operator_list__:title` - karty ve sloupcích odpovídají zadanému názvu",
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:title` - karty ve swimlanech odpovídají zadanému názvu",
"globalSearch-instructions-operator-comment": "`__operator_comment__:text` - karty s komentářem obsahujícím *text*.",
"globalSearch-instructions-operator-label": "`__operator_label__:color` `__operator_label__:name` - karty, které mají štítek odpovídající zadané barvě nebo názvu",
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__label` - zkratka pro `__operator_label__:label`",
"globalSearch-instructions-operator-user": "`__operator_user__:username` - karty, kde je zadaný uživatel *member* nebo *assignee*",
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - zkratka pro `user:username`",
"globalSearch-instructions-operator-member": "`__operator_member__:username` - karty, kde je zadaný uživatel *member*",
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:username` - karty, kde je zadaný uživatel *assignee*",
"globalSearch-instructions-operator-due": "`__operator_due__:n` - karty, které jsou *n* dní před termínem. `__operator_due__:__predicate_overdue__ zobrazí všechny karty po termínu.",
"globalSearch-instructions-operator-created": "`__operator_created__:n` - karty, které byly vytvořeny před *n* dny",
"globalSearch-instructions-operator-modified": "`__operator_modified__:n` - karty modifikované před *n* dny",
"globalSearch-instructions-status-archived": "`__operator_status__:__predicate_archived__` - archivované karty.",
"globalSearch-instructions-status-all": "`__operator_status__:__predicate_all__` - všechny archivované a nearchivované karty.",
"globalSearch-instructions-status-ended": "`__operator_status__:__predicate_ended__` - karty s datem dokončení.",
"globalSearch-instructions-notes-1": "Lze zadat více operátorů současně.",
"globalSearch-instructions-notes-2": "Podobné operátory jsou spojeny pomocí *OR*. Jsou zobrazeny karty odpovídající kterékoli v podmínek.\n`__operator_list__:Available __operator_list__:Blocked` zobrazí karty obsažené v jakémkoli sloupci s názvem *Blocked* nebo *Available*.",
"globalSearch-instructions-notes-3": "Odlišné operátory jsou spojeny pomocí *AND*. Jsou zobrazeny pouze karty, které odpovídají všem definovaným operátorům. `__operator_list__:Available __operator_label__:red` zobrazí pouze karty ve sloupci *Available* with a štítkem *red*.",
"globalSearch-instructions-notes-3-2": "Dyn mohou být zadávány jako celé číslo nebo s použitím `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` nebo `__predicate_year__`",
"globalSearch-instructions-notes-4": "Vyhledávání rozlišuje velikost písmen.",
"globalSearch-instructions-notes-5": "Archivované karty nejsou vyhledávány.",
"link-to-search": "Odkaz na toto vyhledávání",
"excel-font": "Arial",
"number": "Číslo",
"label-colors": "Label Colors",
"label-names": "Label Names",
"archived-at": "archived at"
"label-colors": "Štítek barvy",
"label-names": "Štítek jména",
"archived-at": "archivováno"
}
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+2
View File
@@ -322,6 +322,8 @@
"error-user-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"error-orgname-taken": "This organization name is already taken",
"error-teamname-taken": "This team name is already taken",
"error-email-taken": "Email has already been taken",
"export-board": "Export board",
"export-board-json": "Export board to JSON",
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -927,7 +927,7 @@
"globalSearch-instructions-operator-board": "`__operator_board__:タイトル` - 指定されたタイトルのカード",
"globalSearch-instructions-operator-list": "`__operator_list__:タイトル` - 指定されたタイトルに一致するリスト内のカード",
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:タイトル` - 指定されたタイトルに一致するスイムレーン内のカード",
"globalSearch-instructions-operator-comment": "`__operator_comment__:text` - cards with a comment containing *text*.",
"globalSearch-instructions-operator-comment": "`__operator_comment__:テキスト` - *テキスト* を含むコメント付きのカード",
"globalSearch-instructions-operator-label": "`__operator_label__:色` `__operator_label__:name` - 色または名前に一致するラベルを含むカード",
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__label` - `__operator_label__:label` の省略表記 ",
"globalSearch-instructions-operator-user": "`__operator_user__:username` - 指定されたユーザーが*メンバー*または*担当者*のカード",
@@ -935,8 +935,8 @@
"globalSearch-instructions-operator-member": "`__operator_member__:username` - 指定されたユーザーが*メンバー*のカード",
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:username` - 指定されたユーザーが*担当者*のカード",
"globalSearch-instructions-operator-due": "`__operator_due__:n` - 期限日が*n*日後のカード `__operator_due__:__predicate_overdue__` - 期日を過ぎたすべてのカード",
"globalSearch-instructions-operator-created": "`__operator_created__:n` - cards which were created *n* days ago",
"globalSearch-instructions-operator-modified": "`__operator_modified__:n` - cards which were modified *n* days ago",
"globalSearch-instructions-operator-created": "`__operator_created__:n` - *n*日前に作成されたカード",
"globalSearch-instructions-operator-modified": "`__operator_modified__:n` - *n*日前に変更されたカード",
"globalSearch-instructions-status-archived": "`__operator_status__:__predicate_archived__` - アーカイブ済みのカード",
"globalSearch-instructions-status-all": "`__operator_status__:__predicate_all__` - アーカイブされていないカード",
"globalSearch-instructions-status-ended": "`__operator_status__:__predicate_ended__` - 終了したカード",
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+13 -13
View File
@@ -75,10 +75,10 @@
"activity-checklist-uncompleted-card": "ofullbordade checklistan %s",
"activity-editComment": "redigerade kommentar %s",
"activity-deleteComment": "raderade kommentar %s",
"activity-receivedDate": "edited received date to %s of %s",
"activity-startDate": "edited start date to %s of %s",
"activity-dueDate": "edited due date to %s of %s",
"activity-endDate": "edited end date to %s of %s",
"activity-receivedDate": "redigerade mottaget datum till %s av %s",
"activity-startDate": "redigerade startdatum till %s av %s",
"activity-dueDate": "redigerade förfallodag till %s av %s",
"activity-endDate": "redigerade slutdatum till %s av %s",
"add-attachment": "Lägg till bilaga",
"add-board": "Lägg till tavla",
"add-card": "Lägg till kort",
@@ -327,8 +327,8 @@
"export-board-json": "Exportera tavla till JSON",
"export-board-csv": "Expoertera tavla till CSV",
"export-board-tsv": "Exportera tavla till TSV",
"export-board-excel": "Export board to Excel",
"user-can-not-export-excel": "User can not export Excel",
"export-board-excel": "Exportera tavla till Excel",
"user-can-not-export-excel": "Användare kan inte exportera till Excel",
"export-board-html": "Exportera tavla till HTML",
"exportBoardPopup-title": "Exportera tavla",
"sort": "Sortera",
@@ -531,7 +531,7 @@
"custom-login-logo-link-url": "Länk för anpassad logotyp på inloggningssidan",
"text-below-custom-login-logo": "Text under anpassad logga för inloggning",
"username": "Änvandarnamn",
"import-usernames": "Import Usernames",
"import-usernames": "Importera användarnamn",
"view-it": "Visa det",
"warn-list-archived": "varning: detta kort finns i en lista i Arkiv",
"watch": "Bevaka",
@@ -603,8 +603,8 @@
"minutes": "minuter",
"seconds": "sekunder",
"show-field-on-card": "Visa detta fält på kort",
"automatically-field-on-card": "Add field to new cards",
"always-field-on-card": "Add field to all cards",
"automatically-field-on-card": "Lägg till fält till nytt kort",
"always-field-on-card": "Lägg till fält till alla kort",
"showLabel-field-on-card": "Visa fältetikett på minikort",
"yes": "Ja",
"no": "Nej",
@@ -612,7 +612,7 @@
"accounts-allowEmailChange": "Tillåt e-poständring",
"accounts-allowUserNameChange": "Tillåt användarnamnändring",
"createdAt": "Skapad vid",
"modifiedAt": "Modified at",
"modifiedAt": "Senast ändrad",
"verified": "Verifierad",
"active": "Aktiv",
"card-received": "Mottagen",
@@ -675,7 +675,7 @@
"r-removed-from": "Borttagen från",
"r-the-board": "tavlan",
"r-list": "lista",
"list": "List",
"list": "Lista",
"set-filter": "Ställ in filter",
"r-moved-to": "Flyttat till",
"r-moved-from": "Flyttad från",
@@ -781,8 +781,8 @@
"display-authentication-method": "Visa autentiseringsmetod",
"default-authentication-method": "Standard autentiseringsmetod",
"duplicate-board": "Duplicera tavla",
"org-number": "The number of organizations is:",
"team-number": "The number of teams is:",
"org-number": "Antalet organisationer är:",
"team-number": "Antalet team är:",
"people-number": "Antalet personer är:",
"swimlaneDeletePopup-title": "Radera simbana?",
"swimlane-delete-pop": "Alla händelser kommer att tas bort från aktivitetsflödet och du kommer inte att kunna återställa simbanan. Det går inte att ångra.",
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+954 -954
View File
File diff suppressed because it is too large. Load diff
+12 -10
View File
@@ -254,17 +254,19 @@ if (Meteor.isServer) {
if (value) params[key] = value;
});
if (board) {
const BIGEVENTS = process.env.BIGEVENTS_PATTERN || 'due'; // if environment BIGEVENTS_PATTERN is set or default, any activityType matching it is important
try {
const atype = activity.activityType;
if (new RegExp(BIGEVENTS).exec(atype)) {
watchers = _.union(
watchers,
board.activeMembers().map(member => member.userId),
); // notify all active members for important events system defined or default to all activity related to due date
const BIGEVENTS = process.env.BIGEVENTS_PATTERN; // if environment BIGEVENTS_PATTERN is set, any activityType matching it is important
if (BIGEVENTS) {
try {
const atype = activity.activityType;
if (new RegExp(BIGEVENTS).exec(atype)) {
watchers = _.union(
watchers,
board.activeMembers().map(member => member.userId),
); // notify all active members for important events
}
} catch (e) {
// passed env var BIGEVENTS_PATTERN is not a valid regex
}
} catch (e) {
// passed env var BIGEVENTS_PATTERN is not a valid regex
}
const watchingUsers = _.pluck(
+24
View File
@@ -1700,6 +1700,30 @@ if (Meteor.isServer) {
}
});
/**
* @operation get_boards_count
* @summary Get public and private boards count
*
* @return_type {private: integer, public: integer}
*/
JsonRoutes.add('GET', '/api/boards_count', function(req, res) {
try {
Authentication.checkUserId(req.userId);
JsonRoutes.sendResult(res, {
code: 200,
data: {
private: Boards.find({ permission: 'private' }).count(),
public: Boards.find({ permission: 'public' }).count(),
},
});
} catch (error) {
JsonRoutes.sendResult(res, {
code: 200,
data: error,
});
}
});
/**
* @operation get_board
* @summary Get the board with that particular ID
+3 -3
View File
@@ -736,11 +736,11 @@ Cards.helpers({
// at linked cards custom fields definition is not found
ret.sort(
(a, b) =>
a.definition !== undefined &&
b.definition !== undefined &&
a.definition !== undefined &&
b.definition !== undefined &&
a.definition.name !== undefined &&
b.definition.name !== undefined &&
a.definition.name.localeCompare(b.definition.name)
a.definition.name.localeCompare(b.definition.name),
);
return ret;
},
+5
View File
@@ -91,6 +91,11 @@ Checklists.helpers({
{ sort: ['sort'] },
);
},
lastItem() {
const allItems = this.items().fetch();
const ret = allItems[allItems.length - 1];
return ret;
},
finishedCount() {
return ChecklistItems.find({
checklistId: this._id,
+77 -77
View File
@@ -5,27 +5,14 @@ Org = new Mongo.Collection('org');
*/
Org.attachSchema(
new SimpleSchema({
_id: {
/**
* the organization id
*/
type: Number,
optional: true,
// eslint-disable-next-line consistent-return
autoValue() {
if (this.isInsert && !this.isSet) {
return incrementCounter('counters', 'orgId', 1);
}
},
},
displayName: {
orgDisplayName: {
/**
* the name to display for the organization
*/
type: String,
optional: true,
},
desc: {
orgDesc: {
/**
* the description the organization
*/
@@ -33,7 +20,7 @@ Org.attachSchema(
optional: true,
max: 190,
},
name: {
orgShortName: {
/**
* short name of the organization
*/
@@ -41,7 +28,7 @@ Org.attachSchema(
optional: true,
max: 255,
},
website: {
orgWebsite: {
/**
* website of the organization
*/
@@ -49,66 +36,6 @@ Org.attachSchema(
optional: true,
max: 255,
},
teams: {
/**
* List of teams of a organization
*/
type: [Object],
// eslint-disable-next-line consistent-return
autoValue() {
if (this.isInsert && !this.isSet) {
return [
{
teamId: this.teamId,
isAdmin: true,
isActive: true,
isNoComments: false,
isCommentOnly: false,
isWorker: false,
},
];
}
},
},
'teams.$.teamId': {
/**
* The uniq ID of the team
*/
type: String,
},
'teams.$.isAdmin': {
/**
* Is the team an admin of the board?
*/
type: Boolean,
},
'teams.$.isActive': {
/**
* Is the team active?
*/
type: Boolean,
},
'teams.$.isNoComments': {
/**
* Is the team not allowed to make comments
*/
type: Boolean,
optional: true,
},
'teams.$.isCommentOnly': {
/**
* Is the team only allowed to comment on the board
*/
type: Boolean,
optional: true,
},
'teams.$.isWorker': {
/**
* Is the team only allowed to move card, assign himself to card and comment
*/
type: Boolean,
optional: true,
},
createdAt: {
/**
* creation date of the organization
@@ -140,6 +67,79 @@ Org.attachSchema(
}),
);
if (Meteor.isServer) {
Meteor.methods({
setCreateOrg(
orgDisplayName,
orgDesc,
orgShortName,
orgWebsite,
orgIsActive,
) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(orgDisplayName, String);
check(orgDesc, String);
check(orgShortName, String);
check(orgWebsite, String);
check(orgIsActive, String);
const nOrgNames = Org.find({ orgShortName }).count();
if (nOrgNames > 0) {
throw new Meteor.Error('orgname-already-taken');
} else {
Org.insert({
orgDisplayName,
orgDesc,
orgShortName,
orgWebsite,
orgIsActive,
});
}
}
},
setOrgDisplayName(org, orgDisplayName) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(org, String);
check(orgDisplayName, String);
Org.update(org, {
$set: { orgDisplayName: orgDisplayName },
});
}
},
setOrgDesc(org, orgDesc) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(org, String);
check(orgDesc, String);
Org.update(org, {
$set: { orgDesc: orgDesc },
});
}
},
setOrgShortName(org, orgShortName) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(org, String);
check(orgShortName, String);
Org.update(org, {
$set: { orgShortName: orgShortName },
});
}
},
setOrgIsActive(org, orgIsActive) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(org, String);
check(orgIsActive, String);
Org.update(org, {
$set: { orgIsActive: orgIsActive },
});
}
},
});
}
if (Meteor.isServer) {
// Index for Organization name.
Meteor.startup(() => {
+77 -17
View File
@@ -5,27 +5,14 @@ Team = new Mongo.Collection('team');
*/
Team.attachSchema(
new SimpleSchema({
_id: {
/**
* the organization id
*/
type: Number,
optional: true,
// eslint-disable-next-line consistent-return
autoValue() {
if (this.isInsert && !this.isSet) {
return incrementCounter('counters', 'orgId', 1);
}
},
},
displayName: {
teamDisplayName: {
/**
* the name to display for the team
*/
type: String,
optional: true,
},
desc: {
teamDesc: {
/**
* the description the team
*/
@@ -33,7 +20,7 @@ Team.attachSchema(
optional: true,
max: 190,
},
name: {
teamShortName: {
/**
* short name of the team
*/
@@ -41,7 +28,7 @@ Team.attachSchema(
optional: true,
max: 255,
},
website: {
teamWebsite: {
/**
* website of the team
*/
@@ -80,6 +67,79 @@ Team.attachSchema(
}),
);
if (Meteor.isServer) {
Meteor.methods({
setCreateTeam(
teamDisplayName,
teamDesc,
teamShortName,
teamWebsite,
teamIsActive,
) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(teamDisplayName, String);
check(teamDesc, String);
check(teamShortName, String);
check(teamWebsite, String);
check(teamIsActive, String);
const nTeamNames = Team.find({ teamShortName }).count();
if (nTeamNames > 0) {
throw new Meteor.Error('teamname-already-taken');
} else {
Team.insert({
teamDisplayName,
teamDesc,
teamShortName,
teamWebsite,
teamIsActive,
});
}
}
},
setTeamDisplayName(team, teamDisplayName) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(team, String);
check(teamDisplayName, String);
Team.update(team, {
$set: { teamDisplayName: teamDisplayName },
});
}
},
setTeamDesc(team, teamDesc) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(team, String);
check(teamDesc, String);
Team.update(team, {
$set: { teamDesc: teamDesc },
});
}
},
setTeamShortName(team, teamShortName) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(team, String);
check(teamShortName, String);
Team.update(team, {
$set: { teamShortName: teamShortName },
});
}
},
setTeamIsActive(team, teamIsActive) {
if (Meteor.user() && Meteor.user().isAdmin) {
check(team, String);
check(teamIsActive, String);
Team.update(team, {
$set: { teamIsActive: teamIsActive },
});
}
},
});
}
if (Meteor.isServer) {
// Index for Team name.
Meteor.startup(() => {
+9114 -180
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v4.95.0",
"version": "v4.96.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
+220 -2
View File
@@ -1528,7 +1528,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<ul class="toc-list-h1">
<li>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v4.95">Wekan REST API v4.95</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v4.96">Wekan REST API v4.96</a>
</li>
@@ -1606,6 +1606,11 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
</li>
<li>
<a href="#get_boards_count" class="toc-h2 toc-link" data-title="">get_boards_count</a>
</li>
<li>
<a href="#get_boards_from_user" class="toc-h2 toc-link" data-title="">get_boards_from_user</a>
@@ -2046,7 +2051,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<div class="page-wrapper">
<div class="dark-box"></div>
<div class="content">
<h1 id="wekan-rest-api">Wekan REST API v4.95</h1>
<h1 id="wekan-rest-api">Wekan REST API v4.96</h1>
<blockquote>
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
</blockquote>
@@ -4636,6 +4641,219 @@ System.out.println(response.toString());
To perform this operation, you must be authenticated by means of one of the following methods:
UserSecurity
</aside>
<h2 id="get_boards_count">get_boards_count</h2>
<p><a id="opIdget_boards_count"></a></p>
<blockquote>
<p>Code samples</p>
</blockquote>
<pre class="highlight tab tab-shell"><code><span class="hljs-comment"># You can also use wget</span>
curl -X GET /api/boards_count \
-H <span class="hljs-string">&#x27;Accept: application/json&#x27;</span> \
-H <span class="hljs-string">&#x27;Authorization: API_KEY&#x27;</span>
</code></pre>
<pre class="highlight tab tab-http"><code><span class="hljs-keyword">GET</span> <span class="hljs-string">/api/boards_count</span> <span class="hljs-meta">HTTP/1.1</span>
<span class="ada"><span class="hljs-keyword">Accept</span>: application/json
</span></code></pre>
<pre class="highlight tab tab-javascript"><code><span class="hljs-keyword">var</span> headers = {
<span class="hljs-string">&#x27;Accept&#x27;</span>:<span class="hljs-string">&#x27;application/json&#x27;</span>,
<span class="hljs-string">&#x27;Authorization&#x27;</span>:<span class="hljs-string">&#x27;API_KEY&#x27;</span>
};
$.ajax({
<span class="hljs-attr">url</span>: <span class="hljs-string">&#x27;/api/boards_count&#x27;</span>,
<span class="hljs-attr">method</span>: <span class="hljs-string">&#x27;get&#x27;</span>,
<span class="hljs-attr">headers</span>: headers,
<span class="hljs-attr">success</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) </span>{
<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">JSON</span>.stringify(data));
}
})
</code></pre>
<pre class="highlight tab tab-javascript--nodejs"><code><span class="hljs-keyword">const</span> fetch = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;node-fetch&#x27;</span>);
<span class="hljs-keyword">const</span> headers = {
<span class="hljs-string">&#x27;Accept&#x27;</span>:<span class="hljs-string">&#x27;application/json&#x27;</span>,
<span class="hljs-string">&#x27;Authorization&#x27;</span>:<span class="hljs-string">&#x27;API_KEY&#x27;</span>
};
fetch(<span class="hljs-string">&#x27;/api/boards_count&#x27;</span>,
{
<span class="hljs-attr">method</span>: <span class="hljs-string">&#x27;GET&#x27;</span>,
<span class="hljs-attr">headers</span>: headers
})
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">res</span>) </span>{
<span class="hljs-keyword">return</span> res.json();
}).then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">body</span>) </span>{
<span class="hljs-built_in">console</span>.log(body);
});
</code></pre>
<pre class="highlight tab tab-ruby"><code><span class="hljs-keyword">require</span> <span class="hljs-string">&#x27;rest-client&#x27;</span>
<span class="hljs-keyword">require</span> <span class="hljs-string">&#x27;json&#x27;</span>
headers = {
<span class="hljs-string">&#x27;Accept&#x27;</span> =&gt; <span class="hljs-string">&#x27;application/json&#x27;</span>,
<span class="hljs-string">&#x27;Authorization&#x27;</span> =&gt; <span class="hljs-string">&#x27;API_KEY&#x27;</span>
}
result = RestClient.get <span class="hljs-string">&#x27;/api/boards_count&#x27;</span>,
<span class="hljs-symbol">params:</span> {
}, <span class="hljs-symbol">headers:</span> headers
p JSON.parse(result)
</code></pre>
<pre class="highlight tab tab-python"><code><span class="hljs-keyword">import</span> requests
headers = {
<span class="hljs-string">&#x27;Accept&#x27;</span>: <span class="hljs-string">&#x27;application/json&#x27;</span>,
<span class="hljs-string">&#x27;Authorization&#x27;</span>: <span class="hljs-string">&#x27;API_KEY&#x27;</span>
}
r = requests.get(<span class="hljs-string">&#x27;/api/boards_count&#x27;</span>, params={
}, headers = headers)
<span class="hljs-built_in">print</span> r.json()
</code></pre>
<pre class="highlight tab tab-java"><code>URL obj = <span class="hljs-keyword">new</span> URL(<span class="hljs-string">&quot;/api/boards_count&quot;</span>);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod(<span class="hljs-string">&quot;GET&quot;</span>);
<span class="hljs-keyword">int</span> responseCode = con.getResponseCode();
BufferedReader in = <span class="hljs-keyword">new</span> BufferedReader(
<span class="hljs-keyword">new</span> InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = <span class="hljs-keyword">new</span> StringBuffer();
<span class="hljs-keyword">while</span> ((inputLine = in.readLine()) != <span class="hljs-keyword">null</span>) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
</code></pre>
<pre class="highlight tab tab-go"><code><span class="hljs-keyword">package</span> main
<span class="hljs-keyword">import</span> (
<span class="hljs-string">&quot;bytes&quot;</span>
<span class="hljs-string">&quot;net/http&quot;</span>
)
<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
headers := <span class="hljs-keyword">map</span>[<span class="hljs-keyword">string</span>][]<span class="hljs-keyword">string</span>{
<span class="hljs-string">&quot;Accept&quot;</span>: []<span class="hljs-keyword">string</span>{<span class="hljs-string">&quot;application/json&quot;</span>},
<span class="hljs-string">&quot;Authorization&quot;</span>: []<span class="hljs-keyword">string</span>{<span class="hljs-string">&quot;API_KEY&quot;</span>},
}
data := bytes.NewBuffer([]<span class="hljs-keyword">byte</span>{jsonReq})
req, err := http.NewRequest(<span class="hljs-string">&quot;GET&quot;</span>, <span class="hljs-string">&quot;/api/boards_count&quot;</span>, data)
req.Header = headers
client := &amp;http.Client{}
resp, err := client.Do(req)
<span class="hljs-comment">// ...</span>
}
</code></pre>
<pre class="highlight tab tab-php"><code> <span class="hljs-string">&#x27;application/json&#x27;</span>,
<span class="hljs-string">&#x27;Authorization&#x27;</span> =&gt; <span class="hljs-string">&#x27;API_KEY&#x27;</span>,
);
<span class="hljs-variable">$client</span> = <span class="hljs-keyword">new</span> \GuzzleHttp\Client();
<span class="hljs-comment">// Define array of request body.</span>
<span class="hljs-variable">$request_body</span> = <span class="hljs-keyword">array</span>();
<span class="hljs-keyword">try</span> {
<span class="hljs-variable">$response</span> = <span class="hljs-variable">$client</span>-&gt;request(<span class="hljs-string">&#x27;GET&#x27;</span>,<span class="hljs-string">&#x27;/api/boards_count&#x27;</span>, <span class="hljs-keyword">array</span>(
<span class="hljs-string">&#x27;headers&#x27;</span> =&gt; <span class="hljs-variable">$headers</span>,
<span class="hljs-string">&#x27;json&#x27;</span> =&gt; <span class="hljs-variable">$request_body</span>,
)
);
print_r(<span class="hljs-variable">$response</span>-&gt;getBody()-&gt;getContents());
}
<span class="hljs-keyword">catch</span> (\GuzzleHttp\<span class="hljs-built_in">Exception</span>\BadResponseException <span class="hljs-variable">$e</span>) {
<span class="hljs-comment">// handle exception or api errors.</span>
print_r(<span class="hljs-variable">$e</span>-&gt;getMessage());
}
<span class="hljs-comment">// ...</span>
</code></pre>
<p><code>GET /api/boards_count</code></p>
<p><em>Get public and private boards count</em></p>
<blockquote>
<p>Example responses</p>
</blockquote>
<blockquote>
<p>200 Response</p>
</blockquote>
<pre class="highlight tab tab-json"><code>{
<span class="hljs-attr">&quot;private&quot;</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">&quot;public&quot;</span>: <span class="hljs-number">0</span>
}
</code></pre>
<h3 id="get_boards_count-responses">Responses</h3>
<table>
<thead>
<tr>
<th>Status</th>
<th>Meaning</th>
<th>Description</th>
<th>Schema</th>
</tr>
</thead>
<tbody>
<tr>
<td>200</td>
<td><a href="https://tools.ietf.org/html/rfc7231#section-6.3.1">OK</a></td>
<td>200 response</td>
<td>Inline</td>
</tr>
</tbody>
</table>
<h3 id="get_boards_count-responseschema">Response Schema</h3>
<p>Status Code <strong>200</strong></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Required</th>
<th>Restrictions</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>» private</td>
<td>integer</td>
<td>false</td>
<td>none</td>
<td>none</td>
</tr>
<tr>
<td>» public</td>
<td>integer</td>
<td>false</td>
<td>none</td>
<td>none</td>
</tr>
</tbody>
</table>
<aside class="warning">
To perform this operation, you must be authenticated by means of one of the following methods:
UserSecurity
</aside>
<h2 id="get_boards_from_user">get_boards_from_user</h2>
<p><a id="opIdget_boards_from_user"></a></p>
<blockquote>
+22 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v4.95
version: v4.96
description: |
The REST API allows you to control and extend Wekan with ease.
@@ -2136,6 +2136,27 @@ paths:
type: string
listId:
type: string
/api/boards_count:
get:
operationId: get_boards_count
summary: Get public and private boards count
tags:
- Boards
produces:
- application/json
security:
- UserSecurity: []
responses:
'200':
description: |-
200 response
schema:
type: object
properties:
private:
type: integer
public:
type: integer
/api/createtoken/{user}:
post:
operationId: create_user_token
+2 -2
View File
@@ -18,8 +18,8 @@ REM Install chocolatey
choco install -y git curl python2 dotnet4.5.2 nano mongodb-3 mongoclient meteor
curl -O https://nodejs.org/dist/v12.20.0/node-v12.20.0-x64.msi
call node-v12.20.0-x64.msi
curl -O https://nodejs.org/dist/v12.20.2/node-v12.20.2-x64.msi
call node-v12.20.2-x64.msi
call npm config -g set msvs_version 2015
call meteor npm config -g set msvs_version 2015
+1 -1
View File
@@ -28,7 +28,7 @@ do
#curl -0 -L https://npmjs.org/install.sh | sudo sh
#sudo chown -R $(id -u):$(id -g) $HOME/.npm
sudo npm -g install n
sudo n 12.20.1
sudo n 12.20.2
#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
#sudo apt-get install -y nodejs
elif [[ "$OSTYPE" == "darwin"* ]]; then
+1
View File
@@ -0,0 +1 @@
git add CHANGELOG.md && git commit -n -m "Updated ChangeLog." && git push
+1 -1
View File
@@ -22,7 +22,7 @@ sudo sandstorm update
#rm -rf $WEKANDIR
#git clone git@github.com:wekan/wekan.git
#cd $WEKANDIR
#sudo n 12.20.1
#sudo n 12.20.2
#sudo mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp
# Build Wekan
#./releases/rebuild-release.sh
Loaded 100 of 103 files, more files were not shown because too many files have changed in this diff. Show more