mirror of
https://github.com/wekan/wekan.git
synced 2026-11-05 21:44:59 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dec21f34e9 | ||
|
|
c8605b0cdf | ||
|
|
3d6d191d59 | ||
|
|
8f61278b33 | ||
|
|
5723c0c96f | ||
|
|
2830bdc075 | ||
|
|
37ab621a7e | ||
|
|
f9f286e896 | ||
|
|
e47545aa91 | ||
|
|
799417e0e8 | ||
|
|
cea5f0a30c | ||
|
|
ce61e80261 | ||
|
|
ec23124242 | ||
|
|
678cc56836 | ||
|
|
adf94b5e21 | ||
|
|
d4e40c376a | ||
|
|
3cbf678671 | ||
|
|
c7ec07ed47 | ||
|
|
754d7d099b | ||
|
|
c4cc3f176e | ||
|
|
79a2921e1d | ||
|
|
d64a61bab9 | ||
|
|
0ee78865e1 | ||
|
|
2c29b150c5 | ||
|
|
0801a2fbc4 | ||
|
|
af7ef25c9d | ||
|
|
f852474b56 | ||
|
|
54cfe5984b | ||
|
|
1bc07b1b4a | ||
|
|
b8d52a5aa8 | ||
|
|
af58b1039e | ||
|
|
a124f1dc38 | ||
|
|
fa3e6267fd | ||
|
|
011f86f368 | ||
|
|
0f6edc477e | ||
|
|
bade652c02 | ||
|
|
03ab067d3a | ||
|
|
e3a29ae82f | ||
|
|
3a9ce0f6ce | ||
|
|
d6d40b35a5 | ||
|
|
8baecb5911 | ||
|
|
3bb8fe9076 | ||
|
|
b93d66ce0b | ||
|
|
b71fde7ff3 | ||
|
|
5c7b060f19 | ||
|
|
1f544fff52 | ||
|
|
019520a793 | ||
|
|
29c22efed0 | ||
|
|
650519683c | ||
|
|
bcf5a586c7 | ||
|
|
5d8f5beb2a | ||
|
|
7e58627eaf | ||
|
|
89be0f80b9 | ||
|
|
e8b6b78dfa |
No files matched your search
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -82,7 +82,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
showCardsCountForList(count) {
|
||||
const limit = this.limitToShowCardsCount();
|
||||
return limit >= 0 && count > limit;
|
||||
return limit >= 0 && count >= limit;
|
||||
},
|
||||
|
||||
events() {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
|
||||
@@ -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,5 +1,5 @@
|
||||
name: wekan
|
||||
version: 1.0.2
|
||||
version: 1.0.3
|
||||
apiVersion: v1
|
||||
description: Open Source kanban
|
||||
home: https://wekan.github.io/
|
||||
|
||||
@@ -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 -}}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 }}
|
||||
@@ -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
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+73
-73
@@ -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
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
@@ -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
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+3
-3
@@ -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
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+13
-13
@@ -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
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+954
-954
File diff suppressed because it is too large.
Load diff
+12
-10
@@ -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(
|
||||
|
||||
@@ -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
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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
@@ -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
@@ -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(() => {
|
||||
|
||||
Generated
+9114
-180
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v4.95.0",
|
||||
"version": "v4.96.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
+220
-2
@@ -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">'Accept: application/json'</span> \
|
||||
-H <span class="hljs-string">'Authorization: API_KEY'</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">'Accept'</span>:<span class="hljs-string">'application/json'</span>,
|
||||
<span class="hljs-string">'Authorization'</span>:<span class="hljs-string">'API_KEY'</span>
|
||||
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
<span class="hljs-attr">url</span>: <span class="hljs-string">'/api/boards_count'</span>,
|
||||
<span class="hljs-attr">method</span>: <span class="hljs-string">'get'</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">'node-fetch'</span>);
|
||||
|
||||
<span class="hljs-keyword">const</span> headers = {
|
||||
<span class="hljs-string">'Accept'</span>:<span class="hljs-string">'application/json'</span>,
|
||||
<span class="hljs-string">'Authorization'</span>:<span class="hljs-string">'API_KEY'</span>
|
||||
|
||||
};
|
||||
|
||||
fetch(<span class="hljs-string">'/api/boards_count'</span>,
|
||||
{
|
||||
<span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</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">'rest-client'</span>
|
||||
<span class="hljs-keyword">require</span> <span class="hljs-string">'json'</span>
|
||||
|
||||
headers = {
|
||||
<span class="hljs-string">'Accept'</span> => <span class="hljs-string">'application/json'</span>,
|
||||
<span class="hljs-string">'Authorization'</span> => <span class="hljs-string">'API_KEY'</span>
|
||||
}
|
||||
|
||||
result = RestClient.get <span class="hljs-string">'/api/boards_count'</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">'Accept'</span>: <span class="hljs-string">'application/json'</span>,
|
||||
<span class="hljs-string">'Authorization'</span>: <span class="hljs-string">'API_KEY'</span>
|
||||
}
|
||||
|
||||
r = requests.get(<span class="hljs-string">'/api/boards_count'</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">"/api/boards_count"</span>);
|
||||
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
|
||||
con.setRequestMethod(<span class="hljs-string">"GET"</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">"bytes"</span>
|
||||
<span class="hljs-string">"net/http"</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">"Accept"</span>: []<span class="hljs-keyword">string</span>{<span class="hljs-string">"application/json"</span>},
|
||||
<span class="hljs-string">"Authorization"</span>: []<span class="hljs-keyword">string</span>{<span class="hljs-string">"API_KEY"</span>},
|
||||
|
||||
}
|
||||
|
||||
data := bytes.NewBuffer([]<span class="hljs-keyword">byte</span>{jsonReq})
|
||||
req, err := http.NewRequest(<span class="hljs-string">"GET"</span>, <span class="hljs-string">"/api/boards_count"</span>, data)
|
||||
req.Header = headers
|
||||
|
||||
client := &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">'application/json'</span>,
|
||||
<span class="hljs-string">'Authorization'</span> => <span class="hljs-string">'API_KEY'</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>->request(<span class="hljs-string">'GET'</span>,<span class="hljs-string">'/api/boards_count'</span>, <span class="hljs-keyword">array</span>(
|
||||
<span class="hljs-string">'headers'</span> => <span class="hljs-variable">$headers</span>,
|
||||
<span class="hljs-string">'json'</span> => <span class="hljs-variable">$request_body</span>,
|
||||
)
|
||||
);
|
||||
print_r(<span class="hljs-variable">$response</span>->getBody()->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>->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">"private"</span>: <span class="hljs-number">0</span>,
|
||||
<span class="hljs-attr">"public"</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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
git add CHANGELOG.md && git commit -n -m "Updated ChangeLog." && git push
|
||||
@@ -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
Reference in new issue
Block a user