Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9654d17d5 | ||
|
|
c89f3ba3da | ||
|
|
1dc5ae444e | ||
|
|
5db67e47a8 | ||
|
|
3877e5feb9 | ||
|
|
7456186265 | ||
|
|
952f7feb49 | ||
|
|
3983d750f3 | ||
|
|
b4f2a8ab5b | ||
|
|
e8a4554789 | ||
|
|
de3bc9cb4d | ||
|
|
e09f028cd1 | ||
|
|
ea9f597685 | ||
|
|
e538fb9514 | ||
|
|
32fed3d048 | ||
|
|
c6b6d1aa40 | ||
|
|
b9615ccbad | ||
|
|
0032a91f66 | ||
|
|
88f6076422 | ||
|
|
8e11ecf799 | ||
|
|
d04c5c9846 | ||
|
|
e46a66904f | ||
|
|
d038cb4a2d | ||
|
|
78e68c7fea | ||
|
|
700f345576 | ||
|
|
22067198ab | ||
|
|
21d6dfd790 | ||
|
|
e663ce038a | ||
|
|
367b7778fd | ||
|
|
989e0a5326 | ||
|
|
13940f0663 | ||
|
|
09e87f207c | ||
|
|
f9884b7782 | ||
|
|
cca5f81c65 | ||
|
|
c863428aa2 | ||
|
|
2104b853ef | ||
|
|
00a56f6aaa | ||
|
|
67e7a75b9c | ||
|
|
52375df783 | ||
|
|
77fad0e7c6 | ||
|
|
802341384e | ||
|
|
057ac4031e | ||
|
|
ea5d0999c4 | ||
|
|
7b21650003 | ||
|
|
1cfaddff9c | ||
|
|
7690d91771 | ||
|
|
6b7b66801b | ||
|
|
d671071758 | ||
|
|
e9c1c620eb | ||
|
|
b17a8757fb | ||
|
|
2b04cef50b | ||
|
|
16060108b4 | ||
|
|
0fb2f7fdd6 | ||
|
|
c002cf759e | ||
|
|
5fee0b05e0 | ||
|
|
48bc176bdf | ||
|
|
ec56dc73c4 | ||
|
|
83e9d681d7 | ||
|
|
e0b9e80698 | ||
|
|
449c02c42a | ||
|
|
ce89ff4833 | ||
|
|
1961e22cbd | ||
|
|
b95ee7cf4d | ||
|
|
14b2291590 | ||
|
|
954ec05d41 | ||
|
|
4c25b40b2d | ||
|
|
1792e3d884 | ||
|
|
3c35a6400b | ||
|
|
2a4ba31a9e | ||
|
|
99a8afd6c3 | ||
|
|
cc9ff4c8db | ||
|
|
ed4189cc5e | ||
|
|
6d66e60830 | ||
|
|
930f0a7f82 | ||
|
|
89347e2a56 | ||
|
|
09a08cd074 | ||
|
|
c344474d9e | ||
|
|
d13d169768 | ||
|
|
e3929973d1 | ||
|
|
9b428150a4 | ||
|
|
8ba565042f | ||
|
|
6df03294bd | ||
|
|
4a40ac3ced | ||
|
|
2f34d65164 | ||
|
|
7c68d6a710 | ||
|
|
55fb7a8f27 | ||
|
|
bb9fb1187e | ||
|
|
f0170c576c | ||
|
|
02caaafc52 | ||
|
|
168b17ac4e | ||
|
|
e3214c874e | ||
|
|
91444cce9b | ||
|
|
c952aaadec | ||
|
|
77ab5c1690 | ||
|
|
37857935f3 | ||
|
|
e5c7650fc8 | ||
|
|
f42e0fe507 | ||
|
|
58dbd78997 | ||
|
|
04b995e77f | ||
|
|
82aa3fb7ee | ||
|
|
ec0e88ad2e | ||
|
|
cac28fde4d | ||
|
|
e65a8c9017 | ||
|
|
4a26f80fb1 | ||
|
|
bca8a72a0f | ||
|
|
13be8160d5 | ||
|
|
8efea6c4e2 | ||
|
|
36bb5e099e | ||
|
|
b86a24d97a | ||
|
|
3febe80329 | ||
|
|
b11a2103a4 | ||
|
|
4a9d881e47 | ||
|
|
8e5c6af612 | ||
|
|
ca588a4b54 | ||
|
|
258032acb0 | ||
|
|
2c9c9c4356 | ||
|
|
88d4e8a4d9 | ||
|
|
4e2a8735bc | ||
|
|
b72d24f6d0 | ||
|
|
1f2fb2ccce | ||
|
|
5e2b423ef8 | ||
|
|
79e2001708 | ||
|
|
2ea96518ad | ||
|
|
2666001226 | ||
|
|
1bd30bc121 | ||
|
|
d6d8144476 | ||
|
|
68e7818c1d | ||
|
|
e0e5f4514b | ||
|
|
c2942fa269 | ||
|
|
6f31240c74 | ||
|
|
5124265142 | ||
|
|
f0bd5eaca9 | ||
|
|
8589f85907 | ||
|
|
66d739b3b1 | ||
|
|
2206e34ab6 | ||
|
|
cc1ca4a1bb | ||
|
|
c8b1ef8ea6 | ||
|
|
f836faad48 | ||
|
|
7e27b916aa | ||
|
|
ae9963c1f7 | ||
|
|
2b4f4c8d4d | ||
|
|
68104fe578 | ||
|
|
6f2c46a747 | ||
|
|
e7e1f1b667 | ||
|
|
7dc20616a7 | ||
|
|
b5b323000a | ||
|
|
19d204c7a8 | ||
|
|
672c279b0a | ||
|
|
669e31ea64 | ||
|
|
4ab72170e3 | ||
|
|
9ca39696b3 | ||
|
|
7c36279308 | ||
|
|
89e5b3a979 | ||
|
|
58782c9a89 | ||
|
|
c3824dcbd2 | ||
|
|
cead2bc00f | ||
|
|
0d5380466a | ||
|
|
58f6acbc48 | ||
|
|
db73fb4e37 | ||
|
|
a3d4c3d948 | ||
|
|
f9dc5c6f80 | ||
|
|
96b763fb89 | ||
|
|
98a75305e7 | ||
|
|
0d8739327e | ||
|
|
7dc4d9bb71 | ||
|
|
c814221185 | ||
|
|
f2f6b57944 | ||
|
|
f50c2af914 | ||
|
|
5b7442436d | ||
|
|
9cebee7347 | ||
|
|
f311359373 | ||
|
|
31b9970c04 | ||
|
|
baf0edc51e | ||
|
|
69a2a76b2e | ||
|
|
7fd894f33d | ||
|
|
3f366844e2 | ||
|
|
4156b6f932 | ||
|
|
ed801f7082 | ||
|
|
cedd10e067 | ||
|
|
86b756b6bc | ||
|
|
259a12acf9 | ||
|
|
902f86d363 | ||
|
|
d5fc75e345 | ||
|
|
5650bd829a | ||
|
|
f9ad46180e | ||
|
|
6e534d7543 | ||
|
|
9aa56a8e42 | ||
|
|
4ed67832d2 | ||
|
|
3409de9ed1 | ||
|
|
e73a44d15b | ||
|
|
5cf30f05fd | ||
|
|
63117e87e7 | ||
|
|
a8e520e7f0 | ||
|
|
e14bb16d60 | ||
|
|
b704d58f0f | ||
|
|
246e9a7764 | ||
|
|
1c7b63f583 | ||
|
|
e6476319bc | ||
|
|
c954934b33 | ||
|
|
a72a6886f6 | ||
|
|
a601ba542a | ||
|
|
f22f470ba4 | ||
|
|
3faeeac126 | ||
|
|
40be1d416b | ||
|
|
9ef82458b7 | ||
|
|
da99e363cd | ||
|
|
3110bb48fd | ||
|
|
08e2f2f273 | ||
|
|
6636d12215 | ||
|
|
5f243d173a | ||
|
|
5ea8d3a4c6 | ||
|
|
dad3fd22ec | ||
|
|
f381402e8f | ||
|
|
f010235ff2 | ||
|
|
09f6dcbde1 | ||
|
|
224b8e3492 | ||
|
|
28612bbc8a | ||
|
|
dfe4f7bb56 | ||
|
|
3f28c0dd22 | ||
|
|
959dd1a95a | ||
|
|
d5297cd1df | ||
|
|
95404f43b7 | ||
|
|
9838af5e56 | ||
|
|
dab656f8ca | ||
|
|
802eeb1e6b | ||
|
|
98dd28818a | ||
|
|
f705373cc4 | ||
|
|
5bc60a8dab | ||
|
|
1c8f783767 | ||
|
|
24d3075c85 | ||
|
|
c461adff11 | ||
|
|
b172f7207d | ||
|
|
ef31fffa40 | ||
|
|
426632a307 | ||
|
|
2c708b6df6 | ||
|
|
b555d0ccc8 | ||
|
|
e1724c8a12 | ||
|
|
cd35574c0b | ||
|
|
d016cbcffc | ||
|
|
7e4b672888 | ||
|
|
06d9abf6f6 | ||
|
|
a1a6dae5c6 | ||
|
|
c5f40f1be9 | ||
|
|
4358cb5e57 | ||
|
|
a591bf05e0 | ||
|
|
568b7538ad | ||
|
|
bbd7765432 | ||
|
|
558024785f | ||
|
|
76043cc5b6 | ||
|
|
583fca1814 | ||
|
|
806201b8cb | ||
|
|
24c89aeb64 | ||
|
|
8f0d88d9e0 | ||
|
|
e92d8dc127 | ||
|
|
8a99e8f796 | ||
|
|
c0246c6834 | ||
|
|
42ed92f346 | ||
|
|
df0bd90fae | ||
|
|
3453f94b43 | ||
|
|
ca537e266d | ||
|
|
8f3c948614 | ||
|
|
059743ad34 | ||
|
|
33ccf68e17 | ||
|
|
b6f22712f9 | ||
|
|
9e413b3961 | ||
|
|
5dd318a481 | ||
|
|
1783257c0e | ||
|
|
966852c212 | ||
|
|
07d6c1e514 | ||
|
|
09be915ea5 | ||
|
|
abd3c95dfa | ||
|
|
3fa61ac23c | ||
|
|
00bbc26698 | ||
|
|
3004f54b5d | ||
|
|
ef5b888779 | ||
|
|
835e33bf09 | ||
|
|
8ba3a05648 | ||
|
|
73ae73d4c3 | ||
|
|
76175a711a | ||
|
|
574acd6744 | ||
|
|
9e0e052bba | ||
|
|
ffafb30b9b | ||
|
|
9c4e402e6c | ||
|
|
f6f9dbb5e3 | ||
|
|
7beced1e68 | ||
|
|
c8921b77f0 | ||
|
|
482ce0a265 | ||
|
|
c570405d02 | ||
|
|
35ed465e10 | ||
|
|
747bc4c088 | ||
|
|
7c156927e4 | ||
|
|
13f0c77fb6 | ||
|
|
82d9f77eb3 | ||
|
|
151699ceb9 | ||
|
|
cc5d5bdd01 | ||
|
|
f43dadc068 | ||
|
|
b24694bea3 | ||
|
|
f4b31aa771 | ||
|
|
3cd5d00b0b | ||
|
|
7112584139 | ||
|
|
639b9c8f56 | ||
|
|
791ebc6406 | ||
|
|
059134d3d0 | ||
|
|
3b0616c150 | ||
|
|
ad5c4fdca2 | ||
|
|
b219b8fb65 | ||
|
|
73a170a388 |
No files matched your search
+101
-94
@@ -1,20 +1,24 @@
|
||||
FROM ubuntu:21.10
|
||||
LABEL maintainer="sgr"
|
||||
FROM ubuntu:24.04
|
||||
LABEL maintainer="wekan"
|
||||
LABEL org.opencontainers.image.ref.name="ubuntu"
|
||||
LABEL org.opencontainers.image.version="24.04"
|
||||
LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
# so changing to 21.10. https://github.com/wekan/wekan/issues/4488
|
||||
|
||||
ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python3 git ca-certificates iproute2"
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ iproute2 apt-transport-https libarchive-tools git"
|
||||
ENV DEV_DEPS="curl python3 ca-certificates build-essential"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.21.4 \
|
||||
METEOR_RELEASE=METEOR@2.13 \
|
||||
METEOR_RELEASE=METEOR@2.14 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=latest \
|
||||
NPM_VERSION=6.14.17 \
|
||||
FIBERS_VERSION=4.0.1 \
|
||||
ARCHITECTURE=linux-x64 \
|
||||
SRC_PATH=./ \
|
||||
@@ -28,15 +32,14 @@ ENV \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
||||
ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
ATTACHMENTS_STORE_PATH="" \
|
||||
ATTACHMENTS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
ATTACHMENTS_UPLOAD_MIME_TYPES="" \
|
||||
ATTACHMENTS_UPLOAD_MAX_SIZE=0 \
|
||||
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
AVATARS_UPLOAD_MIME_TYPES="" \
|
||||
AVATARS_UPLOAD_MAX_SIZE=0 \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
IMAGE_COMPRESS_RATIO="" \
|
||||
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
|
||||
@@ -48,10 +51,12 @@ ENV \
|
||||
MATOMO_SITE_ID="" \
|
||||
MATOMO_DO_NOT_TRACK=true \
|
||||
MATOMO_WITH_USERNAME=false \
|
||||
METRICS_ALLOWED_IP_ADDRESSES="" \
|
||||
BROWSER_POLICY_ENABLED=true \
|
||||
TRUSTED_URL="" \
|
||||
WEBHOOKS_ATTRIBUTES="" \
|
||||
OAUTH2_ENABLED=false \
|
||||
OIDC_REDIRECTION_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_B2C_ENABLED=false \
|
||||
@@ -71,6 +76,9 @@ ENV \
|
||||
LDAP_ENABLE=false \
|
||||
LDAP_PORT=389 \
|
||||
LDAP_HOST="" \
|
||||
LDAP_AD_SIMPLE_AUTH="" \
|
||||
LDAP_USER_AUTHENTICATION=false \
|
||||
LDAP_USER_AUTHENTICATION_FIELD=uid \
|
||||
LDAP_BASEDN="" \
|
||||
LDAP_LOGIN_FALLBACK=false \
|
||||
LDAP_RECONNECT=true \
|
||||
@@ -88,8 +96,6 @@ ENV \
|
||||
LDAP_ENCRYPTION=false \
|
||||
LDAP_CA_CERT="" \
|
||||
LDAP_REJECT_UNAUTHORIZED=false \
|
||||
LDAP_USER_AUTHENTICATION=false \
|
||||
LDAP_USER_AUTHENTICATION_FIELD=uid \
|
||||
LDAP_USER_SEARCH_FILTER="" \
|
||||
LDAP_USER_SEARCH_SCOPE="" \
|
||||
LDAP_USER_SEARCH_FIELD="" \
|
||||
@@ -144,69 +150,32 @@ ENV \
|
||||
SAML_IDENTIFIER_FORMAT="" \
|
||||
SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \
|
||||
SAML_ATTRIBUTES="" \
|
||||
DEFAULT_WAIT_SPINNER="" \
|
||||
ORACLE_OIM_ENABLED=false \
|
||||
WAIT_SPINNER="" \
|
||||
WRITABLE_PATH=/data \
|
||||
S3=""
|
||||
# \
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
# Add more Node heap:
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
# https://github.com/wekan/wekan/wiki/autologin
|
||||
#- OIDC_REDIRECTION_ENABLED=true
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Install OS
|
||||
RUN set -o xtrace \
|
||||
&& useradd --user-group -m --system --home-dir /home/wekan wekan \
|
||||
&& apt-get update \
|
||||
&& apt-get install --assume-yes --no-install-recommends apt-utils apt-transport-https ca-certificates 2>&1 \
|
||||
&& apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
|
||||
|
||||
# OLD:
|
||||
# && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$ARCHITECTURE.tar.xz" \
|
||||
# && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
|
||||
# Install NodeJS
|
||||
RUN set -o xtrace \
|
||||
&& cd /tmp \
|
||||
&& curl -fsSLO --compressed "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.xz" \
|
||||
&& curl -fsSLO --compressed "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt" \
|
||||
&& grep " node-$NODE_VERSION-$ARCHITECTURE.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
|
||||
&& tar -xJf "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
|
||||
&& rm "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" SHASUMS256.txt \
|
||||
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs \
|
||||
&& mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config \
|
||||
&& npm install -g npm@${NPM_VERSION} \
|
||||
&& chown wekan:wekan --recursive /home/wekan/.config
|
||||
|
||||
ENV DEBIAN_FRONTEND=dialog
|
||||
|
||||
USER wekan
|
||||
|
||||
# Install Meteor
|
||||
RUN set -o xtrace \
|
||||
&& cd /home/wekan \
|
||||
&& curl https://install.meteor.com/?release=$METEOR_VERSION --output /home/wekan/install-meteor.sh \
|
||||
# Replace tar with bsdtar in the install script; https://github.com/jshimko/meteor-launchpad/issues/39
|
||||
&& sed --in-place "s/tar -xzf.*/bsdtar -xf \"\$TARBALL_FILE\" -C \"\$INSTALL_TMPDIR\"/g" /home/wekan/install-meteor.sh \
|
||||
&& sed --in-place 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' /home/wekan/install-meteor.sh \
|
||||
&& printf "\n[-] Installing Meteor $METEOR_VERSION...\n\n" \
|
||||
&& sh /home/wekan/install-meteor.sh
|
||||
|
||||
ENV PATH=$PATH:/home/wekan/.meteor/
|
||||
|
||||
USER root
|
||||
|
||||
RUN echo "export PATH=$PATH" >> /etc/environment
|
||||
|
||||
USER wekan
|
||||
RUN <<EOR
|
||||
echo "export PATH=$PATH" >> /etc/environment
|
||||
EOR
|
||||
|
||||
# Copy source dir
|
||||
RUN set -o xtrace \
|
||||
&& mkdir -p /home/wekan/app/.meteor \
|
||||
&& mkdir -p /home/wekan/app/packages
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
mkdir -p /home/wekan/app/.meteor
|
||||
mkdir -p /home/wekan/app/packages
|
||||
EOR
|
||||
|
||||
COPY \
|
||||
.meteor/.finished-upgraders \
|
||||
@@ -231,44 +200,83 @@ COPY \
|
||||
packages \
|
||||
/home/wekan/app/packages/
|
||||
|
||||
USER root
|
||||
# Install OS
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
RUN set -o xtrace \
|
||||
&& chown -R wekan:wekan /home/wekan/app /home/wekan/.meteor
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update --assume-yes
|
||||
apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS} ${DEV_DEPS}
|
||||
|
||||
USER wekan
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
/home/wekan/.meteor/meteor add standard-minifier-js && \
|
||||
/home/wekan/.meteor/meteor npm install && \
|
||||
/home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
# Install NodeJS
|
||||
cd /tmp
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w package.json npm-shrinkwrap.json && \
|
||||
npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js
|
||||
# Download nodejs
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz"
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt"
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep "node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz" "SHASUMS256.txt" | shasum -a 256 -c -
|
||||
rm -f "SHASUMS256.txt"
|
||||
|
||||
# Install Node
|
||||
tar xzf "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" -C /usr/local --strip-components=1 --no-same-owner
|
||||
rm "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" "SHASUMS256.txt"
|
||||
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
|
||||
mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
|
||||
|
||||
# Install node dependencies
|
||||
npm install -g npm@${NPM_VERSION}
|
||||
chown --recursive wekan:wekan /home/wekan/.config
|
||||
|
||||
# Install Meteor
|
||||
cd /home/wekan
|
||||
chown --recursive wekan:wekan /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown --recursive wekan:wekan /home/wekan/.meteor
|
||||
|
||||
# sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js
|
||||
cd /home/wekan/.meteor
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help
|
||||
|
||||
# Build app (Development)
|
||||
cd /home/wekan/app
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor npm install
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
USER root
|
||||
# Cleanup
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
apt-get clean -y && \
|
||||
apt-get autoremove -y && \
|
||||
rm -Rf /tmp/* && \
|
||||
rm -Rf /home/wekan/app_build && \
|
||||
rm -Rf /var/cache/apt /var/lib/apt/lists && \
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
apt-get remove --purge --assume-yes ${BUILD_DEPS}
|
||||
apt-get install --assume-yes --no-install-recommends build-essential
|
||||
apt-get autoremove --assume-yes
|
||||
apt-get clean --assume-yes
|
||||
rm -Rf /tmp/*
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
rm -Rf /var/cache/apt
|
||||
rm -Rf /var/lib/apt/lists
|
||||
rm -Rf /home/wekan/app_build
|
||||
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
EOR
|
||||
|
||||
USER wekan
|
||||
|
||||
ENV PORT=3000
|
||||
EXPOSE $PORT
|
||||
|
||||
STOPSIGNAL SIGKILL
|
||||
WORKDIR /home/wekan/app
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
@@ -278,7 +286,6 @@ WORKDIR /home/wekan/app
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
#---------------------------------------------------------------------
|
||||
#TODO:
|
||||
#CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
#
|
||||
|
||||
CMD ["/home/wekan/.meteor/meteor", "run", "--verbose", "--settings", "settings.json"]
|
||||
+29
-11
@@ -1,18 +1,24 @@
|
||||
## Issue
|
||||
<!--
|
||||
Please report these elsewhere:
|
||||
|
||||
Please report these issues elsewhere:
|
||||
|
||||
- SECURITY ISSUES, PGP EMAIL: https://github.com/wekan/wekan/blob/main/SECURITY.md
|
||||
- UCS: https://github.com/wekan/univention/issues
|
||||
|
||||
**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to the newest WeKan ® before reporting an issue.
|
||||
**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to the newest
|
||||
WeKan ® before reporting an issue, if possible.
|
||||
|
||||
Please search existing Open and Closed issues, most questions have already been answered.
|
||||
|
||||
If you can not login for any reason: https://github.com/wekan/wekan/wiki/Forgot-Password
|
||||
Email settings, only SMTP MAIL_URL and MAIL_FROM are in use: https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
|
||||
-->
|
||||
Email settings, only SMTP MAIL_URL and MAIL_FROM are in use:
|
||||
https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
|
||||
|
||||
### Server Setup Information
|
||||
<!-- Please anonymize info, and do not any of your Wekan board URLs, passwords, API tokens etc to this public issue. -->
|
||||
|
||||
Please anonymize info, and do not any of your Wekan board URLs, passwords,
|
||||
API tokens etc to this public issue.
|
||||
|
||||
* Did you test in newest Wekan?:
|
||||
* Did you configure root-url correctly so Wekan cards open correctly (see https://github.com/wekan/wekan/wiki/Settings)?
|
||||
* Operating System:
|
||||
@@ -23,13 +29,25 @@ Email settings, only SMTP MAIL_URL and MAIL_FROM are in use: https://github.com/
|
||||
* What webbrowser version are you using (Wekan should work on all modern browsers that support Javascript)?
|
||||
|
||||
### Problem description
|
||||
<!-- Add a recorded animated gif (e.g. with https://github.com/phw/peek) about how it works currently, and screenshot mockups how it should work. -->
|
||||
|
||||
Add a recorded animated gif (e.g. with https://github.com/phw/peek) about
|
||||
how it works currently, and screenshot mockups how it should work.
|
||||
|
||||
|
||||
#### Reproduction Steps
|
||||
|
||||
#### Logs
|
||||
<!-- Check Right Click>Inspect>Console in you browser - generally Chrome shows more detailed info than Firefox. -->
|
||||
|
||||
<!-- Please anonymize logs.
|
||||
|
||||
#### Logs
|
||||
|
||||
Check Right Click / Inspect / Console in you browser - generally Chromium
|
||||
based browsers show more detailed info than Firefox based browsers.
|
||||
|
||||
Please anonymize logs.
|
||||
|
||||
Snap: sudo snap logs wekan.wekan
|
||||
|
||||
Docker: sudo docker logs wekan-app
|
||||
If logs are very long, attach them in .zip file -->
|
||||
|
||||
If logs are very long, attach them in .zip file
|
||||
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
# Build and push Docker image with Buildx (don't push on PR)
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56
|
||||
uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -125,7 +125,7 @@ jobs:
|
||||
v1-meteor_build_cache-
|
||||
|
||||
- name: Setup meteor
|
||||
uses: meteorengineer/setup-meteor@v1
|
||||
uses: meteorengineer/setup-meteor@v2
|
||||
with:
|
||||
meteor-release: '2.2'
|
||||
|
||||
@@ -157,7 +157,7 @@ jobs:
|
||||
|
||||
|
||||
- name: Coverage Report
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v2.2.0
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v3.0.0
|
||||
with:
|
||||
path: ".coverage/lcov.info"
|
||||
min_coverage: 1 # TODO add tests and increase to 95!
|
||||
+407
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
Newest WeKan at these amd64 platforms:
|
||||
|
||||
- Linux bundle
|
||||
- Windows and Linux bundle
|
||||
- Snap Candidate
|
||||
- Docker
|
||||
- Kubernetes
|
||||
@@ -15,6 +15,412 @@ Fixing other platforms In Progress.
|
||||
|
||||
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
|
||||
|
||||
# v7.52 2024-08-03 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Helm Chart: Add option to set resource limits for initContainer](https://github.com/wekan/charts/pull/33).
|
||||
Thanks to mreichelt-dicos.
|
||||
- [Helm Chart: Fixes for mongodb persistence. Please test is this correct](https://github.com/wekan/charts/commit/7efb071dd91d76c3971e1865fd18f9d43d8c6891).
|
||||
Thanks to emoritzx.
|
||||
- [Helm Chart: Added info about rarely used running WeKan at subpath](https://github.com/wekan/charts/commit/7d4176c7b328c5477c1fa29a323574aac78616a9).
|
||||
Thanks to emoritzx.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5460),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5464),
|
||||
[Part 3](https://github.com/wekan/wekan/pull/5460),
|
||||
[Part 4](https://github.com/wekan/wekan/pull/5469),
|
||||
[Part 5](https://github.com/wekan/wekan/pull/5470),
|
||||
[Part 6](https://github.com/wekan/wekan/pull/5471),
|
||||
[Part 7](https://github.com/wekan/wekan/pull/5473).
|
||||
Thanks to dependabot.
|
||||
- Added RepoCloud SaaS.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/21d6dfd79090f9885635f55537bd9fa1ef8539e1),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e663ce038af397f547e8823d61ce5dc2e3cea84d),
|
||||
[Part 3](https://github.com/wekan/wekan.github.io/commit/e9e0550824cdda31daae42df7c497fbd037fd78f).
|
||||
Thanks to RepoCloud.
|
||||
- [Updated WeKan app webmanifest](https://github.com/wekan/wekan/commit/745618626535743938b9d2e8c88afe6345807a85).
|
||||
Thanks to xet7.
|
||||
- [Revert forking of ldapjs](https://github.com/wekan/wekan/commit/c89f3ba3da6512169e033d76377a9190b35a92d2).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixes to Clean light and Clean dark themes](https://github.com/wekan/wekan/pull/5458).
|
||||
Thanks to abramchikd.
|
||||
- [Activities, adding back "created at" field](https://github.com/wekan/wekan/pull/5476).
|
||||
Thanks to mfilser.
|
||||
- [Fix typos at attachments code](https://github.com/wekan/wekan/commit/de3bc9cb4d20590c45ff72ef7749d830ea3fc16c).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.51 2024-06-27 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/pull/5452).
|
||||
Thanks to dependabot.
|
||||
- Moved docs from wiki to wekan repo docs directory, organized to subdirectories. Organizing and updating in progress.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/1961e22cbd51e83aa131c8b092c7d43475a021eb),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/ce89ff48331a27ffb42d021833c78df3a462b9db),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/449c02c42a0183a49592ada89bdfb8f25e5db903),
|
||||
[Part 4](https://github.com/wekan/wekan/commit/0fb2f7fdd6b6cb828ab4ea534204a5b834d2e19a),
|
||||
[Part 5](https://github.com/wekan/wekan/commit/e9c1c620eb938349c30761497066daf41cdcfc19),
|
||||
[Part 6](https://github.com/wekan/wekan/commit/6b7b66801b716e1d0bf2548b18eed4ed4e354f2d),
|
||||
[Part 7](https://github.com/wekan/wekan/commit/1cfaddff9cd4fe84fb74c80d1585f2a5dd65f5ca),
|
||||
[Part 8](https://github.com/wekan/wekan/commit/057ac4031eaa912b849c637e163f4dffa79a9329),
|
||||
[Part 9](https://github.com/wekan/wekan/commit/52375df78380bbe3407b51dc986baaf6f31f40e4),
|
||||
[Part 10](https://github.com/wekan/wekan/commit/00a56f6aaa0c2bcd24ca8829a0718b45e7cedf04),
|
||||
[Part 11](https://github.com/wekan/wekan/commit/c863428aa2597457fc4931e7b1bdd75d6cc2610b).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix ModernDark Cards not showing correctly](https://github.com/wekan/wekan/pull/5455).
|
||||
Thanks to walster001.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.50 2024-06-22 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added "Clean dark" and "Clean light" themes that are more clean and modern looking](https://github.com/wekan/wekan/pull/5449).
|
||||
Thanks to abramchikd.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated docs for WeKan version for Windows.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/9b428150a4fb9efdcb2ae9d3bb59d0da29529e69),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/3c35a6400b88e071a474a552ee941892522c8d59).
|
||||
Thanks to xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5446),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/99a8afd6c39591e0d85fe5f55ebc3016b9e7f011).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Task card may overflow below the screen when maximized, making the bottom part not viewable](https://github.com/wekan/wekan/pull/5443).
|
||||
Thanks to Hekatomb.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.49 2024-06-11 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [WeKan new release version number from wiki to WeKan repo docs](https://github.com/wekan/wekan/commit/e5c7650fc8eb5c3fcc6216f12e806ceb56fd94d9).
|
||||
Thanks to xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5430),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5441).
|
||||
Thanks to dependabot.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Bugfix: Strikethrough inactive Teams and orginizations logic was inverted](https://github.com/wekan/wekan/pull/5435).
|
||||
Thanks to Hekatomb.
|
||||
- [Changed back to original icon of Edit Description](https://github.com/wekan/wekan/commit/e3214c874ec9369ab6b865154f7964da8ec55f45).
|
||||
Thanks to saschafoerster, C0rn3j and xet7.
|
||||
- [Fill out Org and Team in adminReports](https://github.com/wekan/wekan/pull/5440).
|
||||
Thanks to Hekatomb.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.48 2024-06-06 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/4a9d881e47751ec49d24af5bf4fd1c5452ceb194).
|
||||
Thanks to xet7.
|
||||
- Add changes from wiki to docs.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/13be8160d5b6a894c674d04c37ff9e653e7bd4b0),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e65a8c90177cd948ca8212486a365b65cd7d5372).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Admin Panel pages Organizations and Teams, where HTML Tables were broken](https://github.com/wekan/wekan/commit/36bb5e099ed9f1f88c0399867bd76f040467745c).
|
||||
Thanks to Hekatomb and xet7.
|
||||
- [Try to show more of title of collapsed list](https://github.com/wekan/wekan/commit/ec0e88ad2e914437b4767456a160f2c1138fc5f2).
|
||||
Thanks to C0rn3j and xet7.
|
||||
- [Allow Normal user to add new swimlane, list and label](https://github.com/wekan/wekan/commit/04b995e77fdb5abc186e02482a75aba6a5cf0759).
|
||||
Thanks to RyanHecht, norrig and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.47 2024-06-03 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update Docker base images to Ubuntu 24.04](https://github.com/wekan/wekan/commit/79e2001708b5110b26cf54b15bbbf90f7977fe90).
|
||||
Thanks to xet7.
|
||||
- [Updated to MongoDB 6.0.15 at Snap Candidate](https://github.com/wekan/wekan/commit/4e2a8735bc2e449a2a3c949d042fb625052a1152).
|
||||
Thanks to MongoDB developers.
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/2c9c9c43561093801004f0268d58b29d9a10b570).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Only show Board name edit button to BoardAdmin](https://github.com/wekan/wekan/commit/5e2b423ef87c62a70a6b08abd2f185fd560f391f).
|
||||
Thanks to xet7.
|
||||
- [Fix Edit Description button is wildly out of place](https://github.com/wekan/wekan/commit/1f2fb2ccce38e9cac348f1c459784d6e5a949ded).
|
||||
Thanks to C0rn3j and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.46 2024-06-03 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update ukrainian translation](https://github.com/wekan/wekan/pull/5405).
|
||||
Thanks to novashdima.
|
||||
- [Updated GitHub issue template for issue instructions to be more visible](https://github.com/wekan/wekan/commit/5124265142c94d5044b81f81eaaa9c3bc01cef58).
|
||||
Thanks to xet7.
|
||||
- [For development, only recommend Debian 12 amd64, because Sandstorm works at Debian 12. Sandstorm does not work at Ubuntu 24.04](https://github.com/wekan/wekan/commit/1bd30bc12129be8cc8a633a561bb8a5be76823d7).
|
||||
Thanks to xet7. Related https://github.com/sandstorm-io/sandstorm/issues/3712
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Optimize SVGs and PNGs to save 550KB](https://github.com/wekan/wekan/pull/5403).
|
||||
Thanks to C0rn3j.
|
||||
- [Swap deprecated egrep for grep -E](https://github.com/wekan/wekan/pull/5404).
|
||||
Thanks to C0rn3j.
|
||||
- [Remove notification while copying board](https://github.com/wekan/wekan/pull/5412).
|
||||
Thanks to e-gaulue.
|
||||
- [Fixed loading of cards if there are more than 20 of them on one swimlane](https://github.com/wekan/wekan/pull/5417).
|
||||
Thanks to novashdima.
|
||||
- [Devcontainer, reduce image size and other necessary changes for development](https://github.com/wekan/wekan/pull/5418).
|
||||
Thanks to mfilser.
|
||||
- [Dockerfile production and dev same build](https://github.com/wekan/wekan/pull/5419).
|
||||
Thanks to mfilser.
|
||||
- [Remove second created at on activities](https://github.com/wekan/wekan/pull/5420).
|
||||
Thanks to mfilser.
|
||||
- [Fix Export CSV/TSV from Board create unhandled Exception](https://github.com/wekan/wekan/pull/5424).
|
||||
Thanks to Dexus.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.45 2024-05-06 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update Docker base container to Ubuntu 24.04, and update software versions](https://github.com/wekan/wekan/commit/63117e87e759af965c8eeceaaa41f52815630d20).
|
||||
Thanks to developers of dependencies.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/pull/5392).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix display of tables with a large number of rows](https://github.com/wekan/wekan/pull/5393).
|
||||
Thanks to novashdima.
|
||||
- [Fix white List color and define Silver in CSS instead of leaving it unset](https://github.com/wekan/wekan/pull/5400).
|
||||
Thanks to C0rn3j.
|
||||
- [Allow silver color to be set in List and Swimlane](https://github.com/wekan/wekan/pull/5401).
|
||||
Thanks to C0rn3j.
|
||||
- [Fix Can't set a Due Date that has a leading zero in time, errors with invalid time](https://github.com/wekan/wekan/commit/9cebee734740790145ca574c539ccebd067cee7e).
|
||||
Thanks to C0rn3j and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.44 2024-04-26 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Collapse Lists](https://github.com/wekan/wekan/commit/a601ba542aebefdfa8b5d683d22405ab3d5f8569).
|
||||
Thanks to xet7.
|
||||
- [Collapse Swimlanes. In Progress, does not work yet, not visible yet](https://github.com/wekan/wekan/commit b704d58f0f3cf5e7785b79d5a6c9f6c63da4159c).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix board not visible at Collapse Lists](https://github.com/wekan/wekan/commit/e6476319bcb06cc71fa0eefa0a608ec3a7b89767).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.43 2024-04-18 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated release script for Windows On-Premise, that is without container like Docker and Snap](https://github.com/wekan/wekan/commit/802eeb1e6bb87c45fa79298f67ff690e87f939f8).
|
||||
Thanks to xet7.
|
||||
- [Updated translations Transifex URL at readme](https://github.com/wekan/wekan/commit/9838af5e5630a6ef34175e110ddfb6bfc225b40c).
|
||||
Thanks to xet7.
|
||||
- [Improve Docker files](https://github.com/wekan/wekan/pull/5377).
|
||||
Thanks to C0rn3j.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/08e2f2f2731856255e0b40eb692328424efdf9ac),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/da99e363cd72cda7d400ce65785a6650e42c72cf).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix DEBUG environment variable check](https://github.com/wekan/wekan/pull/5380).
|
||||
Thanks to verdel.
|
||||
- [By default, use localized long date-time format](https://github.com/wekan/wekan/pull/5381).
|
||||
Thanks to tvogel.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.42 2024-04-03 WeKan ® release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY ISSUES:
|
||||
|
||||
- [Fixed CRITICAL SECURITY ISSUE by updating meteor-node-stubs](https://github.com/wekan/wekan/commit/c461adff11456734fcb9193b5522cc6451078732).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5355),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5356),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/1c8f783767a680758f2219d2f416ce3ae2fb0c57).
|
||||
Thanks to dependabot and developers of dependencies.
|
||||
- [Small tweaks to moderndark theme](https://github.com/wekan/wekan/pull/5363).
|
||||
Thanks to jghaanstra.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed link at readme](https://github.com/wekan/wekan/pull/5360).
|
||||
Thanks to dyercode.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.41 2024-03-18 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- Fixes for mongosh to allow snap packages to update to the edge/candidate version.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5349),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5350).
|
||||
Thanks to lorodoes.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.40 2024-03-17 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed centering of text below custom login logo](https://github.com/wekan/wekan/commit/24c89aeb64cf6266d95f42124419d4f070864631).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger margin is too much in mobile](https://github.com/wekan/wekan/commit/583fca1814d916490b04947ba8d97dd85168fb22).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.39 2024-03-16 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Clarify usage of api.py.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5341).
|
||||
[Part 2](https://github.com/wekan/wekan/commit/8f3c948614df0641b0971d1882cc241587d9d3b4).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5343),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5344).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Make the contents of the cards grow to the list width](https://github.com/wekan/wekan/pull/5346).
|
||||
Thanks to kuba-orlik.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.38 2024-03-10 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added docs wikis to WeKan repo directory docs, to make possible to send PRs](https://github.com/wekan/wekan/commit/73ae73d4c38640e9daedbe8ef9e5b25b877ee804).
|
||||
Thanks to e-gaulue, C0rn3j and xet7.
|
||||
- [Added script to count lines of code changed per committer email address, because GitHub removed that feature from web UI](https://github.com/wekan/wekan/commit/835e33bf090022875f50916412f80b6a9b4a3b21).
|
||||
Thanks to bgwines and xet7.
|
||||
- [Add info about GitHub top committers at Finland](https://github.com/wekan/wekan/commit/ef5b8887799a75ab797655f39483bc08841815d2).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated contributing to wiki](https://github.com/wekan/wekan/commit/8ba3a05648818f6162b2021affeb33066f91c400).
|
||||
Thanks to xet7.
|
||||
- [Upgraded to MongoDB 6.0.14 at Snap Candidate](https://github.com/wekan/wekan/commit/07d6c1e5148eb0392357d55d0486a9672378c16f).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and tried to fix the following bugs:
|
||||
|
||||
- [Fix error during delete](https://github.com/wekan/wekan/pull/5336).
|
||||
Thanks to xator91.
|
||||
- [Fixed text below custom login logo not visible](https://github.com/wekan/wekan/commit/00bbc2669814247c0ff79bd816be7bf34bcf08a2).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger needs margin](https://github.com/wekan/wekan/commit/abd3c95dfa13cd697ff2fb7e299c85287406772a).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.37 2024-03-07 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed API get swimlane cards wrong order. Please test](https://github.com/wekan/wekan/commit/7beced1e683c2eb2960b0ee40d5ec927d235fa6a).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
- [Fixed API get_all_cards doesn't return SwimlaneId. Please test](https://github.com/wekan/wekan/commit/ffafb30b9b394188e1b60ec836ad83f1738c266d).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.36 2024-03-06 WeKan ® release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [api.py: checklistid, checklistinfo, get_list_cards_count and get_board_cards_count](https://github.com/wekan/wekan/pull/5326).
|
||||
Thanks to xator91.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Card image cover should be margin-top:6px since hamburger menu and due date at the top](https://github.com/wekan/wekan/commit/747bc4c08837ad9781d63b9f16b97a64b0bfe7b8).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- [Try to fix API get cards wrong order. Please test](https://github.com/wekan/wekan/commit/c570405d0267e28f2b2644005d48fb097eac385b).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.35 2024-02-27 WeKan ® release
|
||||
|
||||
This release adds the following features and bugs:
|
||||
|
||||
- [Added back Mathjax that has bug of showing math twice](https://github.com/wekan/wekan/commit/f43dadc06894d874281ec0e449dcc4c81b3c59ad).
|
||||
Thanks to macthecadillac, Dexus and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.34 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated translations](https://github.com/wekan/wekan/commit/3cd5d00b0b8d74acb2cd2afbc12f5b9d7aafcbd8).
|
||||
Thanks to translators.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.33 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated docs for previous version of WeKan](https://github.com/wekan/wekan/commit/3b0616c1500b5070e660d2ba00968d59600958eb).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [OpenAPI: Fix breakage introduced with blank return](https://github.com/wekan/wekan/pull/5321).
|
||||
Thanks to bentiss.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.32 2024-02-22 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
+3
-7
@@ -27,13 +27,9 @@ CVE Hall of Fame is at https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Contributing to Documentation Wiki
|
||||
|
||||
Please clone wiki:
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
Edit .md files, and add changed files in .zip attachment
|
||||
directly to comment of new issue at
|
||||
https://github.com/wekan/wekan/issues
|
||||
Fork WeKan repo https://github.com/wekan/wekan ,
|
||||
edit `docs` directory content at GitHub web interface,
|
||||
and click send PR.
|
||||
|
||||
## Contributing code
|
||||
|
||||
|
||||
+99
-108
@@ -1,13 +1,8 @@
|
||||
FROM --platform=linux/amd64 ubuntu:23.10 as wekan
|
||||
LABEL maintainer="wekan" \
|
||||
org.opencontainers.image.ref.name="ubuntu" \
|
||||
org.opencontainers.image.version="23.10" \
|
||||
org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# 2022-09-04:
|
||||
# - above "--platform=linux/amd64 ubuntu:22.04 as wekan" is needed to build Dockerfile
|
||||
# correctly on Mac M1 etc, to not get this error:
|
||||
# https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc
|
||||
FROM ubuntu:24.04
|
||||
LABEL maintainer="wekan"
|
||||
LABEL org.opencontainers.image.ref.name="ubuntu"
|
||||
LABEL org.opencontainers.image.version="24.04"
|
||||
LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
@@ -16,19 +11,17 @@ LABEL maintainer="wekan" \
|
||||
# 2021-09-18:
|
||||
# - Above Ubuntu base image copied from Docker Hub ubuntu:hirsute-20210825
|
||||
# to Quay to avoid Docker Hub rate limits.
|
||||
|
||||
# Set the environment variables (defaults where required)
|
||||
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
# ENV BUILD_DEPS="paxctl"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
|
||||
ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3"
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.21.4 \
|
||||
METEOR_RELEASE=METEOR@2.13.3 \
|
||||
METEOR_RELEASE=METEOR@2.14 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=9.8.1 \
|
||||
NPM_VERSION=6.14.17 \
|
||||
FIBERS_VERSION=4.0.1 \
|
||||
ARCHITECTURE=linux-x64 \
|
||||
SRC_PATH=./ \
|
||||
@@ -165,7 +158,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
WRITABLE_PATH=/data \
|
||||
S3=""
|
||||
|
||||
# NODE_OPTIONS="--max_old_space_size=4096" \
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
@@ -176,99 +169,98 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
# Copy the app to the image
|
||||
COPY ${SRC_PATH} /home/wekan/app
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan && \
|
||||
\
|
||||
# OS dependencies
|
||||
apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
|
||||
\
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~ && \
|
||||
ln -sf $(which bsdtar) $(which tar) && \
|
||||
\
|
||||
# Download nodejs
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt && \
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
#wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
|
||||
#---------------------------------------------------------------------------------------------
|
||||
\
|
||||
# Verify nodejs authenticity
|
||||
grep node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt | shasum -a 256 -c - && \
|
||||
rm -f SHASUMS256.txt && \
|
||||
#grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
|
||||
#rm -f SHASUMS256.txt.asc && \
|
||||
\
|
||||
# Install Node
|
||||
tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
|
||||
ln -s /opt/nodejs/bin/node /usr/bin/node && \
|
||||
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
|
||||
mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config && \
|
||||
chown wekan --recursive /home/wekan/.config && \
|
||||
\
|
||||
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
#paxctl -mC `which node` && \
|
||||
\
|
||||
# Install Node dependencies. Python path for node-gyp.
|
||||
#npm install -g npm@${NPM_VERSION} && \
|
||||
\
|
||||
# Change user to wekan and install meteor
|
||||
cd /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan && \
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
||||
mv /root/.meteor /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan/.meteor && \
|
||||
\
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \
|
||||
cd /home/wekan/.meteor && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help; \
|
||||
\
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
mkdir -p /home/wekan/.npm && \
|
||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js && \
|
||||
cd ../.. && \
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
|
||||
mv /home/wekan/app_build/bundle /build && \
|
||||
\
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar) && \
|
||||
\
|
||||
# Cleanup
|
||||
apt-get remove --purge -y ${BUILD_DEPS} && \
|
||||
apt-get autoremove -y && \
|
||||
npm uninstall -g api2html &&\
|
||||
rm -R /tmp/* && \
|
||||
rm -R /var/lib/apt/lists/* && \
|
||||
rm -R /home/wekan/.meteor && \
|
||||
rm -R /home/wekan/app && \
|
||||
rm -R /home/wekan/app_build && \
|
||||
mkdir /data && \
|
||||
chown wekan --recursive /data
|
||||
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R && \
|
||||
#rm -R /home/wekan/python
|
||||
#rm /home/wekan/install_meteor.sh
|
||||
# Install OS
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update --assume-yes
|
||||
apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
|
||||
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
|
||||
# Install NodeJS
|
||||
cd /tmp
|
||||
|
||||
# Download nodejs
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz"
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt"
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep "node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz" "SHASUMS256.txt" | shasum -a 256 -c -
|
||||
rm -f "SHASUMS256.txt"
|
||||
|
||||
# Install Node
|
||||
tar xzf "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" -C /usr/local --strip-components=1 --no-same-owner
|
||||
rm "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" "SHASUMS256.txt"
|
||||
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
|
||||
mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
|
||||
|
||||
# Install node dependencies
|
||||
npm install -g npm@${NPM_VERSION} --production
|
||||
chown --recursive wekan:wekan /home/wekan/.config
|
||||
|
||||
# Install Meteor
|
||||
cd /home/wekan
|
||||
chown --recursive wekan:wekan /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown --recursive wekan:wekan /home/wekan/.meteor
|
||||
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js
|
||||
cd /home/wekan/.meteor
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help
|
||||
|
||||
# Build app (Production)
|
||||
cd /home/wekan/app
|
||||
mkdir -p /home/wekan/.npm
|
||||
chown --recursive wekan:wekan /home/wekan/.npm
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
cd /home/wekan/app_build/bundle/programs/server/
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
cd node_modules/fibers
|
||||
node build.js
|
||||
cd ../..
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
|
||||
mv /home/wekan/app_build/bundle /build
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
# Cleanup
|
||||
apt-get remove --purge --assume-yes ${BUILD_DEPS}
|
||||
npm uninstall -g api2html
|
||||
apt-get autoremove --assume-yes
|
||||
apt-get clean --assume-yes
|
||||
rm -Rf /tmp/*
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
rm -Rf /var/cache/apt
|
||||
rm -Rf /var/lib/apt/lists
|
||||
rm -Rf /home/wekan/app_build
|
||||
rm -Rf /home/wekan/app
|
||||
rm -Rf /home/wekan/.meteor
|
||||
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
EOR
|
||||
|
||||
USER wekan
|
||||
|
||||
ENV PORT=8080
|
||||
EXPOSE $PORT
|
||||
USER wekan
|
||||
|
||||
STOPSIGNAL SIGKILL
|
||||
WORKDIR /home/wekan/app
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
@@ -279,6 +271,5 @@ STOPSIGNAL SIGKILL
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# CMD ["node", "/build/main.js"]
|
||||
|
||||
#CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
# CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
CMD ["bash", "-c", "ulimit -s 65500; exec node /build/main.js"]
|
||||
@@ -12,7 +12,7 @@ https://wekan.github.io / Install WeKan ® Server
|
||||
- [Quay](https://quay.io/repository/wekan/wekan)
|
||||
- [Docker Hub](https://hub.docker.com/r/wekanteam/wekan)
|
||||
|
||||
docker-compose.yml at https://github.com/wekan/wekan
|
||||
docker-compose.yml at https://github.com/wekan/wekan/blob/main/docker-compose.yml
|
||||
|
||||
## Standards
|
||||
|
||||
@@ -29,7 +29,7 @@ docker-compose.yml at https://github.com/wekan/wekan
|
||||
|
||||
## [Translate WeKan ® at Transifex](https://app.transifex.com/wekan/)
|
||||
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/) using webbrowser.
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/wekan) using webbrowser.
|
||||
New English strings of new features can be added as PRs to master branch file wekan/imports/i18n/data/en.i18n.json .
|
||||
|
||||
## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues)
|
||||
|
||||
+1
-2
@@ -1,8 +1,7 @@
|
||||
About money, see [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
||||
Security is very important to us. If you discover any issue regarding security, please disclose
|
||||
the information responsibly by sending an email to support (at) wekan.team using
|
||||
[this PGP public key](support-at-wekan.team_pgp-publickey.asc) and not by
|
||||
the information responsibly by sending an email to support@wekan.team and not by
|
||||
creating a GitHub issue. We will respond swiftly to fix verifiable security issues.
|
||||
|
||||
We thank you with a place at our hall of fame page, that is
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v7.32.0"
|
||||
appVersion: "v7.52.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -37,17 +37,23 @@ If *nix: chmod +x api.py => ./api.py users
|
||||
python3 api.py customfields BOARDID # Custom Fields of BOARDID
|
||||
python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID
|
||||
python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE # Edit Custom Field
|
||||
python3 api.py listattachments BOARDID # List attachments
|
||||
python3 api.py cardsbyswimlane SWIMLANEID LISTID
|
||||
python3 api.py getcard BOARDID LISTID CARDID
|
||||
python3 api.py addlabel BOARDID LISTID CARDID LABELID
|
||||
python3 api.py addcardwithlabel AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION LABELIDS
|
||||
python3 api.py editboardtitle BOARDID NEWBOARDTITLE
|
||||
python3 api.py createlabel BOARDID LABELCOLOR LABELNAME (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`)
|
||||
python3 api.py editcardcolor BOARDID LISTID CARDID COLOR (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`)
|
||||
python3 api.py addchecklist BOARDID CARDID TITLE ITEM1 ITEM2 ITEM3 ITEM4 (You can add multiple items or just one, or also without any item, just TITLE works as well. * If items or Title contains spaces, you should add ' between them.)
|
||||
python3 api.py deleteallcards BOARDID SWIMLANEID ( * Be careful will delete ALL CARDS INSIDE the swimlanes automatically in every list * )
|
||||
python3 api.py cardsbyswimlane SWIMLANEID LISTID # Retrieve cards list on a swimlane
|
||||
python3 api.py getcard BOARDID LISTID CARDID # Get card info
|
||||
python3 api.py addlabel BOARDID LISTID CARDID LABELID # Add label to a card
|
||||
python3 api.py addcardwithlabel AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION LABELIDS # Add a card and a label
|
||||
python3 api.py editboardtitle BOARDID NEWBOARDTITLE # Edit board title
|
||||
python3 api.py copyboard BOARDID NEWBOARDTITLE # Copy a board
|
||||
python3 api.py createlabel BOARDID LABELCOLOR LABELNAME (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Create a new label
|
||||
python3 api.py editcardcolor BOARDID LISTID CARDID COLOR (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Edit card color
|
||||
python3 api.py addchecklist BOARDID CARDID TITLE ITEM1 ITEM2 ITEM3 ITEM4 (You can add multiple items or just one, or also without any item, just TITLE works as well. * If items or Title contains spaces, you should add ' between them.) # Add checklist + item on a card
|
||||
python3 api.py deleteallcards BOARDID SWIMLANEID ( * Be careful will delete ALL CARDS INSIDE the swimlanes automatically in every list * ) # Delete all cards on a swimlane
|
||||
python3 api.py checklistid BOARDID CARDID # Retrieve Checklist ID attached to a card
|
||||
python3 api.py checklistinfo BOARDID CARDID CHECKLISTID # Get checklist info
|
||||
python3 api.py get_list_cards_count BOARDID LISTID # Retrieve how many cards in a list
|
||||
python3 api.py get_board_cards_count BOARDID # Retrieve how many cards in a board
|
||||
|
||||
|
||||
Admin API:
|
||||
python3 api.py users # All users
|
||||
@@ -422,7 +428,7 @@ if arguments >= 4:
|
||||
print(f"Checklist '{checklist_title}' created. ID: {checklist_id}")
|
||||
|
||||
# Aggiungi gli items alla checklist
|
||||
items_to_add = sys.argv[5:] # Gli argomenti successivi sono considerati come titoli degli items
|
||||
items_to_add = sys.argv[5:]
|
||||
for item_title in items_to_add:
|
||||
checklist_item_url = wekanurl + apiboards + board_id + s + cs + s + card_id + s + 'checklists' + s + checklist_id + '/items'
|
||||
item_data = {'title': item_title}
|
||||
@@ -435,6 +441,22 @@ if arguments >= 4:
|
||||
|
||||
print(f"Item '{item_title}' added. ID: {checklist_item_id}")
|
||||
|
||||
if sys.argv[1] == 'checklistinfo':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
checklist_id = sys.argv[4]
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists' + s + checklist_id
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
|
||||
checklist_info = response.json()
|
||||
print("Checklist Info:")
|
||||
print(checklist_info)
|
||||
|
||||
if arguments == 3:
|
||||
|
||||
if sys.argv[1] == 'editboardtitle':
|
||||
@@ -460,7 +482,31 @@ if arguments == 3:
|
||||
print(body.text)
|
||||
|
||||
# ------- EDIT BOARD TITLE END -----------
|
||||
|
||||
|
||||
if sys.argv[1] == 'copyboard':
|
||||
|
||||
# ------- COPY BOARD START -----------
|
||||
boardid = sys.argv[2]
|
||||
boardtitle = sys.argv[3]
|
||||
edboardcopy = wekanurl + apiboards + boardid + s + 'copy'
|
||||
print(edboardcopy)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
post_data = {'title': boardtitle}
|
||||
|
||||
body = requests.post(edboardcopy, json=post_data, headers=headers)
|
||||
print("=== COPY BOARD ===\n")
|
||||
#body = requests.get(edboardcopy, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
if body.status_code == 200:
|
||||
print("Succesfull!")
|
||||
else:
|
||||
print(f"Error: {body.status_code}")
|
||||
print(body.text)
|
||||
|
||||
# ------- COPY BOARD END -----------
|
||||
|
||||
if sys.argv[1] == 'createlist':
|
||||
|
||||
# ------- CREATE LIST START -----------
|
||||
@@ -536,9 +582,12 @@ if arguments == 3:
|
||||
delete_card_url = wekanurl + apiboards + boardid + s + "lists" + s + card['listId'] + s + "cards" + s + card['_id']
|
||||
try:
|
||||
response = requests.delete(delete_card_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
deleted_card_data = response.json()
|
||||
print(f"Card Deleted Successfully. Card ID: {deleted_card_data['_id']}")
|
||||
if response.status_code == 404:
|
||||
print(f"Card not found: {card['_id']}")
|
||||
else:
|
||||
response.raise_for_status()
|
||||
deleted_card_data = response.json()
|
||||
print(f"Card Deleted Successfully. Card ID: {deleted_card_data['_id']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error deleting card: {e}")
|
||||
# ------- DELETE CARD END -----------
|
||||
@@ -548,6 +597,39 @@ if arguments == 3:
|
||||
sys.exit(1)
|
||||
# ------- GET SWIMLANE CARDS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_list_cards_count':
|
||||
# ------- GET LIST CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
|
||||
get_list_cards_count_url = wekanurl + apiboards + boardid + s + l + s + listid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_list_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"List Cards Count: {data['list_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET LIST CARDS COUNT END -----------
|
||||
|
||||
if sys.argv[1] == 'checklistid':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists'
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
checklists = response.json()
|
||||
print("Checklists:")
|
||||
for checklist in checklists:
|
||||
print(checklist)
|
||||
|
||||
if arguments == 2:
|
||||
|
||||
# ------- BOARDS LIST START -----------
|
||||
@@ -619,6 +701,22 @@ if arguments == 2:
|
||||
print(data2)
|
||||
# ------- LISTS OF ATTACHMENTS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_board_cards_count':
|
||||
# ------- GET BOARD CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
|
||||
get_board_cards_count_url = wekanurl + apiboards + boardid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_board_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"Board Cards Count: {data['board_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET BOARD CARDS COUNT END -----------
|
||||
|
||||
if arguments == 1:
|
||||
|
||||
if sys.argv[1] == 'users':
|
||||
|
||||
@@ -16,7 +16,6 @@ template(name="cardActivities")
|
||||
+activity(activity=activityData card=card mode=mode)
|
||||
|
||||
template(name="editOrDeleteComment")
|
||||
= ' - '
|
||||
a.js-open-inlined-form {{_ "edit"}}
|
||||
= ' - '
|
||||
a.js-delete-comment {{_ "delete"}}
|
||||
@@ -145,11 +144,10 @@ template(name="activity")
|
||||
+viewer
|
||||
= activity.comment.text
|
||||
+commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id)
|
||||
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
if($eq currentUser._id activity.comment.userId)
|
||||
+editOrDeleteComment
|
||||
else if currentUser.isBoardAdmin
|
||||
+editOrDeleteComment
|
||||
if($eq currentUser._id activity.comment.userId)
|
||||
+editOrDeleteComment
|
||||
else if currentUser.isBoardAdmin
|
||||
+editOrDeleteComment
|
||||
|
||||
if($eq activity.activityType 'deleteComment')
|
||||
| {{{_ 'activity-deleteComment' activity.commentId}}}.
|
||||
@@ -243,4 +241,4 @@ template(name="activity")
|
||||
else if(currentData.timeValue)
|
||||
| {{_ activity.activityType currentData.timeValue}}
|
||||
|
||||
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
div(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -12,8 +12,9 @@ template(name="boardHeaderBar")
|
||||
if currentBoard
|
||||
if currentUser
|
||||
with currentBoard
|
||||
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
if currentUser.isBoardAdmin
|
||||
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
|
||||
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
|
||||
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
box-sizing: border-box;
|
||||
top: 97px;
|
||||
left: 0px;
|
||||
height: calc(100% - 20px);
|
||||
height: calc(100% - 100px);
|
||||
width: calc(100% - 20px);
|
||||
float: left;
|
||||
}
|
||||
|
||||
@@ -525,7 +525,7 @@ template(name="cardDetails")
|
||||
a.fa.fa-times-thin.js-close-inlined-form
|
||||
else
|
||||
if currentBoard.allowsDescriptionText
|
||||
a.js-open-inlined-form.right(title="{{_ 'edit'}}" value=title)
|
||||
a.js-open-inlined-form(title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
if getDescription
|
||||
+viewer
|
||||
|
||||
@@ -37,5 +37,4 @@ template(name="cardLabelsPopup")
|
||||
= name
|
||||
if(isLabelSelected ../_id)
|
||||
i.card-label-selectable-icon.fa.fa-check
|
||||
if currentUser.isBoardAdmin
|
||||
a.quiet-button.full.js-add-label {{_ 'label-create'}}
|
||||
a.quiet-button.full.js-add-label {{_ 'label-create'}}
|
||||
@@ -56,10 +56,12 @@
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-right: 30px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.minicard-details-menu {
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
@media print {
|
||||
.minicard-details-menu,
|
||||
@@ -99,7 +101,7 @@
|
||||
background-size: contain;
|
||||
height: 145px;
|
||||
user-select: none;
|
||||
margin: -6px -8px 6px -8px;
|
||||
margin: 6px -8px 6px -8px;
|
||||
border-radius: top 2px;
|
||||
}
|
||||
.minicard .minicard-labels {
|
||||
@@ -173,7 +175,6 @@
|
||||
.minicard .minicard-title .viewer {
|
||||
display: block;
|
||||
word-wrap: break-word;
|
||||
max-width: 230px;
|
||||
}
|
||||
}
|
||||
.minicard .dates {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
border-left: 1px solid #ccc;
|
||||
padding: 0;
|
||||
float: left;
|
||||
min-width: 100px; /* TODO(mark-i-m): hardcoded? */
|
||||
/* min-width: 100px; TODO(mark-i-m): hardcoded? */
|
||||
/*max-width: 270px;*/
|
||||
/* Reverted incomplete change list width: */
|
||||
/* https://github.com/wekan/wekan/issues/4558 */
|
||||
@@ -81,6 +81,20 @@
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.list-rotated {
|
||||
width: 10px;
|
||||
height: 250px;
|
||||
margin-top: -90px;
|
||||
margin-left: -110px;
|
||||
margin-right: 0;
|
||||
transform: rotate(90deg);
|
||||
position: relative;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.list-header .list-rotated {
|
||||
|
||||
}
|
||||
.list-header .list-header-watch-icon {
|
||||
padding-left: 10px;
|
||||
@@ -99,6 +113,23 @@
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-collapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse-left {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-uncollapse-left {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-uncollapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .highlight {
|
||||
color: #ce1414;
|
||||
}
|
||||
@@ -297,7 +328,6 @@
|
||||
}
|
||||
.list-header-white {
|
||||
border-bottom: 6px solid #fff;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
.list-header-green {
|
||||
border-bottom: 6px solid #3cb500;
|
||||
@@ -330,7 +360,7 @@
|
||||
border-bottom: 6px solid #51e898;
|
||||
}
|
||||
.list-header-silver {
|
||||
border-bottom: 6px solid unset;
|
||||
border-bottom: 6px solid #e4e4e4;
|
||||
}
|
||||
.list-header-peachpuff {
|
||||
border-bottom: 6px solid #ffdab9;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
template(name='list')
|
||||
.list.js-list(id="js-list-{{_id}}"
|
||||
style="width:{{listWidth}}px;")
|
||||
style="{{#unless collapsed}}width:{{listWidth}}px;{{/unless}}"
|
||||
class="{{#if collapsed}}list-collapsed{{/if}}")
|
||||
+listHeader
|
||||
+listBody
|
||||
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
template(name="listBody")
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
unless collapsed
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
|
||||
template(name="spinnerList")
|
||||
.sk-spinner.sk-spinner-list(
|
||||
|
||||
@@ -5,22 +5,43 @@ template(name="listHeader")
|
||||
+inlinedForm
|
||||
+editListTitleForm
|
||||
else
|
||||
unless isMiniScreen
|
||||
if collapsed
|
||||
a.js-collapse(title="{{_ 'uncollapse'}}")
|
||||
i.fa.fa-arrow-left.list-header-uncollapse-left
|
||||
i.fa.fa-arrow-right.list-header-uncollapse-right
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
|
||||
unless isMiniScreen
|
||||
if collapsed
|
||||
if showCardsCountForList cards.length
|
||||
br
|
||||
span.cardCount {{cardsCount}}
|
||||
if isMiniScreen
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
unless isMiniScreen
|
||||
div(class="{{#if collapsed}}list-rotated{{/if}}")
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
unless collapsed
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
if isWatching
|
||||
@@ -36,16 +57,20 @@ template(name="listHeader")
|
||||
else if currentUser.isBoardMember
|
||||
if isWatching
|
||||
i.list-header-watch-icon.fa.fa-eye
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
unless collapsed
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.js-collapse(title="{{_ 'collapse'}}")
|
||||
i.fa.fa-arrow-right.list-header-collapse-right
|
||||
i.fa.fa-arrow-left.list-header-collapse-left
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
|
||||
template(name="editListTitleForm")
|
||||
.list-composer
|
||||
|
||||
@@ -31,6 +31,17 @@ BlazeComponent.extendComponent({
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const list = Template.currentData();
|
||||
const status = list.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
list.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
editTitle(event) {
|
||||
event.preventDefault();
|
||||
const newTitle = this.childComponents('inlinedForm')[0]
|
||||
@@ -104,6 +115,10 @@ BlazeComponent.extendComponent({
|
||||
event.preventDefault();
|
||||
this.starred(!this.starred());
|
||||
},
|
||||
'click .js-collapse'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-list-menu': Popup.open('listAction'),
|
||||
'click .js-add-card.list-header-plus-top'(event) {
|
||||
const listDom = $(event.target).parents(
|
||||
|
||||
@@ -470,6 +470,7 @@ a:not(.disabled).is-active i.fa {
|
||||
.select-authentication {
|
||||
width: 100%;
|
||||
}
|
||||
.textBelowCustomLoginLogo,
|
||||
.auth-layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -37,10 +37,13 @@ template(name="userFormsLayout")
|
||||
else
|
||||
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
hr
|
||||
section.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
hr
|
||||
section.auth-layout
|
||||
section.auth-dialog
|
||||
if isLoading
|
||||
+loader
|
||||
|
||||
@@ -58,18 +58,20 @@ template(name="rulesReport")
|
||||
h1 {{_ 'rulesReportTitle'}}
|
||||
if resultsCount
|
||||
table
|
||||
tr
|
||||
th Rule Title
|
||||
th Board Title
|
||||
th actionType
|
||||
th activityType
|
||||
thead
|
||||
tr
|
||||
th Rule Title
|
||||
th Board Title
|
||||
th actionType
|
||||
th activityType
|
||||
|
||||
each rule in results
|
||||
tr
|
||||
td {{ rule.title }}
|
||||
td {{ rule.boardTitle }}
|
||||
td {{ rule.action.actionType }}
|
||||
td {{ rule.trigger.activityType }}
|
||||
tbody
|
||||
tr
|
||||
td {{ rule.title }}
|
||||
td {{ rule.boardTitle }}
|
||||
td {{ rule.action.actionType }}
|
||||
td {{ rule.trigger.activityType }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -77,22 +79,24 @@ template(name="filesReport")
|
||||
h1 {{_ 'filesReportTitle'}}
|
||||
if resultsCount
|
||||
table
|
||||
tr
|
||||
th Filename
|
||||
th.right Size (kB)
|
||||
th MIME Type
|
||||
th Attachment ID
|
||||
th Board ID
|
||||
th Card ID
|
||||
thead
|
||||
tr
|
||||
th Filename
|
||||
th.right Size (kB)
|
||||
th MIME Type
|
||||
th Attachment ID
|
||||
th Board ID
|
||||
th Card ID
|
||||
|
||||
each att in results
|
||||
tr
|
||||
td {{ att.name }}
|
||||
td.right {{ fileSize att.size }}
|
||||
td {{ att.type }}
|
||||
td {{ att._id }}
|
||||
td {{ att.meta.boardId }}
|
||||
td {{ att.meta.cardId }}
|
||||
tbody
|
||||
tr
|
||||
td {{ att.name }}
|
||||
td.right {{ fileSize att.size }}
|
||||
td {{ att.type }}
|
||||
td {{ att._id }}
|
||||
td {{ att.meta.boardId }}
|
||||
td {{ att.meta.cardId }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -100,22 +104,24 @@ template(name="cardsReport")
|
||||
h1 {{_ 'cardsReportTitle'}}
|
||||
if resultsCount
|
||||
table.table
|
||||
tr
|
||||
th Card Title
|
||||
th Board
|
||||
th Swimlane
|
||||
th List
|
||||
th Members
|
||||
th Assignees
|
||||
thead
|
||||
tr
|
||||
th Card Title
|
||||
th Board
|
||||
th Swimlane
|
||||
th List
|
||||
th Members
|
||||
th Assignees
|
||||
|
||||
each card in results
|
||||
tr
|
||||
td {{abbreviate card.title }}
|
||||
td {{abbreviate card.board.title }}
|
||||
td {{abbreviate card.swimlane.title }}
|
||||
td {{abbreviate card.list.title }}
|
||||
td {{userNames card.members }}
|
||||
td {{userNames card.assignees }}
|
||||
tbody
|
||||
tr
|
||||
td {{abbreviate card.title }}
|
||||
td {{abbreviate card.board.title }}
|
||||
td {{abbreviate card.swimlane.title }}
|
||||
td {{abbreviate card.list.title }}
|
||||
td {{userNames card.members }}
|
||||
td {{userNames card.assignees }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -123,22 +129,25 @@ template(name="boardsReport")
|
||||
h1 {{_ 'boardsReportTitle'}}
|
||||
if resultsCount
|
||||
table.table
|
||||
tr
|
||||
th Title
|
||||
th Id
|
||||
th Permission
|
||||
th Archived?
|
||||
th Members
|
||||
th Organizations
|
||||
th Teams
|
||||
|
||||
each board in results
|
||||
thead
|
||||
tr
|
||||
td {{abbreviate board.title }}
|
||||
td {{abbreviate board._id }}
|
||||
td {{ board.permission }}
|
||||
td
|
||||
= yesOrNo(board.archived)
|
||||
td {{userNames board.members }}
|
||||
th Title
|
||||
th Id
|
||||
th Permission
|
||||
th Archived?
|
||||
th Members
|
||||
th Organizations
|
||||
th Teams
|
||||
each board in results
|
||||
tbody
|
||||
tr
|
||||
td {{abbreviate board.title }}
|
||||
td {{abbreviate board._id }}
|
||||
td {{ board.permission }}
|
||||
td
|
||||
= yesOrNo(board.archived)
|
||||
td {{userNames board.members }}
|
||||
td {{orgs board.orgs }}
|
||||
td {{teams board.teams }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
@@ -170,8 +170,27 @@ class AdminReport extends BlazeComponent {
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
teams(memberTeams) {
|
||||
const ret = (memberTeams || [])
|
||||
.map(_memberTeam => {
|
||||
const _ret = ReactiveCache.getTeam(_memberTeam.teamId)?.teamDisplayName || _memberTeam.teamId;
|
||||
return _ret;
|
||||
})
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
orgs(orgs) {
|
||||
const ret = (orgs || [])
|
||||
.map(_orgs => {
|
||||
const _ret = ReactiveCache.getOrg(_orgs.orgId)?.orgDisplayName || _orgs.orgId;
|
||||
return _ret;
|
||||
})
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
}.register('boardsReport'));
|
||||
|
||||
|
||||
(class extends AdminReport {
|
||||
collection = Cards;
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ template(name="people")
|
||||
|
||||
template(name="orgGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'displayName'}}
|
||||
th {{_ 'description'}}
|
||||
@@ -84,12 +84,14 @@ template(name="orgGeneral")
|
||||
th {{_ 'active'}}
|
||||
th
|
||||
+newOrgRow
|
||||
tbody
|
||||
tr
|
||||
each org in orgList
|
||||
+orgRow(orgId=org._id)
|
||||
|
||||
template(name="teamGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'displayName'}}
|
||||
th {{_ 'description'}}
|
||||
@@ -99,6 +101,8 @@ template(name="teamGeneral")
|
||||
th {{_ 'active'}}
|
||||
th
|
||||
+newTeamRow
|
||||
tbody
|
||||
tr
|
||||
each team in teamList
|
||||
+teamRow(teamId=team._id)
|
||||
|
||||
@@ -106,7 +110,7 @@ template(name="peopleGeneral")
|
||||
#divAddOrRemoveTeamContainer
|
||||
+modifyTeamsUsers
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th
|
||||
+selectAllUser
|
||||
@@ -124,6 +128,8 @@ template(name="peopleGeneral")
|
||||
th {{_ 'teams'}}
|
||||
th
|
||||
+newUserRow
|
||||
tbody
|
||||
tr
|
||||
each user in peopleList
|
||||
+peopleRow(userId=user._id)
|
||||
|
||||
|
||||
@@ -7,11 +7,13 @@
|
||||
display: -moz-flex;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
.setting-content {
|
||||
color: #727479;
|
||||
background: #dedede;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
}
|
||||
.setting-content .content-title {
|
||||
@@ -56,6 +58,8 @@
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
max-height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
.setting-content .content-body .main-body ul li {
|
||||
padding: 0.5rem 0.5rem;
|
||||
|
||||
@@ -34,13 +34,14 @@ template(name="translation")
|
||||
|
||||
template(name="translationGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'language'}}
|
||||
th {{_ 'text'}}
|
||||
th {{_ 'translation-text'}}
|
||||
th
|
||||
+newTranslationRow
|
||||
tbody
|
||||
each translation in translationList
|
||||
+translationRow(translationId=translation._id)
|
||||
|
||||
|
||||
@@ -24,9 +24,17 @@ template(name="swimlaneFixedHeader")
|
||||
| {{isTitleDefault title}}
|
||||
.swimlane-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
if currentUser.isBoardAdmin
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}")
|
||||
//// TODO: Collapse Swimlane: make button working, etc.
|
||||
//unless collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'collapse'}}")
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
//if collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'uncollapse'}}")
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
unless isTouchScreen
|
||||
if isShowDesktopDragHandles
|
||||
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
|
||||
@@ -18,10 +18,25 @@ BlazeComponent.extendComponent({
|
||||
swimlane.rename(newTitle.trim());
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const swimlane = Template.currentData();
|
||||
const status = swimlane.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
swimlane.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-collapse-swimlane'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-swimlane-menu': Popup.open('swimlaneAction'),
|
||||
'click .js-open-add-swimlane-menu': Popup.open('swimlaneAdd'),
|
||||
submit: this.editTitle,
|
||||
|
||||
@@ -1,38 +1,3 @@
|
||||
/*
|
||||
// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
|
||||
.accordion
|
||||
cursor: pointer
|
||||
width: 30px
|
||||
height: 20px
|
||||
border: none
|
||||
outline: none
|
||||
font-size: 18px
|
||||
transition: 0.4s
|
||||
padding-top: 0px
|
||||
margin-top: 0px
|
||||
|
||||
.accordion:after
|
||||
// Unicode triagle right:
|
||||
content: '\25B6'
|
||||
color: #777
|
||||
font-weight: bold
|
||||
float: left
|
||||
|
||||
.active:after
|
||||
// Unicode triangle down:
|
||||
content: '\25BC'
|
||||
|
||||
.panel
|
||||
width: 100%
|
||||
max-height: 0
|
||||
overflow: hidden
|
||||
transition: max-height 0.2s ease-out
|
||||
margin: 0px
|
||||
padding: 0px
|
||||
|
||||
// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
*/
|
||||
@media screen and (min-width: 801px) {
|
||||
.swimlane.ui-sortable {
|
||||
width: max-content;
|
||||
@@ -46,7 +11,30 @@
|
||||
background: #dedede;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: 0;
|
||||
overflow: auto;
|
||||
max-height: 100%;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
bottom: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane.placeholder {
|
||||
background-color: rgba(0,0,0,0.2);
|
||||
@@ -170,7 +158,7 @@
|
||||
color: #4d4d4d !important;
|
||||
}
|
||||
.swimlane-silver {
|
||||
background: unset !important;
|
||||
background: #ccc !important;
|
||||
color: #4d4d4d !important;
|
||||
}
|
||||
.swimlane-peachpuff {
|
||||
|
||||
@@ -46,8 +46,8 @@ template(name="listsGroup")
|
||||
|
||||
template(name="addListForm")
|
||||
unless currentUser.isWorker
|
||||
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
|
||||
if currentUser.isBoardAdmin
|
||||
unless currentUser.isCommentOnly
|
||||
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
|
||||
.list-header-add
|
||||
+inlinedForm(autoclose=false)
|
||||
input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
|
||||
|
||||
@@ -26,9 +26,9 @@ template(name="orgAvatar")
|
||||
template(name="boardOrgRow")
|
||||
tr
|
||||
if orgData.orgIsActive
|
||||
td <s>{{ orgData.orgDisplayName }}</s>
|
||||
else
|
||||
td {{ orgData.orgDisplayName }}
|
||||
else
|
||||
td <s>{{ orgData.orgDisplayName }}</s>
|
||||
td
|
||||
if currentUser.isBoardAdmin
|
||||
a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}")
|
||||
@@ -39,9 +39,9 @@ template(name="boardOrgRow")
|
||||
template(name="boardTeamRow")
|
||||
tr
|
||||
if teamData.teamIsActive
|
||||
td <s>{{ teamData.teamDisplayName }}</s>
|
||||
else
|
||||
td {{ teamData.teamDisplayName }}
|
||||
else
|
||||
td <s>{{ teamData.teamDisplayName }}</s>
|
||||
td
|
||||
if currentUser.isBoardAdmin
|
||||
a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}")
|
||||
|
||||
@@ -47,7 +47,7 @@ Blaze.registerHelper('isTouchScreenOrShowDesktopDragHandles', () =>
|
||||
Blaze.registerHelper('moment', (...args) => {
|
||||
args.pop(); // hash
|
||||
const [date, format] = args;
|
||||
return moment(date).format(format);
|
||||
return moment(date).format(format ?? 'LLLL');
|
||||
});
|
||||
|
||||
Blaze.registerHelper('canModifyCard', () =>
|
||||
|
||||
@@ -6,10 +6,11 @@ import moment from 'moment/min/moment-with-locales';
|
||||
function adjustedTimeFormat() {
|
||||
return moment
|
||||
.localeData()
|
||||
.longDateFormat('LT')
|
||||
.replace(/HH/i, 'H');
|
||||
.longDateFormat('LT');
|
||||
}
|
||||
|
||||
// .replace(/HH/i, 'H');
|
||||
|
||||
export class DatePicker extends BlazeComponent {
|
||||
template() {
|
||||
return 'datepicker';
|
||||
|
||||
@@ -16,6 +16,8 @@ export const ALLOWED_BOARD_COLORS = [
|
||||
'modern',
|
||||
'moderndark',
|
||||
'exodark',
|
||||
'cleandark',
|
||||
'cleanlight',
|
||||
];
|
||||
export const ALLOWED_COLORS = [
|
||||
'white',
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
version: '2'
|
||||
|
||||
# Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required.
|
||||
#---------------------------------------------------------------------------------------------------------
|
||||
# ==== CREATING USERS AND LOGGING IN TO WEKAN ====
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
Wekan provides a python script to ease the call of the REST API from command line interface.
|
||||
|
||||
# Context
|
||||
|
||||
- [API Login to get Bearer token](REST-API#example-call---as-form-data)
|
||||
- [API docs and examples for various programming languages](https://wekan.github.io/api/), there is Boards / Export for exporting board with API
|
||||
- In the right menu, scroll down REST API Docs etc links =====>
|
||||
- Wekan-Gogs integration with Node.js https://github.com/wekan/wekan-gogs
|
||||
|
||||
# Install
|
||||
|
||||
You need python3.
|
||||
|
||||
Windows
|
||||
```
|
||||
choco install python3
|
||||
# REBOOT
|
||||
pip3 install pip --upgrade
|
||||
pip3 install json
|
||||
python3 wekan.py
|
||||
```
|
||||
Debian/Ubuntu
|
||||
```
|
||||
sudo apt-get -y install python3 python3-pip python3-simplejson
|
||||
sudo pip3 install pip --upgrade
|
||||
chmod +x wekan.py
|
||||
./wekan.py
|
||||
```
|
||||
|
||||
# Usage
|
||||
|
||||
Copy the api.py script to you machine. [Newest Wekan Python CLI api.py here](https://raw.githubusercontent.com/wekan/wekan/master/api.py).
|
||||
|
||||
Then, in this script, look for and change:
|
||||
- wekanurl: https://boards.example.com => Your Wekan URL
|
||||
- username (could be username or username@example.com)
|
||||
- Only works with password login admin user. Does not work with LDAP, OAuth2 etc.
|
||||
|
||||
Keep in mind your Wekan credentials are potentially accessible in this file.
|
||||
|
||||
Then call it without any argument to see if everything is all right. You should just get usage examples.
|
||||
@@ -0,0 +1,56 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
## Information about boards of user
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/users/XQMZgynx9M79qTtQc/boards
|
||||
```
|
||||
|
||||
## Add/Remove Board Member and Change Role
|
||||
|
||||
[Add/Remove Board Member and Change Role admin/normal/nocomments/commentonly](REST-API-Role).
|
||||
|
||||
## The admin takes the ownership of ALL boards of the user (archived and not archived) where the user is admin on.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "takeOwnership" }'
|
||||
```
|
||||
|
||||
## Create board
|
||||
|
||||
Required:
|
||||
- "title":"Board title here"
|
||||
- "owner":"ABCDE12345" <= User ID in Wekan. Not username or email.
|
||||
|
||||
Optional, and defaults:
|
||||
- "isAdmin":"true"
|
||||
- "isActive":"true"
|
||||
- "isNoComments":"false"
|
||||
- "isCommentOnly":"false"
|
||||
- "permission":"private" <== Set to "public" if you want public Wekan board
|
||||
- "color":"belize" <== Board color: belize, nephritis, pomegranate, pumpkin, wisteria, midnight.
|
||||
|
||||
<img src="https://wekan.github.io/board-colors.png" width="40%" alt="Wekan logo" />
|
||||
|
||||
Example:
|
||||
```
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards \
|
||||
-d '{"title":"Board title here","owner":"ABCDE12345","permission":"private","color":"nephritis"}'
|
||||
```
|
||||
|
||||
## In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/boards.js "Board API code")
|
||||
@@ -0,0 +1,94 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# Retrieve cards by swimlane id
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes/:swimlaneId/cards](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L487) | `yes` | `GET` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-X GET \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/swimlanes/PgTuf6sFJsaxto5dC/cards
|
||||
```
|
||||
## Result example
|
||||
|
||||
```shell
|
||||
{
|
||||
"_id": "AzEeHS7KAGeYZCcak",
|
||||
"title": "Create Auth Code",
|
||||
"description": "Create Auth Code for application.",
|
||||
"listId": "RPRtDTQMKpShpgqoj"
|
||||
},
|
||||
{
|
||||
...
|
||||
```
|
||||
|
||||
# Add Card to List-Board-Swimlane
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:listId/cards](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L487) | `yes` | `POST` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards \
|
||||
-d '{ "title": "Card title text", "description": "Card description text", "authorId": "The appropriate existing userId", "swimlaneId": "The destination swimlaneId" }'
|
||||
```
|
||||
## Result example
|
||||
The new card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# Update a card
|
||||
You can change (any of) the card's title, list, and description.
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:fromListId/cards/:cardId](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L520) | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE \
|
||||
-d '{ "title": "New title text", "listId": "New destination listId", "description": "New description text" }'
|
||||
```
|
||||
## Result example
|
||||
The card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
# Delete a card
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:listId/cards/:cardId](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L554) | `yes` | `DELETE` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE \
|
||||
-d '{ "authorId": "the appropriate existing userId"}'
|
||||
```
|
||||
## Result example
|
||||
The card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/cards.js "Card API code")
|
||||
@@ -0,0 +1,148 @@
|
||||
## In Wekan code
|
||||
|
||||
## 1) Checklists
|
||||
|
||||
wekan/models/checklists.js at bottom:
|
||||
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklists = Checklists.find({ cardId: paramCardId }).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
};
|
||||
});
|
||||
if (checklists) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklists,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklist = Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId });
|
||||
if (checklist) {
|
||||
checklist.items = ChecklistItems.find({checklistId: checklist._id}).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
isFinished: doc.isFinished,
|
||||
};
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklist,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
|
||||
const paramCardId = req.params.cardId;
|
||||
const id = Checklists.insert({
|
||||
title: req.body.title,
|
||||
cardId: paramCardId,
|
||||
sort: 0,
|
||||
});
|
||||
if (id) {
|
||||
req.body.items.forEach(function (item, idx) {
|
||||
ChecklistItems.insert({
|
||||
cardId: paramCardId,
|
||||
checklistId: id,
|
||||
title: item.title,
|
||||
sort: idx,
|
||||
});
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 400,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
Checklists.remove({ _id: paramChecklistId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramChecklistId,
|
||||
},
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 2) Checklist Items
|
||||
|
||||
wekan/models/checklistItems.js at bottom:
|
||||
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramItemId = req.params.itemId;
|
||||
const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
|
||||
if (checklistItem) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklistItem,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
|
||||
const paramItemId = req.params.itemId;
|
||||
|
||||
if (req.body.hasOwnProperty('isFinished')) {
|
||||
ChecklistItems.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('title')) {
|
||||
ChecklistItems.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
|
||||
}
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramItemId,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramItemId = req.params.itemId;
|
||||
ChecklistItems.direct.remove({ _id: paramItemId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramItemId,
|
||||
},
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
## Using Meteor with REST API
|
||||
|
||||
### 1) Adding API
|
||||
|
||||
```
|
||||
meteor add simple:json-routes
|
||||
```
|
||||
|
||||
https://atmospherejs.com/simple/json-routes
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/.meteor/packages#L139
|
||||
|
||||
### 2) API code
|
||||
|
||||
At models directory:
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/models/users.js#L2018
|
||||
|
||||
### 3) Login to API as JSON
|
||||
|
||||
https://github.com/wekan/wekan/wiki/REST-API#example-call---as-json
|
||||
|
||||
Also see at wiki right menu about REST API.
|
||||
|
||||
### 4) Use Python3 CLI to login to API and do REST API action
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/api.py
|
||||
|
||||
### 4) API Docs
|
||||
|
||||
https://wekan.github.io/api/
|
||||
|
||||
Building API Docs: https://github.com/wekan/wekan/blob/main/releases/rebuild-docs.sh
|
||||
@@ -0,0 +1,78 @@
|
||||
1) Login as Admin user as Form Data to get Bearer token
|
||||
https://github.com/wekan/wekan/wiki/REST-API#example-call---as-form-data
|
||||
|
||||
2) There needs to be Custom Field added to board
|
||||
https://wekan.github.io/api/v4.42/#wekan-rest-api-customfields
|
||||
|
||||
3) Custom Field at board and card will have same `_id`
|
||||
https://wekan.github.io/api/v4.42/#put_board_list_card
|
||||
|
||||
4) When writing Custom Field value to card, like text field, content type needs to be "application/json" and the string needs to be an array:
|
||||
```
|
||||
-d '{ "customFields" : [ { "_id" : "oZHkpcaxDHnbkbqGo", "value" : "foobar" } ] }'
|
||||
```
|
||||
5) For other types of Custom Fields, you can look at Custom Field structure from MongoDB database with [nosqlbooster](https://nosqlbooster.com/downloads) that can also login through ssh to server Wekan snap MongoDB port 27019
|
||||
|
||||
|
||||
## In Wekan code (old)
|
||||
|
||||
wekan/models/customFields.js , at bottom
|
||||
|
||||
```
|
||||
//CUSTOM FIELD REST API
|
||||
if (Meteor.isServer) {
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: CustomFields.find({ boardId: paramBoardId }),
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: CustomFields.findOne({ _id: paramCustomFieldId, boardId: paramBoardId }),
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = CustomFields.direct.insert({
|
||||
name: req.body.name,
|
||||
type: req.body.type,
|
||||
settings: req.body.settings,
|
||||
showOnCard: req.body.showOnCard,
|
||||
boardId: paramBoardId,
|
||||
});
|
||||
|
||||
const customField = CustomFields.findOne({_id: id, boardId: paramBoardId });
|
||||
customFieldCreation(req.body.authorId, customField);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = req.params.customFieldId;
|
||||
CustomFields.remove({ _id: id, boardId: paramBoardId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,191 @@
|
||||
## In Wekan code
|
||||
|
||||
wekan/models/integrations.js at bottom
|
||||
|
||||
```
|
||||
// Get all integrations in board
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
|
||||
return doc;
|
||||
});
|
||||
|
||||
JsonRoutes.sendResult(res, {code: 200, data});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Get a single integration in board
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Create a new integration
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const id = Integrations.insert({
|
||||
userId: req.userId,
|
||||
boardId: paramBoardId,
|
||||
url: req.body.url,
|
||||
});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Edit integration data
|
||||
JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
if (req.body.hasOwnProperty('enabled')) {
|
||||
const newEnabled = req.body.enabled;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {enabled: newEnabled}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('title')) {
|
||||
const newTitle = req.body.title;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {title: newTitle}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('url')) {
|
||||
const newUrl = req.body.url;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {url: newUrl}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('token')) {
|
||||
const newToken = req.body.token;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {token: newToken}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('activities')) {
|
||||
const newActivities = req.body.activities;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {activities: newActivities}});
|
||||
}
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramIntId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Delete subscribed activities
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
const newActivities = req.body.activities;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$pullAll: {activities: newActivities}});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Add subscribed activities
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
const newActivities = req.body.activities;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$addToSet: {activities: { $each: newActivities}}});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Delete integration
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramIntId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,89 @@
|
||||
## In Wekan code
|
||||
|
||||
wekan/models/lists.js at bottom:
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/lists', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess( req.userId, paramBoardId);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Lists.find({ boardId: paramBoardId, archived: false }).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
};
|
||||
}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
Authentication.checkBoardAccess( req.userId, paramBoardId);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Lists.findOne({ _id: paramListId, boardId: paramBoardId, archived: false }),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/lists', function (req, res) {
|
||||
try {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = Lists.insert({
|
||||
title: req.body.title,
|
||||
boardId: paramBoardId,
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId', function (req, res) {
|
||||
try {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
Lists.remove({ _id: paramListId, boardId: paramBoardId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramListId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,82 @@
|
||||
# Change Role at Web UI
|
||||
|
||||
BoardAdmin can change role of user at right sidebar / click avatar / select role like Admin, Normal, etc.
|
||||
|
||||
# Change Role with API
|
||||
|
||||
- https://wekan.github.io/api/
|
||||
- api.py at https://github.com/wekan/wekan
|
||||
- Login to API https://github.com/wekan/wekan/wiki/REST-API#example-call---as-json
|
||||
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
## Add New Board Member with Role
|
||||
This example adds with normal role. See examples below for other roles.
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE/add \
|
||||
-d '{"action": "add","isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false" }'
|
||||
```
|
||||
like
|
||||
```
|
||||
/api/boards/{boardid}/members/{MEMBERID}/add Body{ "action" : add, "isadmin" : false ...........
|
||||
```
|
||||
|
||||
## Remove Member from Board
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE/remove \
|
||||
-d '{"action": "remove"}'
|
||||
```
|
||||
|
||||
# Change Role of Existing Board Member
|
||||
|
||||
## Admin
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "true", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## Normal
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## No Comments
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"true", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## Comment Only
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "true", "isWorker": "false"}'
|
||||
```
|
||||
## Worker
|
||||
- Can: move cards, can assign himself to card, can comment.
|
||||
- Cannot: anything else including revoke card, change settings, create/delete/edit cards/tags and so on...
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "true"}'
|
||||
```
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# Retrieve cards by swimlane id
|
||||
|
||||
Please somebody add example by looking this:
|
||||
|
||||
[Issue](https://github.com/wekan/wekan/issues/1934) and [code](https://github.com/wekan/wekan/pull/1944/commits/be42b8d4cbdfa547ca019ab2dc9a590a115cc0e2). Also add to [Cards page](REST-API-Cards)
|
||||
|
||||
# Add Swimlane to Board
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes](https://github.com/wekan/wekan/blob/main/models/swimlanes.js#L223) | `yes` | `POST` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/swimlanes \
|
||||
-d '{ "title": "Swimlane title text" }'
|
||||
```
|
||||
## Result example
|
||||
The new swimlane's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# Delete a swimlane
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes/:swimlaneId](https://github.com/wekan/wekan/blob/main/models/swimlanes.js#L257) | `yes` | `DELETE` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE
|
||||
```
|
||||
## Result example
|
||||
The swimlane's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/swimlanes.js "Swimlane API code")
|
||||
@@ -0,0 +1,335 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# User Register
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/users/register` | `no` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
```bash
|
||||
curl http://localhost:3000/users/register \
|
||||
-d "username=myusername&password=mypassword&email=my@email.com"
|
||||
```
|
||||
|
||||
|
||||
## Example Call - As JSON
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/register \
|
||||
-d '{ "username": "myusername", "password": "mypassword", "email": "my@email.com" }'
|
||||
```
|
||||
|
||||
|
||||
## Result
|
||||
```json
|
||||
{
|
||||
"id": "user id",
|
||||
"token": "string",
|
||||
"tokenExpires": "ISO encoded date string"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"id": "XQMZgynx9M79qTtQc",
|
||||
"token": "ExMp2s9ML1JNp_l11sIfINPT3wykZ1SsVwg-cnxKdc8",
|
||||
"tokenExpires": "2017-12-15T00:47:26.303Z"
|
||||
}
|
||||
```
|
||||
|
||||
# User Create
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users` | `yes` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/users \
|
||||
-d "username=myusername&password=mypassword&email=my@email.com"
|
||||
```
|
||||
|
||||
## Example Call - As JSON
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/users \
|
||||
-d '{ "username": "myusername", "password": "mypassword", "email": "my@email.com" }'
|
||||
```
|
||||
|
||||
## Example of all steps of create user
|
||||
|
||||
1) Login
|
||||
|
||||
```
|
||||
curl http://example.com/users/login \
|
||||
-d "username=YOUR-USERNAME-HERE&password=YOUR-PASSWORD-HERE"
|
||||
```
|
||||
|
||||
As response you get your id and token:
|
||||
|
||||
```
|
||||
"id":"YOUR-ID-HERE","token":"YOUR-TOKEN-HERE","tokenExpires":"2017-12-23T21:07:10.395Z"}
|
||||
```
|
||||
|
||||
2) Create user. Works both when serf-register enabled and disabled.
|
||||
|
||||
```
|
||||
curl -H "Authorization: Bearer YOUR-TOKEN-HERE" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://example.com/api/users \
|
||||
-d '{ "username": "tester", "password": "tester", "email": "tester@example.com", "fromAdmin": "true" }'
|
||||
```
|
||||
|
||||
As reply you get new user's id.
|
||||
|
||||
```
|
||||
{"id":"NEW-USER-ID-HERE"}
|
||||
```
|
||||
|
||||
3) You can get user details with your new user's id:
|
||||
|
||||
```
|
||||
curl -H "Authorization: Bearer YOUR-TOKEN-HERE" \
|
||||
http://example.com/api/users/NEW-USER-ID-HERE
|
||||
```
|
||||
|
||||
## Result
|
||||
|
||||
Returns the id of the created user.
|
||||
|
||||
|
||||
```json
|
||||
{
|
||||
"_id": "user id"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "EnhMbvxh65Hr7YvtG"
|
||||
}
|
||||
```
|
||||
|
||||
# User Delete
|
||||
|
||||
> IMPORTANT : Should not be used as long as [this bug](https://github.com/wekan/wekan/issues/1289) exists.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `DELETE` |
|
||||
|
||||
## Parameters
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `id` | `BsNr28znDkG8aeo7W` | Required | The id of the user to delete. |
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/users/EnhMbvxh65Hr7YvtG
|
||||
```
|
||||
|
||||
## Example Result
|
||||
|
||||
Returns the id of the deleted user.
|
||||
|
||||
```json
|
||||
{
|
||||
"_id": "EnhMbvxh65Hr7YvtG"
|
||||
}
|
||||
```
|
||||
|
||||
# User Information
|
||||
Retrieves information about a user.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
* **Only the admin user (the first user) can call the REST API.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/users/XQMZgynx9M79qTtQc
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "XQMZgynx9M79qTtQc",
|
||||
"createdAt": "2017-09-13T06:45:53.127Z",
|
||||
"services": {
|
||||
"password": {
|
||||
"bcrypt": "$2a$10$CRZrpT4x.VpG2FdJxR3rN.9m0NbQb0OPsSPBDAZukggxrskMtWA8."
|
||||
},
|
||||
"email": {
|
||||
"verificationTokens": [
|
||||
{
|
||||
"token": "8rzwpq_So2PVYHVSfrcc5f5QZnuV2wEtu7QRQGwOJx8",
|
||||
"address": "my@email.com",
|
||||
"when": "2017-09-13T06:45:53.157Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
"resume": {
|
||||
"loginTokens": [
|
||||
{
|
||||
"when": "2017-09-13T06:45:53.265Z",
|
||||
"hashedToken": "CY/PWeDa3fAkl+k94+GWzCtpB5nPcVxLzzzjXs4kI3A="
|
||||
},
|
||||
{
|
||||
"when": "2017-09-16T06:06:19.741Z",
|
||||
"hashedToken": "74MQNXfsgjkItx/gpgPb29Y0MSNAvBrsnSGQmr4YGvQ="
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"username": "john",
|
||||
"emails": [
|
||||
{
|
||||
"address": "my@email.com",
|
||||
"verified": false
|
||||
}
|
||||
],
|
||||
"isAdmin": true,
|
||||
"profile": {}
|
||||
}
|
||||
```
|
||||
# User List
|
||||
Retrieves the user list.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
* **Only the admin user (the first user) can call the REST API.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer cwUZ3ZsTaE6ni2R3ppSkYd-KrDvxsLcBIkSVfOCfIkA" \
|
||||
http://localhost:3000/api/users
|
||||
```
|
||||
|
||||
## Result
|
||||
```json
|
||||
[
|
||||
{
|
||||
"_id": "user id",
|
||||
"username": "string"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
[
|
||||
{
|
||||
"_id": "XQMZgynx9M79qTtQc",
|
||||
"username": "admin"
|
||||
},
|
||||
{
|
||||
"_id": "vy4WYj7k7NBhf3AFc",
|
||||
"username": "john"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
# User Logged-in
|
||||
Retrieves information about a logged-in user with his auth token.
|
||||
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/user` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/user
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "vy4WYj7k7NBhf3AFc",
|
||||
"createdAt": "2017-09-16T05:51:30.339Z",
|
||||
"username": "john",
|
||||
"emails": [
|
||||
{
|
||||
"address": "me@mail.com",
|
||||
"verified": false
|
||||
}
|
||||
],
|
||||
"profile": {}
|
||||
}
|
||||
```
|
||||
|
||||
# Disable a user (the user is not allowed to login and his login tokens are purged)
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "disableLogin" }'
|
||||
```
|
||||
|
||||
# Enable a user
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "enableLogin" }'
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/users.js "User API code")
|
||||
@@ -0,0 +1,126 @@
|
||||
REST API is not complete yet, please add missing functionality with pull requests to devel branch.
|
||||
|
||||
If you are in a hurry, you can use these to have more functionality:
|
||||
* https://restheart.org
|
||||
* http://vulcanjs.org
|
||||
|
||||
For workflows see [If-this-then-that issue](https://github.com/wekan/wekan/issues/1160) than mentions Huginn, Flogo etc.
|
||||
|
||||
# Wekan REST API
|
||||
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
If you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.
|
||||
|
||||
> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.
|
||||
|
||||
## Production Security Concerns
|
||||
When calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:
|
||||
|
||||
* Only call via HTTPS
|
||||
* Implement a timed authorization token expiration strategy
|
||||
* Ensure the calling user only has permissions for what they are calling and no more
|
||||
|
||||
# Summary
|
||||
|
||||
### Authentication
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/users/login` | [Authenticate with the REST API.](#login) |
|
||||
|
||||
### Users
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/users/register` | [Register a new user.](REST-API-User#user-register) |
|
||||
| `POST` | `/api/users` | [Create a new user.](REST-API-User#user-create) |
|
||||
| `PUT` | `/api/users/:id` | [Disable an existing user.](REST-API-User#disable-a-user-the-user-is-not-allowed-to-login-and-his-login-tokens-are-purged) |
|
||||
| `PUT` | `/api/users/:id` | [Enable an existing user.](REST-API-User#enable-a-user) |
|
||||
| `PUT` | `/api/users/:id` | [Admin takes the ownership.](REST-API-User#the-admin-takes-the-ownership-of-all-boards-of-the-user-archived-and-not-archived-where-the-user-is-admin-on) |
|
||||
| `DELETE` | `/api/users/:id` | [Delete an existing user.](REST-API-User#user-delete) ([Warning](https://github.com/wekan/wekan/issues/1289))|
|
||||
| `GET` | `/api/users/:id` | [Gets a user's information.](REST-API-User#user-information) |
|
||||
| `GET` | `/api/users` | [All of the users.](REST-API-User#user-list) |
|
||||
| `GET` | `/api/user` | [Gets a logged-in user.](REST-API-User#user-logged-in) |
|
||||
### Cards
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/api/boards/:boardId/lists/:listId/cards` | [Add a card to a list, board, and swimlane.](REST-API-Cards#add-card-to-list-board-swimlane) |
|
||||
| `PUT` | `/api/boards/:boardId/lists/:fromListId/cards/:cardId` | [Update a card.](REST-API-Cards#update-a-card) |
|
||||
| `DELETE` | `/api/boards/:boardId/lists/:listId/cards/:cardId` | [Delete a card.](REST-API-Cards#update-a-card) |
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Login
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/users/login` | `no` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
### Authentication with username
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
|
||||
### Authentication with email
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
|
||||
DOES NOT WORK ! Please use As JSON example below !
|
||||
https://github.com/wekan/wekan/issues/4807
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/users/login \
|
||||
-d "username=myusername&password=mypassword"
|
||||
```
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/users/login \
|
||||
-d "email=my@email.com&password=mypassword"
|
||||
```
|
||||
|
||||
|
||||
## Example Call - As JSON
|
||||
|
||||
THIS WORKS !! Alternatively, look at api.py example at https://github.com/wekan/wekan
|
||||
|
||||
NOTE: Username and password is case sensitive. So type BIG and small letters correctly.
|
||||
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/login \
|
||||
-d '{ "username": "myusername", "password": "mypassword" }'
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/login \
|
||||
-d '{ "email": "my@email.com", "password": "mypassword" }'
|
||||
```
|
||||
|
||||
|
||||
## Result
|
||||
```json
|
||||
{
|
||||
"id": "user id",
|
||||
"token": "string",
|
||||
"tokenExpires": "ISO encoded date string"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"id": "XQMZgynx9M79qTtQc",
|
||||
"token": "ExMp2s9ML1JNp_l11sIfINPT3wykZ1SsVwg-cnxKdc8",
|
||||
"tokenExpires": "2017-12-15T00:47:26.303Z"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,8 @@
|
||||
Admin Panel / People / Click at right side of usename `...` button that is User Settings / Impersonate user.
|
||||
|
||||
You will be switched to logged in as that user.
|
||||
|
||||
To switch back to your original user, at your webbrowser click `Reload open webpage` round arrow button.
|
||||
|
||||
This feature was added to Wekan v4.39 at https://github.com/wekan/wekan/pull/3280
|
||||
|
||||
@@ -0,0 +1,784 @@
|
||||
[Sandstorm](Sandstorm) - [Sandstorm Backup](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
# Upcoming
|
||||
|
||||
[Transferring to Minio and SQLite](https://github.com/wekan/minio-metadata)
|
||||
|
||||
# Backup Docker
|
||||
|
||||
[Also see: Upgrading Synology with Wekan quay images](https://github.com/wekan/wekan/issues/3874#issuecomment-867526249)
|
||||
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
|
||||
[docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml)
|
||||
|
||||
This presumes your Wekan Docker is currently running with:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
Backup to directory dump:
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker exec wekan-db mongodump -o /data/dump
|
||||
docker cp wekan-db:/data/dump .
|
||||
docker start wekan-app
|
||||
```
|
||||
Copy dump directory to other server or to your backup.
|
||||
|
||||
# Restore Docker
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker cp dump wekan-db:/data/
|
||||
docker exec wekan-db mongorestore --drop --dir=/data/dump
|
||||
docker start wekan-app
|
||||
```
|
||||
# Upgrade Docker Wekan version
|
||||
|
||||
## Newest info
|
||||
|
||||
https://github.com/wekan/wekan/discussions/5367
|
||||
|
||||
## Old info
|
||||
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
```bash
|
||||
docker-compose stop
|
||||
docker rm wekan-app
|
||||
```
|
||||
a) For example, if you in docker-compose.yml use `image: wekanteam/wekan` or `image: quay.io/wekan/wekan` for latest development version
|
||||
|
||||
b) Or in docker-compose.yml change version tag, or use version tag like `image: wekanteam/wekan:v5.50` or `image: quay.io/wekan/wekan:v5.50`
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
# Backup Wekan Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan > snap-settings.sh
|
||||
```
|
||||
NOTE for Arch Linux: Use this path instead. [Source](https://github.com/wekan/wekan/issues/3941).
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH-}:/var/lib/snapd/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has commands like:
|
||||
```bash
|
||||
sudo snap set wekan root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Snap
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
# Upgrade Snap manually immediately (usually it updates automatically)
|
||||
|
||||
```bash
|
||||
sudo snap refresh
|
||||
```
|
||||
|
||||
# Backup Wekan Gantt GPLv2 Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan-gantt-gpl > snap-settings.sh
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has command like:
|
||||
```bash
|
||||
sudo snap set wekan-gantt-gpl root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Gantt GPLv2 Snap
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
|
||||
# DBGate, Open Source MongoDB GUI
|
||||
|
||||
https://dbgate.org - https://github.com/dbgate/dbgate
|
||||
|
||||
# Using nosqlbooster closed source MongoDB GUI with Wekan Snap to edit MongoDB database
|
||||
|
||||
https://nosqlbooster.com/downloads
|
||||
|
||||
### At server where Wekan Snap is installed, MongoDB is running at localhost port 27019
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-basic-connection.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
### You can tunnel via SSH to server, using password auth or private key auth dropdown selection
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-ssh-tunnel.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
# Scheduled backups to local or remote server
|
||||
|
||||
For below scheduled backup scripts, no info from above of this wiki page is required. Backup scripts below have the required settings.
|
||||
|
||||
This does backup of [Wekan+RocketChat snap databases](OAuth2) and php website etc.
|
||||
|
||||
If you need to backup some remote server or cloud, you can use scp, or read [rclone docs](https://rclone.org/docs/) about how to configure saving to some other remote server or cloud.
|
||||
|
||||
The following .sh bash scripts are added as root user to your `/root/` directory.
|
||||
|
||||
Backups are created to subdirectories of `/root/backups/`.
|
||||
|
||||
Cron is used to schedule backups, for example once a day.
|
||||
|
||||
1. To add bash scripts, you change to root user with this command, and your sudo or root password.
|
||||
```bash
|
||||
sudo su
|
||||
```
|
||||
2. Use nano editor for editing cron. If you don't have it installed, type:
|
||||
```bash
|
||||
apt install nano
|
||||
```
|
||||
3. Then we set text editor to be nano. Otherwise it probably uses vi, that is harder to use.
|
||||
```bash
|
||||
export EDITOR=nano
|
||||
```
|
||||
4. Now we start editing cron scheduler.
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
For more info how to make cron time, see https://crontab.guru
|
||||
|
||||
In this example, we set backups every day at 04:00, then it runs backup.sh script, and saves output of the backup commands to the bottom of textfile backup.log.txt
|
||||
```bash
|
||||
# m h dom mon dow command
|
||||
0 4 * * * /root/backup.sh >> /root/backup.log.txt 2>&1
|
||||
```
|
||||
- For changing to `/root` directory, type: `cd /root`
|
||||
- for editing backup.sh file, type: `nano backup.sh`
|
||||
- For saving in nano, press Ctrl-o Enter
|
||||
- For exiting nano, press Ctrl-x Enter
|
||||
- Set every .sh file as executeable, for example: `chmod +x backup.sh`
|
||||
|
||||
This is content of `backup.sh` script. It runs all the other backup scripts.
|
||||
If you do not need to backup rocketchat or website, or do not need to use rclone,
|
||||
you don't need to add those command lines at all.
|
||||
```bash
|
||||
cd /root
|
||||
./backup-wekan.sh
|
||||
./backup-rocketchat.sh
|
||||
./backup-website.sh
|
||||
rclone move backups cloudname:backup.example.com
|
||||
```
|
||||
More about rclone:
|
||||
|
||||
/root/rclone-ls-all.sh , shows directory contests at cloud:
|
||||
```bash
|
||||
rclone lsd cloudname:
|
||||
```
|
||||
In this example, cron does run backup scripts as root.
|
||||
This is if you edit cron with command `crontab -e` as root user,
|
||||
so it edits the cron of root user.
|
||||
|
||||
If mongodump command works as normal user for you, you could instead
|
||||
run backups as normal user, by exiting root user with `exit` and
|
||||
then as normal user editing cron with `crontab -e`.
|
||||
You can also list current cron with command `crontab -l`.
|
||||
|
||||
If you like to backup Wekan snap settings with this command, then it
|
||||
only works with sudo at front, or as a root user without sudo at front.
|
||||
```bash
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
```
|
||||
|
||||
This below is backup script for backing up Wekan.
|
||||
|
||||
/root/backup-wekan.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
# Backups will be created below this directory.
|
||||
backupdir="/root/backups/wekan"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Gets current time to variable "now"
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
|
||||
# Creates new backup directory like BACKUPDIR/BACKUPVERSIO-TIMENOW
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
#dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Changes to backup directory
|
||||
cd $backupdir/$version-$now
|
||||
|
||||
# Backup Caddy settings
|
||||
snap get wekan > snap-settings.txt
|
||||
|
||||
# Show text that database backup is in progress
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
|
||||
# Backup to current directory, creates subdirectory called "dump"
|
||||
# with database dump files
|
||||
mongodump --port 27019
|
||||
|
||||
# Change diretory (=cd) to parent directory
|
||||
cd ..
|
||||
|
||||
# Show text "Makes the tar.gz archive file"
|
||||
printf "\nMakes the tar.gz archive file.\n"
|
||||
|
||||
# Creates tar.gz archive file. This works similarly like creating .zip file.
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Delete temporary files that have already been
|
||||
# compressed to above tar.gz file
|
||||
rm -rf $version-$now
|
||||
|
||||
# Shows text "Backup done."
|
||||
printf "\nBackup done.\n"
|
||||
|
||||
# Show where backup archive file is.
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```bash
|
||||
/root/backup-rocketchat.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/rocketchat"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27017
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/root/backup-website.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/example.com"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe file backup is in progress.\n\n"
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
cp -pR /var/snap/wekan/common/example.com $version-$now
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/var/snap/wekan/common/Caddyfile
|
||||
```bash
|
||||
chat.example.com {
|
||||
proxy / localhost:3000 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
https://boards.example.com {
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
example.com {
|
||||
root /var/snap/wekan/common/example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
matomo.example.com {
|
||||
root /var/snap/wekan/common/matomo.example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
# Example CloudFlare free wildcard SSL Origin Certificate, there is example.com.pem at certificates directory with private key at to and cert at bottom.
|
||||
http://example.com https://example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certificates
|
||||
alpn http/1.1
|
||||
}
|
||||
root /var/snap/wekan/common/example.com
|
||||
browse
|
||||
}
|
||||
|
||||
static.example.com {
|
||||
root /var/snap/wekan/common/static.example.com
|
||||
}
|
||||
```
|
||||
|
||||
## Related talk about MongoDB backup
|
||||
|
||||
Related talk, search for "mongodb" this page:
|
||||
https://fosdem.org/2020/schedule/events/
|
||||
|
||||
There is this:
|
||||
|
||||
Percona Backup for MongoDB: Status and Plans
|
||||
|
||||
Open Source solution for consistent backups of multi-shard MongoDB
|
||||
|
||||
- [Slides](https://fosdem.org/2020/schedule/event/perconamongodb/attachments/slides/3768/export/events/attachments/perconamongodb/slides/3768/Percona_Backup_for_MongoDB.pdf)
|
||||
- [Video webm](https://video.fosdem.org/2020/UD2.119/perconamongodb.webm)
|
||||
- [Same Video mp4](https://video.fosdem.org/2020/UD2.119/perconamongodb.mp4)
|
||||
|
||||
## Related Sandstorm issue
|
||||
|
||||
[Creating a backup while the grain is running could cause corruption](https://github.com/sandstorm-io/sandstorm/issues/3186).
|
||||
|
||||
## Combining old and new Wekan version data
|
||||
|
||||
Note: Do mongodump/mongorestore only when Wekan is stopped: wekan.wekan (Snap) or wekan-app (Docker).
|
||||
|
||||
1. From new Wekan export all boards to Wekan JSON.
|
||||
2. Backup new Wekan with mongodump.
|
||||
3. Backup old Wekan with mongodump.
|
||||
4. Restore old Wekan data to new Wekan with mongorestore.
|
||||
5. Restore new Wekan JSON exported boards by importing them.
|
||||
|
||||
## Rescuing board that does not load
|
||||
|
||||
Wekan web UI Import/Export JSON does not have all content currently. To upgrade from old Wekan version, use mongodump/mongorestore to newest Wekan, like described below.
|
||||
|
||||
To import big JSON file, on Linux you can use xclip to copy textfile to clipboard:
|
||||
```bash
|
||||
sudo apt-get install xclip
|
||||
cat board.json | xclip -se c
|
||||
```
|
||||
Then paste to webbrowser Wekan Add Board / Import / From previous export.
|
||||
|
||||
You can [save all MongoDB database content as JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file). Files are base64 encoded in JSON files.
|
||||
|
||||
Export board to Wekan JSON, and import as Wekan JSON can make some part of board to load, but you should check is some data missing.
|
||||
|
||||
With Wekan Snap, you can use [nosqlbooster GUI](https://nosqlbooster.com/downloads) to login through SSH to Wekan server localhost port 27019 and browse data.
|
||||
|
||||
You could use [daff](https://github.com/paulfitz/daff) to compare tables.
|
||||
|
||||
## Using Snap Mongo commands on your bash CLI
|
||||
|
||||
Add to your `~/.bashrc`
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
```
|
||||
Then you can backup:
|
||||
```bash
|
||||
mongodump --port 27019
|
||||
```
|
||||
And restore:
|
||||
```bash
|
||||
mongorestore --drop --port 27019
|
||||
```
|
||||
|
||||
## MongoDB shell on Wekan Snap
|
||||
|
||||
mongoshell.sh
|
||||
```bash
|
||||
#/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
mongo=$"/snap/wekan/$version/bin/mongo"
|
||||
$mongo --port 27019
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v2
|
||||
|
||||
Originally from https://github.com/wekan/wekan-snap/issues/62#issuecomment-470622601
|
||||
|
||||
## Backup
|
||||
|
||||
wekan-backup.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
now=$(date +"%Y%m%d-%H%M%S")
|
||||
parent_dir="/data/backups/wekan"
|
||||
backup_dir="${parent_dir}/${now}"
|
||||
log_file="${parent_dir}/backup-progress.log.${now}"
|
||||
|
||||
error () {
|
||||
printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap 'error "An unexpected error occurred."' ERR
|
||||
|
||||
take_backup () {
|
||||
mkdir -p "${backup_dir}"
|
||||
|
||||
cd "${backup_dir}"
|
||||
|
||||
/snap/wekan/$version/bin/mongodump --quiet --port 27019
|
||||
|
||||
cd ..
|
||||
|
||||
tar -zcf "${now}.tar.gz" "${now}"
|
||||
|
||||
rm -rf "${now}"
|
||||
}
|
||||
|
||||
printf "\n======================================================================="
|
||||
printf "\nWekan Backup"
|
||||
printf "\n======================================================================="
|
||||
printf "\nBackup in progress..."
|
||||
|
||||
take_backup 2> "${log_file}"
|
||||
|
||||
if [[ -s "${log_file}" ]]
|
||||
then
|
||||
printf "\nBackup failure! Check ${log_file} for more information."
|
||||
printf "\n=======================================================================\n\n"
|
||||
else
|
||||
rm "${log_file}"
|
||||
printf "...SUCCESS!\n"
|
||||
printf "Backup created at ${backup_dir}.tar.gz"
|
||||
printf "\n=======================================================================\n\n"
|
||||
fi
|
||||
```
|
||||
wekan-restore.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
file=$1
|
||||
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd "${parentDir}"
|
||||
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
|
||||
tar -zxvf "${file}"
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
restore=$"/snap/wekan/${version}/bin/mongorestore"
|
||||
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --quiet --drop --noIndexRestore -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
$restore --quiet --drop -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
rm -rf "${file}"
|
||||
|
||||
printf "\nRestore done.\n"
|
||||
}
|
||||
|
||||
makesRestore $1
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v1
|
||||
|
||||
## Backup script for MongoDB Data, if running Snap MongoDB at port 27019
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p /var/backups/wekan/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd /var/backups/wekan/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27019
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at /var/backups/wekan/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
|
||||
```
|
||||
|
||||
## Restore script for MongoDB Data, if running Snap MongoDB at port 27019 with a tar.gz archive.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
# Prepares the folder used for the backup.
|
||||
file=$1
|
||||
if [[ "$file" != *tar.gz* ]]
|
||||
then
|
||||
echo "The backup archive must be a tar.gz."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Goes into the parent directory.
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd $parentDir
|
||||
|
||||
# Untar the archive.
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
tar -zxvf $file
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Targets the dump file.
|
||||
restore=$"/snap/wekan/$version/bin/mongorestore"
|
||||
|
||||
# Restores.
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --drop --noIndexRestore wekan --port 27019 $file/dump/wekan
|
||||
$restore --drop wekan --port 27019 $file/dump/wekan
|
||||
printf "\nRestore done.\n"
|
||||
|
||||
# Cleanups
|
||||
rm -rf $file
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root.
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Start.
|
||||
makesRestore $1
|
||||
|
||||
```
|
||||
|
||||
## Docker Backup and Restore
|
||||
|
||||
[Docker Backup and Restore](Export-Docker-Mongo-Data)
|
||||
|
||||
[Wekan Docker Upgrade](https://github.com/wekan/wekan-mongodb#backup-before-upgrading)
|
||||
|
||||
## Snap Backup
|
||||
|
||||
[Snap Backup and Restore](https://github.com/wekan/wekan-snap/wiki/Backup-and-restore)
|
||||
|
||||
[Wekan Snap upgrade](https://github.com/wekan/wekan-snap/wiki/Install#5-install-all-snap-updates-automatically-between-0200am-and-0400am)
|
||||
|
||||
## Sandstorm Backup
|
||||
|
||||
Download Wekan grain with arrow down download button to .zip file. You can restore it later.
|
||||
|
||||
[Export data from Wekan Sandstorm grain .zip file](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
## <a name="cloudron">Cloudron
|
||||
|
||||
If those [Backup](Backup) ways are not easily found at [Cloudron](Cloudron), one way is to install [Redash](https://redash.io/) and then backup this way:
|
||||
|
||||
Redash works with this kind of queries:
|
||||
```json
|
||||
{
|
||||
"collection": "accountSettings",
|
||||
"query": {
|
||||
"type": 1
|
||||
},
|
||||
"fields": {
|
||||
"_id": 1,
|
||||
"booleanValue": 1,
|
||||
"createdAt": 1,
|
||||
"modifiedAt": 1,
|
||||
}
|
||||
}
|
||||
```
|
||||
So:
|
||||
|
||||
1) Create this kind of query:
|
||||
```json
|
||||
{
|
||||
"collection": "boards"
|
||||
}
|
||||
```
|
||||
|
||||
Later when you modify query, you can remove text like boards with double-click-with-mouse and delete-key-at-keyboard (or select characters with mouse and delete-key-at-keyboard), and then click collection/table >> button to insert name of next collection/table.
|
||||
|
||||
2) Click Save
|
||||
|
||||
3) Click Execute. This will cache query for use with REST API.
|
||||
|
||||
4) Click at right top `[...]` => `Show API key`
|
||||
|
||||
It looks like this:
|
||||
|
||||
https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
5) Only when saving first collection/table, Save API key to text file script like this `dl.sh`
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Example: ./dl.sh boards
|
||||
|
||||
export APIKEY=https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
curl -o $1.json $APIKEY
|
||||
```
|
||||
|
||||
6) Run save script like:
|
||||
```bash
|
||||
./dl.sh boards
|
||||
```
|
||||
Note: 1) Save 2) Execute => webbrowser can give this kind of timeout,
|
||||
but downloading with API script still works:
|
||||
|
||||
> wekan
|
||||
> Error running query: failed communicating with server. Please check your Internet connection and try again.
|
||||
|
||||
7) Repeat steps 1-4 and 6 for every collection/table like boards,cards, etc
|
||||
|
||||
8) Remove from downloaded .json files extra query related data, so that it is similar like [any other Wekan database backup JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
9) Insert data to some other Wekan install with nosqlbooster like mentioned at page [Backup](Backup)
|
||||
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
# Upgrading
|
||||
|
||||
Newest WeKan uses MongoDB 6.0.3.
|
||||
|
||||
Current working way to upgrade is:
|
||||
|
||||
## Docker
|
||||
|
||||
1. Create Mongodump of your database like at [Backup page](https://github.com/wekan/wekan/wiki/Backup)
|
||||
2. Use newest WeKan docker-compose.yml from https://github.com/wekan/wekan with WRITABLE_PATH setup to Rclone/MinIO like below this page
|
||||
3. Mongorestore to MongoDB 6.0.3 database
|
||||
4. Use WeKan Admin Panel `Move all attachments to filesystem` button to move all attachments to MinIO.
|
||||
5. Create Mongodump, that this time does not have any attachments, and is much smaller.
|
||||
6. Mongorestore to MongoDB 6.0.3 database.
|
||||
7. Start WeKan.
|
||||
|
||||
## Snap
|
||||
|
||||
Similar Mongodump and Mongorestore above, with these info:
|
||||
- https://github.com/wekan/wekan-snap/wiki/Candidate-WeKan-Snap-Manual-Upgrade
|
||||
- https://github.com/wekan/wekan/issues/4780
|
||||
|
||||
# Introduction
|
||||
|
||||
With Rclone https://rclone.org , it's possible to use many cloud filesystems, like AWS S3, MinIO https://min.io , etc.
|
||||
|
||||
Newest WeKan has features to move files between MongoDB GridFS and filesystem.
|
||||
|
||||
Instead of filesystem, Rclone mounted cloud filesystem directory can be used, like MinIO.
|
||||
|
||||
## Screenshot 1: Move to filesystem button moves to cloud filesystem like MinIO. S3 button does not work yet.
|
||||
|
||||
Note: In some cases, only buttons `Move all attachments` at top are visible. In some other cases, there is more visible, like moving all attachments of board, etc, maybe when some have been already moved.
|
||||
|
||||
<img src="https://wekan.github.io/rclone/wekan-admin-panel.png" width="100%" alt="Wekan Admin Panel file move" />
|
||||
|
||||
## Screenshot 2: Files at MinIO after moving all to filesystem
|
||||
|
||||
<img src="https://wekan.github.io/rclone/minio1.png" width="100%" alt="MinIO 1" />
|
||||
|
||||
## Screenshot 3: Files at MinIO after moving all to filesystem
|
||||
|
||||
<img src="https://wekan.github.io/rclone/minio2.png" width="100%" alt="MinIO 2" />
|
||||
|
||||
## Rclone config
|
||||
|
||||
Create config for example with command:
|
||||
```
|
||||
rclone config
|
||||
```
|
||||
At S3 providers, there is MinIO at https://rclone.org/s3/#minio
|
||||
|
||||
`/root/.config/rclone/rclone.conf`
|
||||
|
||||
```
|
||||
[aws]
|
||||
type = s3
|
||||
provider = AWS
|
||||
access_key_id = ACCESS-KEY-HERE
|
||||
secret_access_key = SECRET-KEY-HERE
|
||||
region = eu-north-1
|
||||
location_constraint = eu-north-1
|
||||
acl = private
|
||||
|
||||
[minio]
|
||||
type = s3
|
||||
provider = Minio
|
||||
access_key_id = ACCESS-KEY-HERE
|
||||
secret_access_key = SECRET-KEY-HERE
|
||||
endpoint = http://192.168.0.100:9000
|
||||
acl = private
|
||||
```
|
||||
## Listing files with Rclone
|
||||
```
|
||||
rclone ls aws:
|
||||
|
||||
rclone ls minio:
|
||||
```
|
||||
## MinIO config
|
||||
|
||||
https://min.io
|
||||
|
||||
Running MinIO server binary, storing files at `/home/wekan/minio/data`
|
||||
```
|
||||
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /home/wekan/minio/data --console-address ":9001"
|
||||
```
|
||||
Create bucket, access key, secret key. Then connect them with `mc` command installed from https://min.io website, here bucket wekan:
|
||||
```
|
||||
mc config host add wekan http://192.168.0.100:9000 ACCESS-KEY-HERE SECRET-KEY-HERE
|
||||
```
|
||||
## Snap
|
||||
This uses minimal cache to make it work. Note that Rclone stays at foreground running, showing related messages, it does not daemonize to background.
|
||||
```
|
||||
sudo su
|
||||
|
||||
rclone mount minio:wekan/files /var/snap/wekan/common/files --vfs-cache-mode minimal
|
||||
```
|
||||
Sometimes it shows this kind of message:
|
||||
```
|
||||
2022/12/27 10:22:13 NOTICE: S3 bucket wekan path files: Streaming uploads using chunk size 5Mi will have maximum file size of 48.828Gi
|
||||
```
|
||||
## Docker
|
||||
|
||||
Rclone, short story:
|
||||
```
|
||||
sudo su
|
||||
|
||||
rclone mount minio:wekan/files /var/lib/docker/volumes/wekan_wekan-files/_data --vfs-cache-mode minimal
|
||||
```
|
||||
Longer story:
|
||||
|
||||
`docker-compose.yml` at https://github.com/wekan/wekan
|
||||
```
|
||||
- WRITABLE_PATH=/data
|
||||
```
|
||||
Docker volumes are there:
|
||||
```
|
||||
sudo ls /var/lib/docker/volumes/
|
||||
|
||||
wekan_wekan-db-dump
|
||||
wekan_wekan-db
|
||||
wekan_wekan-files
|
||||
```
|
||||
Directories there are:
|
||||
```
|
||||
/var/lib/docker/volumes/_data/attachments
|
||||
/var/lib/docker/volumes/_data/avatars
|
||||
```
|
||||
## Bundle or Source
|
||||
|
||||
Set `WRITABLE_PATH`like in Docker example above.
|
||||
|
||||
## Development
|
||||
|
||||
In Progress direct support without Rclone, if getting it working sometime.
|
||||
|
||||
Meteor-Files currently uses official AWS-SDK that does not yet directly support custom endpoint like MinIO:
|
||||
- https://github.com/veliovgroup/Meteor-Files/issues/862
|
||||
- https://github.com/veliovgroup/Meteor-Files/blob/master/docs/aws-s3-integration.md
|
||||
- https://github.com/wekan/wekan/issues/142#issuecomment-1365249290
|
||||
|
||||
MinIO code examples:
|
||||
- https://github.com/minio/minio-js/tree/master/examples
|
||||
|
||||
Related RocketChat docs about MinIO:
|
||||
- https://docs.rocket.chat/guides/administration/admin-panel/settings/file-upload/minio
|
||||
- https://github.com/RocketChat/Rocket.Chat/tree/develop/apps/meteor/app/file-upload
|
||||
- https://github.com/RocketChat/Rocket.Chat/pulls?q=is%3Apr+minio+is%3Aclosed
|
||||
|
||||
Storage path during developing WeKan, for example:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
rclone mount minio:wekan/files /home/wekan/repos/wekan/.meteor/local/.build-garbage-uslyxi.uokel/programs --vfs-cache-mode minimal
|
||||
```
|
||||
@@ -0,0 +1,165 @@
|
||||
## Repair Snap WeKan
|
||||
|
||||
```
|
||||
sudo su
|
||||
|
||||
snap stop wekan
|
||||
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
|
||||
mongod --dbpath "/var/snap/wekan/common" --repair >> /root/repairlog.txt
|
||||
|
||||
snap start wekan
|
||||
|
||||
exit
|
||||
```
|
||||
|
||||
Logs from Snap:
|
||||
|
||||
https://github.com/wekan/wekan/issues/5073
|
||||
|
||||
## Repair Docker WeKan
|
||||
|
||||
At step 12 below is actual repair MongoDB command.
|
||||
|
||||
Some customer of [WeKan Commercial Support](https://wekan.team/commercial-support/) ordered restore and repair of WeKan MongoDB database at UCS appliance. This was needed when changing back to previous UCS 4.x major version, when in new major UCS 5.x version Docker containers were all the time crashing and restarting, or something else got broken. Here are commands that were used while repairing.
|
||||
|
||||
Similarly, MongoDB may require repair, if:
|
||||
- MongoDB does not recover from sudden power failure cleanly
|
||||
- Disk comes full, that is worst case. Recommended are daily backups, in this case sometimes repair does not work well enough.
|
||||
|
||||
1. SSH to UCS appliance as root:
|
||||
```
|
||||
ssh root@192.168.0.100
|
||||
```
|
||||
2. If backup or raw database files is at external USB harddrive, look where it is inserted:
|
||||
```
|
||||
ls /dev
|
||||
|
||||
fdisk -l /dev/sdb
|
||||
|
||||
fdisk -l /dev/sdc
|
||||
|
||||
fdisk -l /dev/sdd
|
||||
```
|
||||
2. If external USB drive has NTFS file format, and mount complains about not having NTFS support, install NTFS support to Linux:
|
||||
```
|
||||
apt install ntfs-3g
|
||||
```
|
||||
3. Mount USB drive to /mnt
|
||||
```
|
||||
mount /dev/sdd1 /mnt
|
||||
```
|
||||
4. Stop WeKan Docker containers. If copying raw database files, WeKan and MongoDB should not be running, so that MongoDB would not be even more corrupted. (If MongoDB is running, and you have mongodump backup, you can [Backup with mongorestore](Backup)
|
||||
```
|
||||
docker stop wekan-db wekan-app
|
||||
```
|
||||
5. Find WeKan database raw files. MongoDB has various database engines, like WiredTiger, how to save raw data compressed, or other formats. WiredTiger is file format to save compressed MongoDB data. Similar like MySQL has ISAM, InnoDB etc.
|
||||
```
|
||||
apt -y install mlocate
|
||||
updatedb
|
||||
locate WiredTiger.wt
|
||||
```
|
||||
It can show for example USB drive and Docker container directory:
|
||||
```
|
||||
root@ucs:/mnt/wekan/data/db# locate WiredTiger.wt
|
||||
/mnt/wekan/data/db/WiredTiger.wt
|
||||
/var/lib/univention-appcenter/apps/wekan/data/db/WiredTiger.wt
|
||||
```
|
||||
6. Change to newly installed MongoDB data directory:
|
||||
```
|
||||
cd /var/lib/univention-appcenter/apps/wekan/data/db/
|
||||
```
|
||||
7. Look at directory files owner permissions:
|
||||
```
|
||||
ls -lah
|
||||
```
|
||||
There could be like this:
|
||||
```
|
||||
-rw-r--r-- 1 tss tss 1004 Jan 25 13:09 WiredTiger.turtle
|
||||
-rw-r--r-- 1 tss tss 392K Jan 25 13:09 WiredTiger.wt
|
||||
```
|
||||
8. Move that probably empty newly installed MongoDB data elsewhere:
|
||||
```
|
||||
mkdir /root/new-empty-wekan-data
|
||||
mv * /root/new-empty-wekan-data
|
||||
```
|
||||
9. Copy MongoDB raw database files from USB harddrive to docker container directory:
|
||||
```
|
||||
root@ucs-bdc:/var/lib/univention-appcenter/apps/wekan/data/db# cp -pR /mnt/wekan/data/db/* .
|
||||
```
|
||||
10. Like looked at step 7, change file owner permissions to be correct, and change directory
|
||||
```
|
||||
chown -R tss:tss *
|
||||
cd /root
|
||||
```
|
||||
11. Find mongod command:
|
||||
```
|
||||
locate /usr/bin/mongod
|
||||
```
|
||||
12. Repair Docker WeKan with version of Docker MongoDB that WeKan uses, change mongod path to below. Repairing logged to textfile.
|
||||
```
|
||||
root@ucs:~# /var/lib/docker/overlay2/7b58483a16a2f67ee50486c00ec669940f7a95d460ee8188966fee0096e81fa2/diff/usr/bin/mongod --dbpath "/var/lib/univention-appcenter/apps/wekan/data/db" --repair >> repairlog.txt
|
||||
```
|
||||
13. Look what containers are running:
|
||||
```
|
||||
docker ps
|
||||
```
|
||||
14. Look what containers are not running:
|
||||
```
|
||||
docker ps -a
|
||||
```
|
||||
15. Start MongoDB first:
|
||||
```
|
||||
docker start wekan-db
|
||||
```
|
||||
16. Look what happends at MongoDB container:
|
||||
```
|
||||
docker logs wekan-db
|
||||
```
|
||||
17. Start WeKan next.
|
||||
```
|
||||
docker start wekan-app
|
||||
```
|
||||
18. Look what happends at MongoDB container.
|
||||
```
|
||||
docker logs wekan-app
|
||||
```
|
||||
19. Check are both wekan-db and wekan-app containers running, and not restarting:
|
||||
```
|
||||
docker ps
|
||||
```
|
||||
20. Try to login to WeKan with webbrowser.
|
||||
21. Backup WeKan database now after repair:
|
||||
```
|
||||
docker exec -it wekan-db bash
|
||||
cd /data
|
||||
rm -rf dump
|
||||
mongodump
|
||||
exit
|
||||
docker cp wekan-db:/data/dump .
|
||||
zip -r wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip dump
|
||||
```
|
||||
Now backup is at wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip file.
|
||||
|
||||
22. At your local computer terminal (not at UCS server), transfer file to your local computer with scp:
|
||||
```
|
||||
scp root@192.168.0.100:/root/wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip .
|
||||
```
|
||||
23. Copy backup to external USB harddrive, change YEAR-MONTH-DATE-TIME-HERE to current date and time:
|
||||
```
|
||||
cp /root/wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip /mnt/
|
||||
```
|
||||
24. Look what drives are mounted:
|
||||
```
|
||||
df -h
|
||||
```
|
||||
25. Sync and save unwritted data to disk, and unmount external USB harddrive safely:
|
||||
```
|
||||
sync
|
||||
umount /dev/sdd1
|
||||
```
|
||||
26. Remove external USB harddisk from server.
|
||||
27. Login to WeKan, check do all WeKan boards work. In this case, all did work.
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
```
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH2=$PATH
|
||||
export PATH=/snap/wekan/current/bin:$PATH
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
sudo snap stop wekan.mongodb
|
||||
sudo mv /var/snap/wekan/common .
|
||||
sudo mkdir /var/snap/wekan/common
|
||||
sudo snap refresh wekan --channel=latest/candidate
|
||||
```
|
||||
|
||||
To be continued...
|
||||
@@ -0,0 +1,73 @@
|
||||
If you know updates to this, please add new issue about it. Make changes to this page by cloning wiki:
|
||||
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
There edit Browser-compatibility-matrix.md and attach it with .txt extension or in .zip file to https://github.com/wekan/wekan/wiki/issues
|
||||
|
||||
## Webkit based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Safari | iOS Yes | iOS Newest | Newest | iOS, macOS
|
||||
|
||||
## Firefox based
|
||||
|
||||
Any telemetry at any Firefox based browser can be additionally most locked down with arkenfox user JS.
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
[Mypal](https://releases.wekan.team/mypal/) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132), Other 32bit browsers probably not
|
||||
Firefox | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) (based on Ubuntu 16.04) on PinePhone, OnePlus 3, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). Works best with bluetooth or USB mouse and keyboard.
|
||||
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . Tested on [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/). PWA URL is configured here https://github.com/wekan/wekan-openstore/blob/master/wekan.desktop#L3
|
||||
[Waterfox](https://www.waterfox.net) | No | No | Yes | Win/Mac/Linux, more private than Firefox, no tracking
|
||||
[Floorp](https://floorp.app) | No | No | Yes | [Win/Mac/Linux](https://github.com/Floorp-Projects/Floorp/releases), more private than Firefox, [Repo](https://github.com/Floorp-Projects/Floorp)
|
||||
[Mercury](https://thorium.rocks/mercury) | No | No | Yes | [Win/Linux](https://github.com/Alex313031/Mercury/releases), more private than Firefox, [Repo](https://github.com/Alex313031/Mercury)
|
||||
[SeaLion](https://github.com/wicknix/SeaLion) | No | No | Yes | [MacOS 10.7-14.1 x32,x64,ppc,ppc64/Linux x64](https://github.com/wicknix/SeaLion/releases), [Repo](https://github.com/wicknix/SeaLion)
|
||||
[LibreWolf](https://librewolf.net) | No | No | Yes | [Win/Mac/Linux](https://librewolf.net/installation/)
|
||||
|
||||
## Chromium based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Chrome | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Chromium | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Brave | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Vivaldi | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Opera | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Credge, Chromium Edge | Android Yes | Android | Newest | Win/Mac/Linux/Mobile
|
||||
[Microsoft Store App](https://www.microsoft.com/fi-fi/p/wekan/9p2mrxvd087r#activetab=pivot:overviewtab) | Yes | Yes | Yes | At Microsoft Store of Windows 10/11 desktop, made with [PWABuilder](https://www.pwabuilder.com/). Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), changed app from EdgeHTML to Credge based with Wekan demo & development server https://boards.wekan.team
|
||||
[Android Play Store App](https://play.google.com/store/apps/details?id=team.wekan.boards.twa) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), made with [PWABuilder](https://www.pwabuilder.com/), uses Android Chrome browser with Wekan demo & development server https://boards.wekan.team
|
||||
[Thorium](https://thorium.rocks) | No | Yes | Yes | [Win/Win7/Mac/Linux/Android/RasPi](https://thorium.rocks), speed optimized
|
||||
[Supermium](https://github.com/win32ss/supermium) | No | No | Yes | 32bit: Windows XP, Windows 2003
|
||||
|
||||
## EdgeHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Legacy Edge | No | No | Not | Not compatible with newest WeKan. Worked with Wekan v4.19 and before.
|
||||
|
||||
## MSHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Internet Explorer | No | No | No | No | No
|
||||
|
||||
## Other ways to create Mobile App with Meteor
|
||||
|
||||
https://guide.meteor.com/cordova
|
||||
|
||||
Benefits:
|
||||
- Can be faster, more stored at mobile
|
||||
- Native features integration possibilities
|
||||
|
||||
## Desktop app with Meteor
|
||||
|
||||
https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
|
||||
|
||||
## Optional Payments
|
||||
|
||||
- If there is sometime a need to develop payment feature, that does not exist yet
|
||||
- https://forums.meteor.com/t/need-help-adding-in-app-purchases-to-a-meteor-app-specifically-adding-subscription-support-for-android-play-store/40510
|
||||
- https://www.npmjs.com/package/cordova-plugin-purchase
|
||||
@@ -0,0 +1,11 @@
|
||||
## FerretDB
|
||||
|
||||
Replacing MongoDB with FerretDB/SQLite or FerretDB/PostgreSQL. Needs testing, what are correct settings.
|
||||
|
||||
https://forums.meteor.com/t/ferretdb-1-18-now-has-oplog-support-trying-replace-mongodb-6-x-with-ferretdb-postgresql-or-ferretdb-sqlite/61092
|
||||
|
||||
## ToroDB
|
||||
|
||||
ToroDB is not developed anymore. ToroDB was about adding MongoDB proxy to PostgreSQL or MySQL.
|
||||
|
||||
https://github.com/wekan/wekan/tree/main/torodb-postgresql
|
||||
@@ -0,0 +1,23 @@
|
||||
### Create card
|
||||
|
||||
At Calendar View, on Month when you click a date it will ask you if you want to create a new card and give its name. It then creates at first swimlane and at first list the card with the due date that it got from the date you clicked.
|
||||
|
||||
Video demonstration:
|
||||
|
||||
https://user-images.githubusercontent.com/70445835/184324324-b4bd466e-6873-4eef-8ca5-b6e4d9f95ac5.mp4
|
||||
|
||||
|
||||
- How it works https://github.com/wekan/wekan/issues/2687#issuecomment-1545235649
|
||||
- Fix for Calendar View Create Card https://github.com/wekan/wekan/pull/5019
|
||||
- Calendar view logic https://github.com/wekan/wekan/issues/4511
|
||||
|
||||
## <a name="Time"></a>Time
|
||||
|
||||
* [Due Date](Due-Date)
|
||||
* [Day of week start](Day-of-week-start)
|
||||
|
||||
## What features are missing
|
||||
|
||||
* [Calendar issues](https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aopen+calendar+label%3AFeature%3ACalendar-view)
|
||||
* [Time Tracking](Time-Tracking)
|
||||
* [Gantt Chart](Gantt)
|
||||
@@ -0,0 +1,7 @@
|
||||
## 1) Click right top your username
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_1.png" width="40%" alt="Day of Week Start 1" />
|
||||
|
||||
## 2) Click Change Settings => Set day of the week start => Select first day of the week from dropdown menu
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_2.png" width="40%" alt="Day of Week Start 1" />
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
- received - when a bug or task is found
|
||||
- start - when work is started
|
||||
- due - when it should be done
|
||||
- end - when it's done
|
||||
@@ -0,0 +1,19 @@
|
||||
## Time Tracking
|
||||
|
||||
This was found 2020-05-20 at [Time Tracking Wekan issue](https://github.com/wekan/wekan/issues/812#issuecomment-631111730), thanks!
|
||||
|
||||
Titra Time Tracking, GPLv3
|
||||
- https://titra.io/en/free-time-tracking-online/
|
||||
- https://github.com/kromitgmbh/titra/
|
||||
|
||||
Wekan Integration:
|
||||
- https://github.com/kromitgmbh/titra/wiki/Wekan-integration
|
||||
|
||||
|
||||
***
|
||||
|
||||
## iCal
|
||||
|
||||
https://github.com/wekan/wekan/issues/2836
|
||||
|
||||
https://github.com/wekan/wekan-ical-server
|
||||
@@ -0,0 +1,38 @@
|
||||
1. At Windows, sync to ntp timeserver. Examples:
|
||||
- `time.windows.com`
|
||||
- `ntp.ubuntu.com`
|
||||
- `ntp1.kolumbus.fi`
|
||||
|
||||
2. Dual boot to Qubes OS. At desktop top right calendar/time, set timezone to Etc/UTC.
|
||||
|
||||
3. At server and it's KVM VMs, edit `/etc/timezone` to `Etc/UTC`.
|
||||
|
||||
4. Update time at server:
|
||||
|
||||
```
|
||||
sudo apt -y install ntpdate
|
||||
|
||||
sudo ntpdate ntp.ubuntu.com
|
||||
```
|
||||
|
||||
5. Now local time shows correctly at webbrowser, like for example at Friend Desktop https://github.com/wekan/wekan/wiki/Friend
|
||||
|
||||
For testing any other time related code, that it shows correct local time, compare time functions results to this:
|
||||
|
||||
https://github.com/FriendUPCloud/friendup/blob/master/interfaces/web_desktop/apps/Convos/Scripts/chatlog.fui.js#L694
|
||||
|
||||
From Hogle Titlestad:
|
||||
|
||||
> Oh, and the most important thing.
|
||||
> The first argument is a time string.
|
||||
> Seconds. Not a normal date.
|
||||
> Such that you can subtracck and add seconds to it.
|
||||
> So input would be:
|
||||
> ```
|
||||
> this.parseDate( 1695981700956, false, 'Europe/Oslo' );
|
||||
> ```
|
||||
> e.g. Europe/Oslo is the server time zone.
|
||||
> The timestamp is server time.
|
||||
> For the event in question.
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
# Also see Snap Developer Docs
|
||||
|
||||
[Snap Developer Docs](https://github.com/wekan/wekan-snap/wiki/Snap-Developer-Docs)
|
||||
|
||||
# When adding settings to code you or somebody else wrote
|
||||
|
||||
Add all necessary settings that you find on code.
|
||||
|
||||
After doing all changes, [fix lint errors](Developer-Documentation#preventing-travis-ci-lint-errors-before-submitting-pull-requests) and if possible warnings too. You can silence errors if you really can't find solution.
|
||||
|
||||
Submit pull request to Wekan edge branch https://github.com/wekan/wekan/tree/edge
|
||||
|
||||
# Changes to server code
|
||||
|
||||
To use environment variables in your serverside code, use:
|
||||
```
|
||||
process.env.YOURSETTING
|
||||
```
|
||||
Example: [wekan/server/policy.js](https://github.com/wekan/wekan/blob/edge/server/policy.js)
|
||||
|
||||
# Changes to [config](https://github.com/wekan/wekan/blob/edge/snap-src/bin/config)
|
||||
|
||||
## 1) Add to beginning
|
||||
|
||||
At beginning there is this line:
|
||||
```
|
||||
# list of supported keys
|
||||
keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP ..."
|
||||
```
|
||||
To the end of it, add name of new setting. For example:
|
||||
```
|
||||
keys="... AWESOME_FEATURE_ENABLED"
|
||||
```
|
||||
|
||||
## 2) Add to bottom
|
||||
|
||||
Example 1: Set features not enabled as default.
|
||||
```
|
||||
DESCRIPTION_LDAP_ENABLED="LDAP enabled. Default: false"
|
||||
DEFAULT_LDAP_ENABLED="false"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 2: If setting is different for every server, leave it empty.
|
||||
```
|
||||
DESCRIPTION_OAUTH2_TOKEN_ENDPOINT="OAuth2 token endpoint. Example: /oauth/token"
|
||||
DEFAULT_OAUTH2_TOKEN_ENDPOINT=""
|
||||
KEY_OAUTH2_TOKEN_ENDPOINT="oauth2-token-endpoint"
|
||||
```
|
||||
Example 3: If there is same for every server, set it to general setting.
|
||||
```
|
||||
DESCRIPTION_LDAP_SEARCH_FILTER="LDAP search filter. Default: (&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
DEFAULT_LDAP_SEARCH_FILTER="(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 4: If you don't know example, leave it without example.
|
||||
```
|
||||
DESCRIPTION_TURBO_FILTER="Turbo filter. Default: ''"
|
||||
DEFAULT_TURBO_FILTER=""
|
||||
KEY_TURBO_FILTER="turbo-filter"
|
||||
```
|
||||
|
||||
# Changes to [Snap help](https://github.com/wekan/wekan/blob/edge/snap-src/bin/wekan-help)
|
||||
|
||||
## 1) How to quote examples
|
||||
|
||||
Snap settings need to be lowercase, and inside single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='(&(objectCategory=person)(objectClass=user)(!(cn=andy)))'
|
||||
```
|
||||
The setting inside single quotes is the actual setting.
|
||||
|
||||
Actual settings can include double quotes, spaces, etc, but not single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='"(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"'
|
||||
```
|
||||
|
||||
## 2) What to add as setting to Wekan help
|
||||
|
||||
Example 1:
|
||||
```
|
||||
echo -e "OAuth2 Token Endpoint. Example: /oauth/token"
|
||||
echo -e "To enable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT='/oauth/token'"
|
||||
echo -e "\t-Disable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT=''"
|
||||
echo -e "\n"
|
||||
```
|
||||
So all you add need to be above of this line:
|
||||
```
|
||||
# parse config file for supported settings keys
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
- https://www.sitepoint.com/javascript-async-await/
|
||||
- https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/
|
||||
- https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous
|
||||
@@ -0,0 +1,204 @@
|
||||
## About markdown changes
|
||||
|
||||
Wekan v4.29 changes markdown rendering from [marked](https://github.com/markedjs/marked) to [markdown-it](https://github.com/markdown-it/markdown-it).
|
||||
|
||||
## About emoji
|
||||
|
||||
With markdown-it, also [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) plugin has been added, supporting [full list of GitHub emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.json).
|
||||
|
||||
Example emoji code, that you can add for example to card name, card description etc:
|
||||
```
|
||||
:rainbow: :thumbsup: :100:
|
||||
```
|
||||
That shows emojis :rainbow: :thumbsup: :100:
|
||||
|
||||
## About other markdown-it plugins
|
||||
|
||||
For markdown-it, there are also other [syntax extensions](https://github.com/markdown-it/markdown-it#syntax-extensions) where some are listed at that markdown-it page, and [others at npmjs.com](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
|
||||
|
||||
For example, how to get some [mermaid plugin](https://www.npmjs.com/search?q=markdown-it-mermaid) working so that some syntax works for https://mermaid-js.github.io/mermaid/ ?
|
||||
|
||||
## How you could add another plugin
|
||||
|
||||
Using newest Ubuntu amd64:
|
||||
|
||||
# Meteor 2
|
||||
|
||||
### 1. Install git and configure it
|
||||
```
|
||||
sudo apt -y install git
|
||||
|
||||
git config --global user.name "Yourfirstname Yourlastname"
|
||||
|
||||
git config --global user.email email-address-you-use-at-github@example.com
|
||||
|
||||
git config --global push.default simple
|
||||
|
||||
nano .ssh/config
|
||||
```
|
||||
There add your User (GitHub username) and IdentityFile (Your ssh private key. Not public key that has .pub).
|
||||
For indentation, use one tab.
|
||||
```
|
||||
Host *
|
||||
IdentitiesOnly=yes
|
||||
|
||||
Host github.com
|
||||
Hostname github.com
|
||||
User xet7
|
||||
IdentityFile ~/.ssh/id_xet7ed
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
If you do not have ssh key, create it:
|
||||
```
|
||||
ssh-keygen
|
||||
```
|
||||
And press Enter about 3 times, until you have private key at `~/.ssh/id_rsa` and public key at `~/.ssh/id_rsa.pub`
|
||||
|
||||
Add public key `.pub` to your github account web interface.
|
||||
|
||||
Add path to Meteor:
|
||||
```
|
||||
nano .bashrc
|
||||
```
|
||||
There at bottom add:
|
||||
```
|
||||
export PATH=~/.meteor:$PATH
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
### 2. Create fork of `https://github.com/wekan/wekan` at GitHub web page
|
||||
|
||||
```
|
||||
mkdir repos
|
||||
|
||||
cd repos
|
||||
|
||||
git clone git@github.com:YourGithubUsername/wekan.git
|
||||
|
||||
cd wekan
|
||||
```
|
||||
### 3. Select option 1 to install dependencies, and then Enter.
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
1
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
That does: 1 install dependencies, 2 builds wekan, 3 starts wekan in development mode with command `meteor`, so it can detect if some file changes and try to rebuild automatically and reload webbroser. But, still sometimes, it may need stopping with Ctrl-c and full build with option 2.
|
||||
|
||||
And then [register and login](Adding-users) at http://localhost:4000
|
||||
|
||||
### OPTIONAL, NOT NEEDED: 5. Add new plugin package
|
||||
```
|
||||
meteor npm install markdown-it-something --save
|
||||
```
|
||||
|
||||
Edit file `wekan/packages/markdown/src-integration.js` and add using that new package, using code example from that new plugin page, or similar like emoji plugin was added.
|
||||
|
||||
### 7. Test
|
||||
|
||||
Test does that new plugin syntax work, for example in card title, card description etc on other input fields.
|
||||
|
||||
### 8. If it works, create pull request
|
||||
|
||||
If normal markdown, emoji, and your new added plugin syntax all work, commit your changes:
|
||||
```
|
||||
git add --all
|
||||
|
||||
git commit -m "Added plugin markdown-it-something."
|
||||
|
||||
git push
|
||||
```
|
||||
And then at your GitHub for `https://github.com/YOUR-GITHUB-USERNAME/wekan` click `Create pull request`.
|
||||
|
||||
# Meteor 3
|
||||
|
||||
At 2024-06-26, it looks like from https://nodejs.org/en that Node.js LTS version is 20.15.0 , so change to newest Node.js LTS, delete old Meteor:
|
||||
```
|
||||
sudo n 20.15.0
|
||||
|
||||
sudo npm -g install npm
|
||||
|
||||
cd
|
||||
|
||||
rm -rf .meteor
|
||||
```
|
||||
Check how to install newest Meteor from Meteor 3 PR at https://github.com/meteor/meteor/pull/13163 , for example:
|
||||
```
|
||||
npx meteor@rc
|
||||
```
|
||||
Check what branches there are:
|
||||
```
|
||||
cd repos/wekan
|
||||
|
||||
git branch -a
|
||||
```
|
||||
Change to Meteor 3 branch:
|
||||
```
|
||||
git checkout feature-meteor3
|
||||
```
|
||||
Build wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
```
|
||||
If there are errors, try to fix them.
|
||||
|
||||
Or try to run wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
# Updating
|
||||
|
||||
There are usually updates both for npm packages and Meteor
|
||||
|
||||
Updating npm packages:
|
||||
```
|
||||
npm update
|
||||
```
|
||||
Checking for vulnerable packages:
|
||||
```
|
||||
npm audit
|
||||
```
|
||||
Fixing vulnerable npm packages by updating to newer packages:
|
||||
```
|
||||
npm audit fix
|
||||
```
|
||||
If that did not help, use force:
|
||||
```
|
||||
npm audit fix --force
|
||||
```
|
||||
If that did not help, read links from that `npm audit` command did show, remove deprecated dependencies, update to other maintained dependencies.
|
||||
|
||||
Updating to next Meteor release:
|
||||
```
|
||||
meteor update
|
||||
```
|
||||
Updating to specific Meteor release:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4
|
||||
```
|
||||
Trying to update all Meteor packages:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages
|
||||
```
|
||||
Allowing incompatible updates, that may sometime work:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages --allow-incompatible-update
|
||||
```
|
||||
If you are changing Meteor and Node.js versions, you may need to reset Meteor:
|
||||
```
|
||||
meteor reset
|
||||
```
|
||||
Or alternatively, delete wekan repo (if you did not need any changes you made), and clone wekan repo again, and then build etc.
|
||||
@@ -0,0 +1,115 @@
|
||||
## Maximum Call Stack Size Exceeded
|
||||
|
||||
https://github.com/wekan/wekan/issues?q=is%3Aissue+maximum+call+stack+is%3Aclosed
|
||||
|
||||
https://stackoverflow.com/questions/75869629/ios-websocket-close-and-error-events-not-firing
|
||||
|
||||
This can happen, when there is too much or incompatible code at browserside, for example at iOS Safari.
|
||||
|
||||
To fix it:
|
||||
|
||||
1. Move ExcelJS from browserside to run at serverside https://github.com/wekan/wekan/pull/3871
|
||||
2. Use Bundle Visualizer to see what is the size of dependencies, and try what can be moved to serverside like at step 1, that bundle visualizer is used in this script https://github.com/wekan/wekan/blob/main/rebuild-wekan.sh
|
||||
```
|
||||
meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 --extra-packages bundle-visualizer --production 2>&1 | tee ../log.txt
|
||||
```
|
||||
3. Make dependencies smaller. For example, use only required files, and do not include all dependencies: https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d . In that commit, package was forked to packages directory, then renamed, and added with `meteor add packagename`, where package name does not have character `:`
|
||||
4. Use Browserstack.com to see errors at browser / inspect / console, or use iOS or other device emulators, to see error messages. Testing at real device is more important, because they could work differently than emulators, emulators sometimes do not emulate all same features. Those error messages have file where error happened, and line number, like `something.js:301` . From there, scroll up a little, look at what function or what package dependency it is where it happened. If possible, try to move that package serverside, like at step 1. Or alternatively, look is it possible to remove or change to some other compatible dependency.
|
||||
5. See what are the dependencies at your Meteor based software, compared to WeKan dependencies that are usually already upgraded to newest Meteor, is there any differences where changing to correct dependencies could help you to upgrade to newest Meteor:
|
||||
- https://github.com/wekan/wekan/blob/main/package.json
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/packages
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/versions
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/release
|
||||
5. If you get some errors, search are those same already fixed in WeKan/Meteor/RocketChat, could you fix them same way:
|
||||
- https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- https://github.com/wekan/wekan/issues
|
||||
- https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/meteor/meteor/issues
|
||||
- https://github.com/meteor/meteor/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues?q=is%3Aissue+is%3Aclosed
|
||||
6. If you have some webserver providing SSL/TLS, check that you have websockets enabled:
|
||||
- https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Apache
|
||||
- OpenLiteSpeed https://github.com/wekan/wekan/issues/3334#issuecomment-723651328
|
||||
- https://github.com/wekan/wekan/wiki/Local-self-signed-TLS
|
||||
- https://github.com/wekan/wekan/wiki/Traefik-and-self-signed-SSL-certs
|
||||
|
||||
## OLD: TODO
|
||||
|
||||
[Quote from advise](https://github.com/meteor/meteor/issues/9796#issuecomment-443520767):
|
||||
|
||||
> Identify the core service your app is providing and make sure it is running independently. Put everything non-critical, including reporting, on some other system.
|
||||
|
||||
[Look at scaling tips here](https://github.com/meteor/meteor/issues/9796#issuecomment-411373831), quote:
|
||||
|
||||
> smeijer commented 25 days ago
|
||||
> Just wanted to let know that I haven't experienced this issue anymore since I've replaced a lot of `meteor publications` with `apollo/graphql requests`.
|
||||
>
|
||||
> The reactivity is thereby lost, but in my case a 30sec poll is also fine. On the places that I do require reactivity, I only `publish` a single `timestamp`. This timestamp is passed through to `apollo`, which triggers a `refetch` when the timestamp is changed.
|
||||
>
|
||||
> The [discussion here](https://forums.meteor.com/t/implementing-livedocument-as-an-alternative-to-livequery-discussion/40152) has also been helpfull to improve performance here and there.
|
||||
|
||||
[Rocket.Chat scaling tips](https://rocket.chat/docs/installation/manual-installation/multiple-instances-to-improve-performance/)
|
||||
|
||||
## Kadira
|
||||
|
||||
- https://github.com/edemaine/kadira-compose
|
||||
- https://github.com/meteor/meteor-apm-agent
|
||||
- https://github.com/kadira-open/kadira-server
|
||||
- https://www.gethappyboards.com/2017/07/rolling-out-your-own-instance-of-kadira/
|
||||
|
||||
## Finding memory leaks
|
||||
|
||||
**[Collect a heap profile and then analyze it](https://github.com/v8/sampling-heap-profiler)**
|
||||
|
||||
[Older article: How to Self Detect a Memory Leak in Node](https://www.nearform.com/blog/self-detect-memory-leak-node/)
|
||||
|
||||
## 100% CPU usage
|
||||
|
||||
1) Increase ulimit system wide to 100 000 in systemd config.
|
||||
|
||||
2) Wekan Javascript code has [increaded fiber poolsize](https://github.com/wekan/wekan/blob/main/server/authentication.js#L5-L9).
|
||||
|
||||
3) There is [on-going 100% CPU usage Meteor issue](https://github.com/meteor/meteor/issues/9796#issuecomment-400079380) and hopefully [fixes to Node.js will land in Node v8.12](https://github.com/nodejs/node/pull/21593#issuecomment-403636667) sometime. Node 8.12 is now released and official version included at Wekan.
|
||||
|
||||
## Scaling to thousands of users
|
||||
|
||||
[Production setup at AWS](AWS)
|
||||
|
||||
## Current versions of dependencies
|
||||
|
||||
[Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile), versions of Meteor.js, Node etc listed at beginning.
|
||||
|
||||
[Included Meteor packages](https://github.com/wekan/wekan/blob/main/.meteor/packages)
|
||||
|
||||
[Included Meteor package versions](https://github.com/wekan/wekan/blob/main/.meteor/versions)
|
||||
|
||||
[Added packages at package.json](https://github.com/wekan/wekan/blob/main/package.json)
|
||||
|
||||
## Build from source
|
||||
|
||||
Wekan:
|
||||
- On any x64 hardware that has Ubuntu 14.04 or Debian 9 or newer installed directly or in VM:
|
||||
[Build from source scripts](https://github.com/wekan/wekan-maintainer/tree/master/virtualbox)
|
||||
|
||||
Wekan for Sandstorm:
|
||||
- Install above Wekan from source
|
||||
- Install [Sandstorm locally](https://sandstorm.io/install) with `curl https://install.sandstorm.io | bash`, select dev install
|
||||
- Install [meteor-spk](https://github.com/sandstorm-io/meteor-spk)
|
||||
- Get 100% CPU issue fibers fixed node, and copy it to spk directory:<br />
|
||||
`wget https://releases.wekan.team/node`<br />
|
||||
`chmod +x node`<br />
|
||||
`mv node ~/projects/meteor-spk/meteor-spk-0.4.0/meteor-spk.deps/bin/`
|
||||
- Add to your /home/username/.bashrc : <br /> `export PATH=$PATH:$HOME/projects/meteor-spk/meteor-spk-0.4.0`
|
||||
- Close and open your terminal, or read settings from .bashrc with<br />`source ~/.bashrc`
|
||||
- `cd wekan && meteor-spk dev`
|
||||
- Then Wekan will be visible at local sandstorm at http://local.sandstorm.io:6080/
|
||||
- Sandstorm commands: `sudo sandstorm`. [Release scripts](https://github.com/wekan/wekan-maintainer/tree/master/releases). Official releases require publishing key that only xet7 has.
|
||||
|
||||
Docker:
|
||||
- `git clone https://github.com/wekan/wekan`
|
||||
- `cd wekan`
|
||||
- Edit docker-compose.yml script ROOT_URL etc like documented at https://github.com/wekan/wekan-mongodb docker-compose.yml script
|
||||
- `docker-compose up -d --build`
|
||||
@@ -0,0 +1,136 @@
|
||||
## WeKan Interview 2023-12-08 starts at 22min 22sec
|
||||
|
||||
https://www.youtube.com/watch?v=ke-mbnZM3zE
|
||||
|
||||
## Screenshot of Meteor WeKan
|
||||
|
||||
<img src="https://wekan.github.io/wekan-dark-mode.png" width="100%" alt="Meteor WeKan screenshot" />
|
||||
|
||||
## Description of Meteor WeKan
|
||||
|
||||
- WeKan Open Source kanban with MIT license.
|
||||
- Translated to 70+ languages https://explore.transifex.com/wekan/wekan/
|
||||
- Used in most countries of the world https://snapcraft.io/wekan
|
||||
- Biggest user have about 30k users, using many pods at Kubernetes
|
||||
- Changelog https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- Commercial Support at https://wekan.team/commercial-support/ . Currently looking who could sponsor more of maintenance and development.
|
||||
|
||||
## How much effort to create Meteor WeKan, in COCOMO model
|
||||
|
||||
- WeKan 134k lines of code: 34 years of effort, 316 contributors https://openhub.net/p/wekan
|
||||
- Meteor.js, 224k lines of code: 59 years of effort, 819 contributors https://openhub.net/p/meteor-js
|
||||
- Since December 2016, WeKan maintainer https://github.com/xet7 :
|
||||
- has added and removed about 4M lines of code https://github.com/wekan/wekan/graphs/contributors
|
||||
- https://openhub.net/accounts/xet7
|
||||
|
||||
## Meteor WeKan Browser support
|
||||
|
||||
- Javascript enabled Desktop and Mobile Safari/Chromium/Firefox based browsers
|
||||
- Apps at Play Store, Windows Microsoft Store, Ubuntu Touch OpenStore https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
- Alternatively, for self-hosted WeKan, create PWA icon https://github.com/wekan/wekan/wiki/PWA
|
||||
- Using WeKan with big touchscreen https://github.com/wekan/wekan/wiki/Touch-Screen-support
|
||||
|
||||
## Meteor WeKan Server
|
||||
|
||||
- Meteor.js 2.x, Node.js 14.x https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4 , MongoDB 6.x
|
||||
- CPU: amd64, arm64, s390x, Source Bundle at https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
- Windows On-Premise: https://github.com/wekan/wekan/wiki/Offline
|
||||
- Mac: Docker, or at https://github.com/wekan/wekan/wiki/Mac
|
||||
- Newest at platforms: Source Bundle, Snap Candidate, Docker, Kubernetes https://wekan.github.io
|
||||
- Platforms that will be updated to be up-to-date: Snap Stable, Sandstorm, UCS https://wekan.github.io
|
||||
|
||||
## Meteor WeKan Features
|
||||
|
||||
- [WeKan Design Principles](https://github.com/wekan/wekan/wiki/Design-Principles)
|
||||
- Realtime UI. When someone makes change, like drag card or add text, everyone will see changes immediately. This is because Meteor listens to MongoDB change stream, and updates UI. For some rare cases, there needs to be reload of page, those need to be fixed.
|
||||
- Whitelabel: Change product name and product image at login screen and board left top corner. Not changing favicon, because there are 100+ favicons for different devices.
|
||||
- Drag Drop at Desktop and Mobile:
|
||||
- Board Icons, Swimlanes, Lists, Cards, Checklists, Checklist Items
|
||||
- Drag handles, per screen https://github.com/wekan/wekan/wiki/Drag-Drop
|
||||
- Some features similar to Trello and Jira. Some features not in Trello and Jira.
|
||||
- IFTTT Rules like Trello Butler https://github.com/wekan/wekan/wiki/IFTTT , translated to all supported languages. Trello Butler is only In English.
|
||||
- Many Assignees like in Jira.
|
||||
- Change background image and Card Cover. Change Theme. Change color of Boards, Swimlane, List, Card, Label.
|
||||
- Markdown at: Board name and description, Swimlane, List, Card title and description, Checklist and Checklist Item, Subtask title, https://github.com/wekan/wekan/wiki/Wekan-Markdown
|
||||
- Emoji https://github.com/wekan/wekan/wiki/Emoji
|
||||
- MathML
|
||||
- Preview card attachment image and PDF
|
||||
- Show Start at End Dates of card at Calendar of Swimlanes/Lists/Calendar dropdown menu
|
||||
- Custom Fields https://github.com/wekan/wekan/wiki/Custom-Fields
|
||||
- Subtasks https://github.com/wekan/wekan/wiki/Subtasks
|
||||
- Planning Poker / Scrum Poker at Card https://github.com/wekan/wekan/wiki/Planning-Poker . No other card games yet ;)
|
||||
- For board actions, like move card etc, Per Board and Global Outgoing and 2-way webhooks to Chat (RocketChat, Slack, Discord etc), NodeRED, or PHP webhook receiver like https://github.com/wekan/webhook
|
||||
- At top right username menu:
|
||||
- Search All Boards, with search options
|
||||
- Public Boards. Board can be set private or public. At Admin Panel is option to disable public boards, so all boards are private.
|
||||
- Change Language
|
||||
- My Cards and Due Cards: Show cards where you are member or assignee, from all boards
|
||||
- At top of current board:
|
||||
- Filter cards, by user etc
|
||||
- Multi-Selection, checkmark and drag many cards at once
|
||||
- Sort current board
|
||||
- Python and PHP based additional features https://github.com/wekan/wekan/wiki/Python
|
||||
- Admin Panel:
|
||||
- Organizations/Teams/People. Impersonate User, logged to database when someone uses that feature.
|
||||
- Customize Translations https://github.com/wekan/wekan/wiki/Customize-Translations
|
||||
|
||||
## Technical details
|
||||
|
||||
- Reactive Cache
|
||||
- mfilser tested speed improvement for half a year, and finally made huge PR to WeKan v7.00 to make all of WeKan use Reactive cache https://github.com/wekan/wekan/pull/5014
|
||||
- Reactive Cache Repo https://github.com/wekan/meteor-reactive-cache , xet7 updated dependencies
|
||||
- Big performance improvements https://github.com/wekan/wekan/issues/5000
|
||||
- Using same style of API for client and serverside
|
||||
- Use more ReactiveCache than MiniMongo
|
||||
- Optimizing and Debugging Meteor, reducing size, links to WeKan dependencies https://github.com/wekan/wekan/wiki/Debugging
|
||||
- Custom OIDC/OAuth2 login
|
||||
- Repo https://github.com/wekan/wekan/tree/main/packages/wekan-oidc
|
||||
- Features:
|
||||
- At Admin Panel, you can change text of login page button `Login with OIDC`
|
||||
- Auth0 https://github.com/wekan/wekan/wiki/OAuth2#auth0 . This did take about half year to implement by xet7, was not available anywhere else for Meteor.
|
||||
- Oracle OIM. https://github.com/wekan/wekan/wiki/Oracle-OIM . For this, customer provided some code. xet7 added fix to make login work even when some login field was missing data, by taking data from other field, all this while xet7 did not have access to customers Oracle OIM, just guessing about what code to add, and it worked.
|
||||
- GitLab https://github.com/wekan/wekan/wiki/OAuth2#gitlab-providing-oauth2-login-to-wekan
|
||||
- RocketChat https://github.com/wekan/wekan/wiki/OAuth2#rocketchat-providing-oauth2-login-to-wekan
|
||||
- Nextcloud https://github.com/wekan/wekan/wiki/Nextcloud
|
||||
- ADFS 4.0 using OAuth2 and OpenID https://github.com/wekan/wekan/wiki/ADFS
|
||||
- Azure https://github.com/wekan/wekan/wiki/Azure
|
||||
- Keycloak https://github.com/wekan/wekan/wiki/Keycloak
|
||||
- Google login https://github.com/wekan/wekan/wiki/Google-login
|
||||
- Custom LDAP
|
||||
- LDAP https://github.com/wekan/wekan/wiki/LDAP
|
||||
- LDAP AD Simple Auth https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth
|
||||
- Default board for users https://github.com/wekan/wekan/pull/5098
|
||||
- Brute Force Accounts Lockout https://github.com/wekan/wekan/wiki/Accounts-Lockout
|
||||
- Markdown, Emoji, MathML, sanitizing https://github.com/wekan/wekan/blob/main/packages/markdown/src/template-integration.js
|
||||
- Many security fixes from Responsible Disclosure https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Upcoming Features
|
||||
|
||||
- CAS https://github.com/wekan/wekan/wiki/CAS
|
||||
- SAML https://github.com/wekan/wekan/wiki/SAML
|
||||
|
||||
## Video
|
||||
|
||||
- Creator of WeKan, mquandalle (Maxime Quandalle) https://www.youtube.com/watch?v=N3iMLwCNOro
|
||||
- https://github.com/wekan/wekan/wiki/FAQ#what-was-wekan-fork--wefork
|
||||
- Maintainer of WeKan since December 2016, xet7 (Lauri Ojansivu), about WeKan Multiverse at EU NGI Dapsi https://www.youtube.com/watch?v=BPPjiZHVeyM . More about Multiverse at https://github.com/wekan/wekan/wiki/WeKan-Multiverse-Roadmap
|
||||
|
||||
## Maybe?
|
||||
|
||||
- https://github.com/frozeman/meteor-persistent-minimongo2
|
||||
|
||||
## Upcoming upgrades to Meteor 3.0
|
||||
|
||||
- This Week in MeteorJS: 22 September 2023 https://www.youtube.com/watch?v=UWVL1xUP9r0
|
||||
- There Jan Dvorak IV https://github.com/StorytellerCZ commented chat: "We should do deep dive into WeKan!"
|
||||
- So here is The Deep Dive!
|
||||
- Questions for upcoming "This Week in MeteorJS", some already mentioned to be upcoming:
|
||||
- How to upgrade dependencies to Meteor 3.0 ? Some answer was to mention Meteor version at package dependency:
|
||||
<img src="https://wekan.github.io/upgrade-meteor3-new.png" width="100%" alt="Meteor 3.0 upgrading dependencies" />
|
||||
- But what if adding dependency adds some more error messages? Probably that depends on error message, like here when
|
||||
trying to upgrade to Meteor 3.0 alpha 15: https://github.com/wekan/wekan/issues/5142
|
||||
- https://forums.meteor.com/t/my-journey-towards-meteor-3-0/60001/23
|
||||
- https://github.com/bratelefant/Meteor-Files
|
||||
- https://github.com/bratelefant/meteor-roles
|
||||
- https://github.com/bratelefant/meteor-multitenancy
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
## WeKan Design Principles
|
||||
|
||||
- Prevent messing up something https://github.com/wekan/wekan/wiki/Monkey-Proof-Software
|
||||
- Original WeKan Design, that WeKan currently has: Intuitive, easy to figure out, polished UI/UX, menu options are there where you would expect then to be. Try to fix anything unexpected. New features added there where it makes most sense. And not so many duplicate menus and texts like Trello.
|
||||
- Not the exact design of Trello https://github.com/wekan/wekan/wiki/FAQ#why-does-wekan-look-so-different-now-compared-to--v09 . Also not the exact design of any other software. But note that design of all software changes often, when they are in active development.
|
||||
- Some features like Trello:
|
||||
- Import from Trello
|
||||
- Shortcuts https://github.com/wekan/wekan/issues/1878
|
||||
- IFTTT Rules like Trello Butler https://github.com/wekan/wekan/wiki/IFTTT
|
||||
- Progress bar of checklist
|
||||
- Some features like Jira:
|
||||
- Multiple assignees
|
||||
- Some features not in Trello, like:
|
||||
- FOSS with MIT license
|
||||
- Self-hosting
|
||||
- Swimlanes
|
||||
- All the use cases of WeKan feature/fix contributors
|
||||
- Cross-platform. Support many CPU/OS/Browsers for Desktop and Mobile. Add support for more.
|
||||
- https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
- https://github.com/wekan/wekan/wiki/PWA
|
||||
- https://github.com/wekan/wekan/wiki/Offline
|
||||
- https://github.com/wekan/wekan/wiki/Mac
|
||||
- https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
@@ -0,0 +1,106 @@
|
||||
# Style guide
|
||||
|
||||
We follow the [meteor style guide](https://guide.meteor.com/code-style.html#javascript).
|
||||
|
||||
Please read the meteor style guide before making any significant contribution.
|
||||
|
||||
# Stories about how Wekan works, and developing Wekan
|
||||
|
||||
- https://www.mongodb.com/docs/drivers/node/v3.7/fundamentals/promises/
|
||||
- [Do not use code formatters like Prettier and ESLint](https://github.com/wekan/wekan/pull/4633#issuecomment-1214214591)
|
||||
- [How realtime board updates work](https://github.com/wekan/wekan/issues/3788#issuecomment-834649553)
|
||||
- [Mobile Web interface](https://github.com/wekan/wekan/issues/3566#issuecomment-778700604)
|
||||
- [How to add RTL support](https://github.com/wekan/wekan/issues/3376#issuecomment-766092425)
|
||||
- [How to code Part 1](https://blog.wekan.team/2019/04/howto-code-part-1-learning-to-learn/)
|
||||
- [First time Wekan contributor easily figures out Wekan and develops big features](https://blog.wekan.team/2018/05/wekan-v1-00-released/)
|
||||
- [Benefits of contributing your features to upstream Wekan](https://blog.wekan.team/2018/02/benefits-of-contributing-your-features-to-upstream-wekan/)
|
||||
- [Excellent example how pull requests are improved and integrated, and not needed commits removed](https://github.com/wekan/wekan/pull/1470)
|
||||
- [How to add dependency](https://github.com/wekan/wekan/discussions/5235)
|
||||
- [How to add set default view feature](https://github.com/wekan/wekan/discussions/5233)
|
||||
- [Adding SVG image](https://github.com/wekan/wekan/discussions/5211#discussioncomment-7765365)
|
||||
|
||||
## Building code and submitting pull request
|
||||
|
||||
- [Building code and submitting pull request](emoji#how-you-could-add-another-plugin)
|
||||
- When you start `meteor` command, it watches for changes to files in wekan directory and subdirectories, and if it detects changed code, it starts rebuilding bundle and then reloads webbrowser after that automatically
|
||||
- Also look at meteor changelog mentioned new feature `hot reload` how that could make reloading faster
|
||||
|
||||
## VSCode / VSCodium
|
||||
|
||||
- I use [VSCodium](https://vscodium.com) that has MS tracking code removed
|
||||
- Plugin Prettier for right click format javascript code with prettier
|
||||
- There could be other plugins for Meteor, Jade, Stylus, Dockerfile, etc
|
||||
|
||||
## Finding code
|
||||
|
||||
There is find.sh script that ignores generated directories, finds code in subdirectories, and paginates with less. For example, finding how search cards is implemented:
|
||||
```
|
||||
cd wekan
|
||||
./find.sh js-search
|
||||
```
|
||||
When you run this, you see .jade template files where is search input box, and .js files where is the search code. CSS is in .styl files.
|
||||
|
||||
## Getting Started
|
||||
|
||||
- Currently Wekan development is done mainly at Ubuntu 20.10 64bit, but building Wekan does work on any Debian, Ubuntu, WSL Ubuntu 20.04, [Mac](Mac). Sametime maybe on [Windows](Windows) with `choco install -y meteor` and installing packages it then asks for with `meteor add ...` or `meteor npm install --save ...` and then running meteor again.
|
||||
- Look through old [pull requests](https://github.com/wekan/wekan/pulls)
|
||||
- Read Wekan source code, you can use some git history viewer GUI like gitk
|
||||
- Read [Meteor documentation](https://docs.meteor.com/) for [Meteor version](https://github.com/wekan/wekan/blob/main/.meteor/release) in use, other versions mentioned at [Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile)
|
||||
- Docker up-to-date way: You can clone wekan/wekan repo and update docker-compose.yml file ROOT_URL etc as documented at https://github.com/wekan/wekan-mongodb commented docker-compose.yml file, install docker, and build from source with docker with "docker-compose up -d --build"
|
||||
- Docker not up-to-date way: [Docker environment for Wekan development](https://github.com/wekan/wekan-dev).
|
||||
|
||||
## Pull Request Workflow (Please read before submitting PR's)
|
||||
|
||||
- If package is available on meteor https://atmospherejs.com `meteor add packagename` or https://www.npmjs.com `meteor npm install packagename` then it's enough to add package that way, and there is no need to clone repo in [rebuild-wekan.sh](https://github.com/wekan/wekan-maintainer/tree/master/releases) script.
|
||||
- When doing pull requests, only add additions and changes to English at wekan/i18n/en.i18n.json . Other translations are done at [https://app.transifex.com/wekan/](https://app.transifex.com/wekan/).
|
||||
- If you have fix to some existing pull request, add your fix as comment. Do not post new pull request.
|
||||
- For new features add new pull request, if there is none already.
|
||||
- remove all console.log statements
|
||||
- [Here is how to remove commits from pull request](https://stackoverflow.com/questions/36168839/how-to-remove-commits-from-pull-request)
|
||||
|
||||
## Preventing Travis CI lint errors before submitting pull requests
|
||||
|
||||
- NOTE: Travis is currently broken and always shows warnings and errors like variables not defined or not used, so if your code works, ignore Travis.
|
||||
- Eslint for linting. To prevent Travis CI lint errors, you can test for lint errors by installing `npm install eslint` and running it with `npm run lint` and trying automatic fixing with `eslint --fix filename.js`
|
||||
- There is also probably not-currently-working as of 2018-05-05 [jsbeautifer website](http://jsbeautifier.org) with settings Indent with 2 spaces (topmost dropdown), [X] Space before conditional: "if(x)" / "if (x)", [X] Use JSLint-happy formatting tweaks.
|
||||
|
||||
## Choosing issues to work on
|
||||
|
||||
- You are free to select what feature to work on.
|
||||
- Leave a comment on an issue saying that you're working on it, and give updates as needed.
|
||||
- Work and concentrate on one issue at a time and finish it, before moving to other issue.
|
||||
- Keep list of your contributions on your personal website.
|
||||
- Keep track of time it takes to implement each part of a feature, so you can estimate what time it would take to implement similar feature. After implementing feature, review your estimate was it correct, make improvements to your process and estimates, also keeping enough time allocated in estimate if something is harder to implement. Employers look for coders with proven track record.
|
||||
- You can ask for comments from others, but usually those feature requests are clearly defined how they should work. You can place those Settings options there where it seems most logical for you.
|
||||
|
||||
Main point is to be friendly to those commenting of your code, and incorporate those suggestions that make most sense.
|
||||
|
||||
# Build Pipeline
|
||||
|
||||
- Templates are written in [JADE](https://naltatis.github.io/jade-syntax-docs/) instead of plain HTML. Also see [HTML to JADE converter](http://html2jade.org/).
|
||||
- CSS is written in the [Stylus](http://stylus-lang.com/) precompiler - see [Stylus to CSS converter](https://mikethedj4.github.io/Stylus2CSS/), and
|
||||
- Meteor templates are created as BlazeLayout templates.
|
||||
- Instead of the allow/deny paradigm a lot of the `collections` defined in the project use `mutations` to define what kinds of operations are allowed.
|
||||
|
||||
For further details look for the 'feature summaries' in the Wiki (still in progress) otherwise go through the git history and see how old features were built. Might I suggest the Start and Due date feature [wefork#26](https://github.com/wefork/wekan/pull/26)
|
||||
|
||||
# Translations
|
||||
|
||||
If adding new features, please also support the internationalization features built in. Refer to the [[Translations]] wiki page.
|
||||
|
||||
# Export From Trello
|
||||
|
||||
It's possible to import your existing boards from Trello. Instructions [[here|migrating-from-trello]]
|
||||
|
||||
# Directory Structure Details
|
||||
|
||||
[Directory Structure](Directory-Structure)
|
||||
|
||||
# Chat
|
||||
|
||||
[![Wekan chat][vanila_badge]][vanila_chat]
|
||||
|
||||
|
||||
[rocket_chat]: https://chat.indie.host/channel/wekan
|
||||
[vanila_badge]: https://vanila.io/img/join-chat-button2.png
|
||||
[vanila_chat]: https://community.vanila.io/wekan
|
||||
@@ -0,0 +1,187 @@
|
||||
# Routing
|
||||
|
||||
We're using [FlowRouter](https://github.com/kadirahq/flow-router) client side router inside **[config/router.js](https://github.com/wekan/wekan/tree/main/config/router.js)**.
|
||||
For accounts there is [AccountsTemplates](https://github.com/meteor-useraccounts) configured in **[config/accounts.js](https://github.com/wekan/wekan/tree/main/config/accounts.js)**.
|
||||
|
||||
# Client
|
||||
|
||||
## public
|
||||
|
||||
Files in this directory are served by meteor as-is to the client. It hosts some (fav)icons and fonts.
|
||||
**[wekan-manifest.json](https://github.com/wekan/wekan/tree/main/wekan-manifest.json)**: goes into `link rel="manifest"` in the header of the generated page and is a [Web App Manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest).
|
||||
|
||||
## components
|
||||
|
||||
* **[activities](https://github.com/wekan/wekan/tree/main/client/components/activities)**:
|
||||
* **[activities.jade](https://github.com/wekan/wekan/tree/main/client/components/activities/activities.jade)**: `activities` template for the list of activities placed inside a `sidebar-content`; uses `boardActivities` or `cardActivities` depending on `mode`; <span style="color:red">*XXX: does this mean that sidebar should be visible in board list mode? when does the `board` activity gets shown?*</span>
|
||||
* **[comments.jade](https://github.com/wekan/wekan/tree/main/client/components/activities/comments.jade)**: `commentForm` template used in `card-details-canvas` for adding comments;
|
||||
* **[boards](https://github.com/wekan/wekan/tree/main/client/components/boards)**:
|
||||
* **[boardArchive.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardArchive.jade)**: `archivedBoards` template for the modal dialog showing the list of archived boards that might be restored;
|
||||
* **[boardBody.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardBody.jade)**: top level template for presenting a board is `board` and, based on screen size and current state, it uses either `cardDetails` or `boardBody` templates; `boardBody` is the one including the `sidebar`, each `list`, `cardDetails` for larger screens when a card is selected and the `addListForm` for adding a new list (also defined in this file);
|
||||
* **[boardHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardHeader.jade)**: `boardHeaderBar`, `boardMenuPopup`, `boardVisibilityList`, `boardChangeVisibilityPopup`, `boardChangeWatchPopup`, `boardChangeColorPopup`, `createBoard`, `chooseBoardSource`, `boardChangeTitlePopup`, `archiveBoardPopup`, `outgoingWebhooksPopup`;
|
||||
* **[boardsList.jade](https://github.com/wekan/wekan/tree/main/client/components/boards/boardsList.jade)**: `boardList` and `boardListHeaderBar` for the list of boards in the initial screen;
|
||||
* **[cards](https://github.com/wekan/wekan/tree/main/client/components/cards)**:
|
||||
* **[attachments.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/attachments.jade)**: `cardAttachmentsPopup`, `previewClipboardImagePopup`, `previewAttachedImagePopup`, `attachmentDeletePopup`, `attachmentsGalery`;
|
||||
* **[cardDate.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardDate.jade)**: `editCardDate` and `dateBadge` templates;
|
||||
* **[cardDetails.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardDetails.jade)**: `boardsAndLists` is the usual layout for a board display with `boardLists` being used in sandstorm where each board is independent;`cardDetails`, `editCardTitleForm`, `cardDetailsActionsPopup`, `moveCardPopup`, `copyCardPopup`,`cardMembersPopup`,`cardMorePopup`, `cardDeletePopup`;
|
||||
* **[cardTime.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/cardTime.jade)**: `editCardSpentTime` and `timeBadge` templates;
|
||||
* **[checklists.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/checklists.jade)**: `checklists`, `checklistDetail`, `checklistDeleteDialog`, `addChecklistItemForm`, `editChecklistItemForm`, `checklistItems`, `itemDetail`;
|
||||
* **[labels.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/labels.jade)**: `formLabel`, `createLabelPopup`, `editLabelPopup`, `deleteLabelPopup`, `cardLabelsPopup`;
|
||||
* **[minicard.jade](https://github.com/wekan/wekan/tree/main/client/components/cards/minicard.jade)**: has the `minicard` template
|
||||
* **[forms](https://github.com/wekan/wekan/tree/main/client/components/forms)**: **[inlinedform.jade](https://github.com/wekan/wekan/tree/main/client/components/forms/inlinedform.jade)** has the`inlinedForm` template;
|
||||
* **[import](https://github.com/wekan/wekan/tree/main/client/components/import)**:
|
||||
* **[import.jade](https://github.com/wekan/wekan/tree/main/client/components/import/import.jade)**: `importHeaderBar`, `import`, `importTextarea`, `importMapMembers`, `importMapMembersAddPopup` are all templates used for importing Trello (via **[trelloMembersMapper.js](https://github.com/wekan/wekan/tree/main/client/components/import/trelloMembersMapper.js)**) and Wekan (via **[wekanMembersMapper.js](https://github.com/wekan/wekan/tree/main/client/components/import/wekanMembersMapper.js)**) boards;
|
||||
* **[lists](https://github.com/wekan/wekan/tree/main/client/components/lists)**:
|
||||
* **[list.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/list.jade)**: `list` is the simple, main template for lists;
|
||||
* **[listBody.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/listBody.jade)**: `listBody`, `addCardForm`, `autocompleteLabelLine` templates;
|
||||
* **[listHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/lists/listHeader.jade)**: `listHeader`, `editListTitleForm`, `listActionPopup`, `boardLists`, `listMorePopup`, `listDeletePopup`, `setWipLimitPopup`, `wipLimitErrorPopup` templates;
|
||||
* **[main](https://github.com/wekan/wekan/tree/main/client/components/main)**:
|
||||
* **[editor.jade](https://github.com/wekan/wekan/tree/main/client/components/main/editor.jade)**: `editor` and `viewer` templates;
|
||||
* **[header.jade](https://github.com/wekan/wekan/tree/main/client/components/main/header.jade)**: `header` and `offlineWarning` templates; if the user is connected we display a small "quick-access" top bar that list all starred boards with a link to go there (this is inspired by the Reddit "subreddit" bar); the first link goes to the boards page;
|
||||
* **[keyboardShortcuts.jade](https://github.com/wekan/wekan/tree/main/client/components/main/keyboardShortcuts.jade)**: `shortcutsHeaderBar`, `shortcutsModalTitle`, `keyboardShortcuts` - all for the shortcuts that are presented when you press `?`re implemented inhere;
|
||||
* **[layouts.jade](https://github.com/wekan/wekan/tree/main/client/components/main/layouts.jade)**: has the template for head portion of the html page and other general purpose templates: `userFormsLayout`, `defaultLayout`, `notFound`, `message`;
|
||||
* **[popup.tpl.jade](https://github.com/wekan/wekan/tree/main/client/components/main/popup.tpl.jade)**: tpl files only define a single template so there's no need to wrap content in a template tag; the name of the template is the base name of the file (`popup` in this case);
|
||||
* **[spinner.tpl.jade](https://github.com/wekan/wekan/tree/main/client/components/main/spinner.tpl.jade)**: is the template for a "waiting" dialog;
|
||||
* **[settings](https://github.com/wekan/wekan/tree/main/client/components/settings)**:
|
||||
* **[informationBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/informationBody.jade)**: `information`, `statistics` templates;
|
||||
* **[invitationCode.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/invitationCode.jade)**: `invitationCode` template;
|
||||
* **[peopleBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/peopleBody.jade)**: `people`, `peopleGeneral`, `peopleRow`, `editUserPopup`;
|
||||
* **[settingBody.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/settingBody.jade)**: `setting`, `general`, `email`, `accountSettings`, `announcementSettings`
|
||||
* **[settingHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/settings/settingHeader.jade)**: `settingHeaderBar` template;
|
||||
* **[sidebar](https://github.com/wekan/wekan/tree/main/client/components/sidebar)**:
|
||||
* **[sidebar.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebar.jade)**: `sidebar`, `homeSidebar`, `membersWidget`, `labelsWidget`, `memberPopup`, `removeMemberPopup`, `leaveBoardPopup`, `addMemberPopup`, `changePermissionsPopup`
|
||||
* **[sidebarArchives.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebarArchives.jade)**: `archivesSidebar`
|
||||
* **[sidebarFilters.jade](https://github.com/wekan/wekan/tree/main/client/components/sidebar/sidebarFilters.jade)**: `filterSidebar`, `multiselectionSidebar`, `disambiguateMultiLabelPopup`, `disambiguateMultiMemberPopup`, `moveSelectionPopup`;
|
||||
* **[users](https://github.com/wekan/wekan/tree/main/client/components/users)**:
|
||||
* **[userAvatar.jade](https://github.com/wekan/wekan/tree/main/client/components/users/userAvatar.jade)**: `userAvatar`, `userAvatarInitials`, `userPopup`, `memberName`, `changeAvatarPopup`, `cardMemberPopup`
|
||||
* **[userHeader.jade](https://github.com/wekan/wekan/tree/main/client/components/users/userHeader.jade)**: `headerUserBar`, `memberMenuPopup`, `editProfilePopup`, `editNotificationPopup`, `changePasswordPopup`, `changeLanguagePopup`, `changeSettingsPopup`;
|
||||
* **[mixins](https://github.com/wekan/wekan/tree/main/client/components/mixins)**: [extends](http://www.meteorpedia.com/read/Infinite_Scrolling) **[infiniteScrolling.js](https://github.com/wekan/wekan/tree/main/client/components/mixins/infiniteScrolling.js)** for card details, sidebar and also extends **[perfectScrollbar.js](https://github.com/wekan/wekan/tree/main/client/components/mixins/perfectScrollbar.js)**;
|
||||
|
||||
## config
|
||||
|
||||
* **[blazeHelpers.js](https://github.com/wekan/wekan/tree/main/client/config/blazeHelpers.js)**: following [Blaze](http://blazejs.org/) helpers are registered here:`currentBoard()`, `currentCard()`, `getUser()` and `concat()`;
|
||||
* **[gecko-fix.js](https://github.com/wekan/wekan/tree/main/client/config/gecko-fix.js)**: removes [deprecated](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch)`watch` and `unwatch` from Firefox prior to version 58;
|
||||
* **[presence.js](https://github.com/wekan/wekan/tree/main/client/config/presence.js)**: custom state function for [Presence](https://github.com/dburles/meteor-presence) that keeps track of current board;
|
||||
* **[reactiveTabs.js](https://github.com/wekan/wekan/tree/main/client/config/reactiveTabs.js)**: [ReactiveTabs](https://github.com/meteortemplates/tabs) are configured to use `basicTabs` template.
|
||||
|
||||
## lib
|
||||
|
||||
* **[accessibility.js](https://github.com/wekan/wekan/tree/main/client/lib/accessibility.js)**: define a set of DOM transformations that are specifically intended for blind screen readers;
|
||||
* **[cssEvents.js](https://github.com/wekan/wekan/tree/main/client/lib/cssEvents.js)**: the `CSSEvents`object has methods that select the name of the event based on the specific transitions and animations;
|
||||
* **[pasteImage.js](https://github.com/wekan/wekan/tree/main/client/lib/pasteImage.js)** and **[dropImage.js](https://github.com/wekan/wekan/tree/main/client/lib/dropImage.js)**: utility for pasting and dropping images on a web app; <span style="color:red">*XXX: add comments; not same style as the rest of the code*</span>
|
||||
* **[emoji-values.js](https://github.com/wekan/wekan/tree/main/client/lib/emoji-values.js)**: sets Emoji.values;
|
||||
* **[escapeActions.js](https://github.com/wekan/wekan/tree/main/client/lib/escapeActions.js)**: defines the behavior (mostly canceling current edit) for escape keyboard key;
|
||||
* **[i18n.js](https://github.com/wekan/wekan/tree/main/client/lib/i18n.js)**: at startup we choose the language for the ui based on user profile or browser language;
|
||||
* **[inlinedform.js](https://github.com/wekan/wekan/tree/main/client/lib/inlinedform.js)**: forms for editing a single field (like adding a card); <span style="color:red">*XXX: comments in code suggest that a form that is not submitted will retain its value to prevent data loss using [unsavedEdits.js](https://github.com/wekan/wekan/tree/main/client/lib/unsavedEdits.js);bug?*</span>; <span style="color:red">*XXX: edit button to save and open*</span>;
|
||||
* **[keyboard.js](https://github.com/wekan/wekan/tree/main/client/lib/keyboard.js)**: the shortcuts that are presented when you press `?`re implemented inhere;
|
||||
* **[mixins.js](https://github.com/wekan/wekan/tree/main/client/lib/mixins.js)**: stub; no `Mixins` at this point; <span style="color:red">*XXX: what does `new class` do? exlint: missing () invoking a constructor*</span>
|
||||
* **[popup.js](https://github.com/wekan/wekan/tree/main/client/lib/popup.js)**: defines `Popup` class for things likes electing a date; <span style="color:red">*XXX: not a Blaze helper?*</span>
|
||||
* **[textComplete.js](https://github.com/wekan/wekan/tree/main/client/lib/textComplete.js)**: extends [jquery-textcomplete](https://yuku-t.com/jquery-textcomplete/) to integrate with the rest of the system (like escape actions, tab and enter key handling); <span style="color:red">*XXX: deprecated?*</span>
|
||||
* **[utils.js](https://github.com/wekan/wekan/tree/main/client/lib/utils.js)**: various methods all over the place (resize, screen size, sort, capitalize, navigate to board and card);
|
||||
* **Blaze helpers**:
|
||||
* **[filter.js](https://github.com/wekan/wekan/tree/main/client/lib/filter.js)**: registers `Filter` [Blaze](http://blazejs.org/) helper to support filtering cards by labels and by members;
|
||||
* **[modal.js](https://github.com/wekan/wekan/tree/main/client/lib/modal.js)**: registers `Modal` [Blaze](http://blazejs.org/) helper to support showing modal windows like the one for archived boards;
|
||||
* **[multiSelection.js](https://github.com/wekan/wekan/tree/main/client/lib/multiSelection.js)**: registers `Modal` [Blaze](http://blazejs.org/) helper to support multiple selection mode;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/client/lib/unsavedEdits.js)**: registers `getUnsavedValue` and `hasUnsavedValue` [Blaze](http://blazejs.org/) helpers to preserve content entered in fields but not saved;
|
||||
|
||||
# Server
|
||||
|
||||
.js files in this directory are not available to the client.
|
||||
|
||||
* **[statistics.js](https://github.com/wekan/wekan/tree/main/server/statistics.js)** implements a Meteor server-only [method](https://guide.meteor.com/methods.html) for general-purpose information such as OS, memory, CPUs, PID of the process and so on.
|
||||
* **[migrations.js](https://github.com/wekan/wekan/tree/main/server/migrations.js)** is where code that update sold databases to new schema is located. Anytime the schema of one of the collection changes in a non-backward compatible way a migration needs to be written in this file.
|
||||
* **[authentication.js](https://github.com/wekan/wekan/tree/main/server/authentication.js)** add the `Authentication`object to Meteor that provides methods for checking access rights.
|
||||
* **[lib/utils.js](https://github.com/wekan/wekan/tree/main/server/lib/utils.js)** defines some checks used by [checklists.js](https://github.com/wekan/wekan/tree/main/models/checklists.js)** model. <span style="color:red">*XXX: these methods are defined in server-only code by are used in models, which are visible by the client (in Checklists.allow)?*</span>
|
||||
* **[notifications](https://github.com/wekan/wekan/tree/main/server/notifications)**
|
||||
* **[notifications.js](https://github.com/wekan/wekan/tree/main/server/notifications/notifications.js)**: defines the `Notifications` object that supports [Activities](models/activities.js) and holds a list of functions to call when its `notify()` method is called along with convenience methods to subscribe, unsubscribe and a way to filter recipients according to user settings for notification;
|
||||
* **[email.js](https://github.com/wekan/wekan/tree/main/server/notifications/email.js)**: makes use of the notification system to send an email to a user;
|
||||
* **[profile.js](https://github.com/wekan/wekan/tree/main/server/notifications/profile.js)**: *stub*; will allow associating notifications with user ids to be consumed by mobile apps;
|
||||
* **[notifications.js](https://github.com/wekan/wekan/tree/main/server/notifications/notifications.js)**: adds the `watch()` Meteor server-only [method](https://guide.meteor.com/methods.html) that may watch boards, lists or cards using [models/watchable.js](https://github.com/wekan/wekan/tree/main/models/watchable.js);
|
||||
* **[outgoing.js](https://github.com/wekan/wekan/tree/main/server/notifications/outgoing.js)**: adds the `outgoingWebhooks()` Meteor server-only [method](https://guide.meteor.com/methods.html) that can call external API <span style="color:red">*XXX: I guess*</span>
|
||||
* **[publications](https://github.com/wekan/wekan/tree/main/server/publications)** defines sets of records that are [published](https://docs.meteor.com/api/pubsub.html#Meteor-publish) by the server and how clients can subscribe to those:
|
||||
* **[accountSettings.js](https://github.com/wekan/wekan/tree/main/server/publications/accountSettings.js)**: [AccountSettings](models/accountSettings.js) collection;
|
||||
* **[activities.js](https://github.com/wekan/wekan/tree/main/server/publications/activities.js)**: [Activities](models/activities.js) collection filtered and paginated;
|
||||
* **[announcements.js](https://github.com/wekan/wekan/tree/main/server/publications/announcements.js)**: [Announcements](models/announcements.js) collection;
|
||||
* **[avatars.js](https://github.com/wekan/wekan/tree/main/server/publications/avatars.js)**: [Avatars](models/avatars.js) collection for current user;
|
||||
* **[boards.js](https://github.com/wekan/wekan/tree/main/server/publications/boards.js)**: [Boards](models/boards.js) collection for current user, archived boards collection and individual board as a [relation](https://atmospherejs.com/cottz/publish-relations);
|
||||
* **[cards.js](https://github.com/wekan/wekan/tree/main/server/publications/cards.js)**: a [Card](https://github.com/wekan/wekan/tree/main/models/cards.js) by its id;
|
||||
* **[fast-render.js](https://github.com/wekan/wekan/tree/main/server/publications/fast-render.js)**: configures [FastRender](https://github.com/kadirahq/fast-render) to use the board data; <span style="color:red">*XXX: FastRender docs say "Make sure you're using Meteor.subscribe and not this.subscribe"*</span>
|
||||
* **[people.js](https://github.com/wekan/wekan/tree/main/server/publications/people.js)**: [Users](models/users.js) collection;
|
||||
* **[settings.js](https://github.com/wekan/wekan/tree/main/server/publications/settings.js)**: [Settings](models/settings.js) collection and, separately, the mail server;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/server/publications/unsavedEdits.js)**: [UnsavedEdits](models/unsavedEdits.js) collection;
|
||||
* **[users.js](https://github.com/wekan/wekan/tree/main/server/publications/users.js)**: provides a "mini-profile" for individual users and a [way](https://docs.meteor.com/api/collections.html#fieldspecifiers) to check if current user is admin.
|
||||
|
||||
# Models
|
||||
|
||||
The files in **[models](https://github.com/wekan/wekan/tree/main/models)** directory mainly define collections; most of them have [aldeed SimpleSchema](https://atmospherejs.com/aldeed/simple-schema) for automatic validation of insert and update of collections. This is also where helpers, mutations, methods, hooks and bootstrap code is to be found. [Server side code](https://docs.meteor.com/api/core.html#Meteor-isServer) also implements json REST API.
|
||||
|
||||
Collections (mostly `Mongo.Collection` except as noted) are defined in:
|
||||
* **[accountSettings.js](https://github.com/wekan/wekan/tree/main/models/accountSettings.js)**;
|
||||
* **[activities.js](https://github.com/wekan/wekan/tree/main/models/activities.js)**: does not have a SimpleSchema;
|
||||
* **[announcements.js](https://github.com/wekan/wekan/tree/main/models/announcements.js)**;
|
||||
* **[attachments.js](https://github.com/wekan/wekan/tree/main/models/attachments.js)**: file-system collection;
|
||||
* **[avatars.js](https://github.com/wekan/wekan/tree/main/models/avatars.js)**: file-system collection;
|
||||
* **[boards.js](https://github.com/wekan/wekan/tree/main/models/boards.js)**;
|
||||
* **[cardComments.js](https://github.com/wekan/wekan/tree/main/models/cardComments.js)**;
|
||||
* **[cards.js](https://github.com/wekan/wekan/tree/main/models/cards.js)**;
|
||||
* **[checklists.js](https://github.com/wekan/wekan/tree/main/models/checklists.js)**;
|
||||
* **[integrations.js](https://github.com/wekan/wekan/tree/main/models/integrations.js)**;
|
||||
* **[invitationCodes.js](https://github.com/wekan/wekan/tree/main/models/invitationCodes.js)**;
|
||||
* **[lists.js](https://github.com/wekan/wekan/tree/main/models/lists.js)**;
|
||||
* **[settings.js](https://github.com/wekan/wekan/tree/main/models/settings.js)**;
|
||||
* **[unsavedEdits.js](https://github.com/wekan/wekan/tree/main/models/unsavedEdits.js)**;
|
||||
* **[users.js](https://github.com/wekan/wekan/tree/main/models/users.js)**: extends the `Meteor.users` collection.
|
||||
|
||||
Other files:
|
||||
* **[watchable.js](https://github.com/wekan/wekan/tree/main/models/watchable.js)**: extends the schema, helpers and mutations of `Boards`, `Lists` and `Cards`.
|
||||
* **[export.js](https://github.com/wekan/wekan/tree/main/models/export.js)**: has some code to support the REST API.
|
||||
* **[import.js](https://github.com/wekan/wekan/tree/main/models/import.js)**: implements `importBoard()` method so that Trello (in **[trelloCreator.js](https://github.com/wekan/wekan/tree/main/models/trelloCreator.js)**) and Wekan (in **[wekanCreator.js](https://github.com/wekan/wekan/tree/main/models/wekanCreator.js)**) boards can be imported. <span style="color:red">*XXX: Solid candidates for a directory of their own.*</span>
|
||||
|
||||
# Tools
|
||||
|
||||
* Git:
|
||||
* **.git**;
|
||||
* **[.gitignore](https://github.com/wekan/wekan/tree/main/.gitignore)**;
|
||||
* Docker:
|
||||
* **[docker-compose.yml](https://github.com/wekan/wekan/tree/main/docker-compose.yml)**: the compose file is a YAML file defining services, networks and volumes;
|
||||
* **[Dockerfile](https://github.com/wekan/wekan/tree/main/Dockerfile)**;
|
||||
* Snap:
|
||||
* **[snapcraft.yaml](https://github.com/wekan/wekan/tree/main/snapcraft.yaml)**: [Snapcraft](https://snapcraft.io/) packages any app for every Linux desktop, server, cloud or device, and deliver updates directly;
|
||||
* **[snap](https://github.com/wekan/wekan/tree/main/snap)**;
|
||||
* **[snap-src](https://github.com/wekan/wekan/tree/main/snap-src)**;
|
||||
* Sandstorm:
|
||||
* **[sandstorm.js](https://github.com/wekan/wekan/tree/main/sandstorm.js)**: [Sandstorm](https://sandstorm.io/) specific code;
|
||||
* **[sandstorm-pkgdef.capnp](https://github.com/wekan/wekan/tree/main/sandstorm-pkgdef.capnp)**: used the meteor-spk tool to generate a sandstorm package;
|
||||
* Node:
|
||||
* **[package.json](https://github.com/wekan/wekan/tree/main/package.json)**;
|
||||
* **node_modules**
|
||||
* **[app.json](https://github.com/wekan/wekan/tree/main/app.json)**: is a manifest format for describing web apps (build requirements, environment variables, addons, and other information);
|
||||
* **[app.env](https://github.com/wekan/wekan/tree/main/app.env)**: environment variables;
|
||||
* Meteor: is a full-stack JavaScript platform for developing modern web and mobile applications.
|
||||
* **[.meteor](https://github.com/wekan/wekan/tree/main/.meteor)**;
|
||||
* Translation:
|
||||
* **[i18n](https://github.com/wekan/wekan/tree/main/i18n)** directory has one .json file for each supported language
|
||||
* **[.tx](https://github.com/wekan/wekan/tree/main/.tx)**: configuration for [Transifex](https://app.transifex.com/wekan/) tool used to manage translation;
|
||||
* Text editors:
|
||||
* **[.vscode](https://github.com/wekan/wekan/tree/main/.vscode)**: [Visual Studio Code Editor](https://code.visualstudio.com/docs/getstarted/settings);
|
||||
* **[.editorconfig](https://github.com/wekan/wekan/tree/main/.editorconfig)**: [EditorConfig](http://EditorConfig.org) provides consistent coding styles between different editors and IDEs;
|
||||
* **[.github](https://github.com/wekan/wekan/tree/main/.github)**: hosts the issues template;
|
||||
* **[.eslintrc.json](https://github.com/wekan/wekan/tree/main/.eslintrc.json)**: [ESLint](https://eslint.org/docs/user-guide/configuring) configuration;
|
||||
* **[.travis.yml](https://github.com/wekan/wekan/tree/main/.travis.yml)**: configuration for [Travis CI](https://travis-ci.org/);
|
||||
* **[scalingo.json](https://github.com/wekan/wekan/tree/main/scalingo.json)**: [Scalingo](https://scalingo.com/) is a deploy solution;
|
||||
* **[fix-download-unicode](https://github.com/wekan/wekan/tree/main/fix-download-unicode)**: `cfs_access-point.txt` from this folder is copied to `bundle/programs/server/packages/cfs_access-point.js` in Docker build and in snapcraft build; this is a monkey patch fix for [downloading files that have unicode in filename](https://github.com/wekan/wekan/issues/784).
|
||||
|
||||
# Info
|
||||
|
||||
* **[meta](https://github.com/wekan/wekan/tree/main/meta)**: binary signatures, project description, icons, screenshots and, oui, a French change-log;
|
||||
* **[CHANGELOG.md](https://github.com/wekan/wekan/tree/main/CHANGELOG.md)**;
|
||||
* **[Contributing.md](https://github.com/wekan/wekan/tree/main/Contributing.md)**;
|
||||
* **[LICENSE](https://github.com/wekan/wekan/tree/main/LICENSE)**;
|
||||
* **[README.md](https://github.com/wekan/wekan/tree/main/README.md)**.
|
||||
|
||||
---
|
||||
|
||||
# Contributions to this page
|
||||
|
||||
This documentation was contributed by [TNick](https://github.com/TNick) and [xet7](https://github.com/xet7) while Wekan was at commit [e2f768c](https://github.com/wekan/wekan/tree/e2f768c6a0f913b7c5f07695dce8cec692037255).
|
||||
Please add new files, fixes, updates, etc directly to this page.
|
||||
@@ -0,0 +1,204 @@
|
||||
## About markdown changes
|
||||
|
||||
Wekan v4.29 changes markdown rendering from [marked](https://github.com/markedjs/marked) to [markdown-it](https://github.com/markdown-it/markdown-it).
|
||||
|
||||
## About emoji
|
||||
|
||||
With markdown-it, also [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) plugin has been added, supporting [full list of GitHub emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.json).
|
||||
|
||||
Example emoji code, that you can add for example to card name, card description etc:
|
||||
```
|
||||
:rainbow: :thumbsup: :100:
|
||||
```
|
||||
That shows emojis :rainbow: :thumbsup: :100:
|
||||
|
||||
## About other markdown-it plugins
|
||||
|
||||
For markdown-it, there are also other [syntax extensions](https://github.com/markdown-it/markdown-it#syntax-extensions) where some are listed at that markdown-it page, and [others at npmjs.com](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
|
||||
|
||||
For example, how to get some [mermaid plugin](https://www.npmjs.com/search?q=markdown-it-mermaid) working so that some syntax works for https://mermaid-js.github.io/mermaid/ ?
|
||||
|
||||
## How you could add another plugin
|
||||
|
||||
Using newest Ubuntu amd64:
|
||||
|
||||
# Meteor 2
|
||||
|
||||
### 1. Install git and configure it
|
||||
```
|
||||
sudo apt -y install git
|
||||
|
||||
git config --global user.name "Yourfirstname Yourlastname"
|
||||
|
||||
git config --global user.email email-address-you-use-at-github@example.com
|
||||
|
||||
git config --global push.default simple
|
||||
|
||||
nano .ssh/config
|
||||
```
|
||||
There add your User (GitHub username) and IdentityFile (Your ssh private key. Not public key that has .pub).
|
||||
For indentation, use one tab.
|
||||
```
|
||||
Host *
|
||||
IdentitiesOnly=yes
|
||||
|
||||
Host github.com
|
||||
Hostname github.com
|
||||
User xet7
|
||||
IdentityFile ~/.ssh/id_xet7ed
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
If you do not have ssh key, create it:
|
||||
```
|
||||
ssh-keygen
|
||||
```
|
||||
And press Enter about 3 times, until you have private key at `~/.ssh/id_rsa` and public key at `~/.ssh/id_rsa.pub`
|
||||
|
||||
Add public key `.pub` to your github account web interface.
|
||||
|
||||
Add path to Meteor:
|
||||
```
|
||||
nano .bashrc
|
||||
```
|
||||
There at bottom add:
|
||||
```
|
||||
export PATH=~/.meteor:$PATH
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
### 2. Create fork of `https://github.com/wekan/wekan` at GitHub web page
|
||||
|
||||
```
|
||||
mkdir repos
|
||||
|
||||
cd repos
|
||||
|
||||
git clone git@github.com:YourGithubUsername/wekan.git
|
||||
|
||||
cd wekan
|
||||
```
|
||||
### 3. Select option 1 to install dependencies, and then Enter.
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
1
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
That does: 1 install dependencies, 2 builds wekan, 3 starts wekan in development mode with command `meteor`, so it can detect if some file changes and try to rebuild automatically and reload webbroser. But, still sometimes, it may need stopping with Ctrl-c and full build with option 2.
|
||||
|
||||
And then [register and login](Adding-users) at http://localhost:4000
|
||||
|
||||
### OPTIONAL, NOT NEEDED: 5. Add new plugin package
|
||||
```
|
||||
meteor npm install markdown-it-something --save
|
||||
```
|
||||
|
||||
Edit file `wekan/packages/markdown/src-integration.js` and add using that new package, using code example from that new plugin page, or similar like emoji plugin was added.
|
||||
|
||||
### 7. Test
|
||||
|
||||
Test does that new plugin syntax work, for example in card title, card description etc on other input fields.
|
||||
|
||||
### 8. If it works, create pull request
|
||||
|
||||
If normal markdown, emoji, and your new added plugin syntax all work, commit your changes:
|
||||
```
|
||||
git add --all
|
||||
|
||||
git commit -m "Added plugin markdown-it-something."
|
||||
|
||||
git push
|
||||
```
|
||||
And then at your GitHub for `https://github.com/YOUR-GITHUB-USERNAME/wekan` click `Create pull request`.
|
||||
|
||||
# Meteor 3
|
||||
|
||||
At 2024-06-26, it looks like from https://nodejs.org/en that Node.js LTS version is 20.15.0 , so change to newest Node.js LTS, delete old Meteor:
|
||||
```
|
||||
sudo n 20.15.0
|
||||
|
||||
sudo npm -g install npm
|
||||
|
||||
cd
|
||||
|
||||
rm -rf .meteor
|
||||
```
|
||||
Check how to install newest Meteor from Meteor 3 PR at https://github.com/meteor/meteor/pull/13163 , for example:
|
||||
```
|
||||
npx meteor@rc
|
||||
```
|
||||
Check what branches there are:
|
||||
```
|
||||
cd repos/wekan
|
||||
|
||||
git branch -a
|
||||
```
|
||||
Change to Meteor 3 branch:
|
||||
```
|
||||
git checkout feature-meteor3
|
||||
```
|
||||
Build wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
```
|
||||
If there are errors, try to fix them.
|
||||
|
||||
Or try to run wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
# Updating
|
||||
|
||||
There are usually updates both for npm packages and Meteor
|
||||
|
||||
Updating npm packages:
|
||||
```
|
||||
npm update
|
||||
```
|
||||
Checking for vulnerable packages:
|
||||
```
|
||||
npm audit
|
||||
```
|
||||
Fixing vulnerable npm packages by updating to newer packages:
|
||||
```
|
||||
npm audit fix
|
||||
```
|
||||
If that did not help, use force:
|
||||
```
|
||||
npm audit fix --force
|
||||
```
|
||||
If that did not help, read links from that `npm audit` command did show, remove deprecated dependencies, update to other maintained dependencies.
|
||||
|
||||
Updating to next Meteor release:
|
||||
```
|
||||
meteor update
|
||||
```
|
||||
Updating to specific Meteor release:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4
|
||||
```
|
||||
Trying to update all Meteor packages:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages
|
||||
```
|
||||
Allowing incompatible updates, that may sometime work:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages --allow-incompatible-update
|
||||
```
|
||||
If you are changing Meteor and Node.js versions, you may need to reset Meteor:
|
||||
```
|
||||
meteor reset
|
||||
```
|
||||
Or alternatively, delete wekan repo (if you did not need any changes you made), and clone wekan repo again, and then build etc.
|
||||
@@ -0,0 +1,13 @@
|
||||
- Read [Wekan new release ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
- [Install Meteor.js](https://www.meteor.com/install). Note: Windows install is very slow, please use other option at [Windows wiki page](Windows)
|
||||
- Download newest bundle from https://releases.wekan.team
|
||||
- Unarchive bundle .tar.gz file: `tar -zxvf wekan-VERSION.tar.gz`
|
||||
- `cd bundle`
|
||||
- `meteor`
|
||||
- Browse with webbrowser like Firefox to http://localhost:3000
|
||||
|
||||
[Wekan for Meteor.js bundle bug reports and feature requests](https://github.com/wekan/wekan/issues)
|
||||
|
||||
[Build Meteor bundle from source](Source)
|
||||
|
||||
[Install from source without root](Install-from-source-without-root)
|
||||
@@ -0,0 +1,18 @@
|
||||
## Upgrading Meteor
|
||||
|
||||
- Disclaimer:
|
||||
- These are opinions about upgrading, from xet7, maintainer of WeKan Open Source kanban https://wekan.github.io
|
||||
- xet7 thinks, that it is good to keep using current frontend and backend frameworks, upgrade them when possible. If there is any problems, ask at https://forums.meteor.com
|
||||
- xet7 thinks, that upgrading to newest Meteor 2 and Meteor 3 is being made more easier all the time, when new dependencies become available, any bugs are fixed, etc. So it is good to make all possible upgrading steps available.
|
||||
- Upgrade to newest 2.14 https://guide.meteor.com/2.14-migration . Currently xet7 is using newest 2.14.1-beta.0 in production release of WeKan https://forums.meteor.com/t/meteor-v2-14-1-beta-0-is-out/61142
|
||||
- Prepare for 3.0 https://guide.meteor.com/3.0-migration
|
||||
- Migrate Async
|
||||
- Helper tool https://forums.meteor.com/t/blaze-async-migration-helper-babel-plugin-tracker-async-enhance-for-the-client-side-released/60842
|
||||
- https://guide.meteor.com/prepare-meteor-3.0
|
||||
- Look at progress of migrated packages https://forums.meteor.com/t/looking-for-help-migrating-packages-to-meteor-3-0/60985
|
||||
- Add Eslint 3 and fix anything found
|
||||
- https://youtu.be/rFjNNNc_7-E
|
||||
- https://github.com/quavedev/eslint-plugin
|
||||
- https://github.com/quavedev/meteor-template/pull/8
|
||||
- Watch Meteor Dispatches etc Podcasts https://www.youtube.com/@meteorjscommunity/playlists
|
||||
- Some recent also had info, how to make dependencies compatible with both Meteor 2 and Meteor 3
|
||||
@@ -0,0 +1,75 @@
|
||||
|
||||
|
||||
## 1. What is Monkey Proof Software?
|
||||
|
||||
Someone told xet7, that WeKan is Monkey Proof Software. Jira is not Monkey Proof Software. Here we are exploring what it means.
|
||||
|
||||
## 2. Proofing
|
||||
|
||||
a) Monkey Proof testing of laptop https://www.youtube.com/watch?v=QxCV0bZGE00 . There are also some info at Internet how to make sure monkeys do not mess up apartments, trashcans etc.
|
||||
|
||||
b) https://en.wikipedia.org/wiki/Proofing
|
||||
|
||||
> Proofing may refer to:
|
||||
>
|
||||
> - [Proofing (armour)](https://en.wikipedia.org/wiki/Proofing_(armour)), the testing of armour for its defensive ability
|
||||
> - [Proofing (baking technique)](https://en.wikipedia.org/wiki/Proofing_(baking_technique)), a rest period during the fermentation of bread dough
|
||||
> - [Proofing (prepress)](https://en.wikipedia.org/wiki/Prepress_proofing), a concept in print production
|
||||
> - [Proof testing](https://en.wikipedia.org/wiki/Proof_test), a form of stress test to demonstrate the fitness of a load-bearing structure
|
||||
|
||||
c) https://nl.wikipedia.org/wiki/Foolproof mentions "De Engelse termen foolproof, idiot proof, monkey proof"
|
||||
|
||||
d) https://en.wikipedia.org/wiki/Idiot-proof
|
||||
|
||||
> In modern [English](https://en.wikipedia.org/wiki/English_language) usage, the informal term idiot-proof or foolproof describes designs that cannot be misused either inherently, or by use of [defensive design](https://en.wikipedia.org/wiki/Defensive_design) principles. The implication is that the design is usable even by someone of low intelligence who would not use it properly.
|
||||
|
||||
## 3. Defensive design
|
||||
|
||||
Mentioned at https://en.wikipedia.org/wiki/Defensive_design
|
||||
|
||||
> Defensive design is the practice of planning for [contingencies](https://en.wikipedia.org/wiki/Contingency_plan) in the [design](https://en.wikipedia.org/wiki/Design) stage of a project or undertaking. Essentially, it is the practice of anticipating all possible ways that an end-user could misuse a device, and designing the device so as to make such misuse impossible, or to minimize the negative consequences. For example, if it is important that a plug is inserted into a socket in a particular orientation, the socket and plug should be designed so that it is physically impossible to insert the plug incorrectly. Power sockets are often keyed in such a manner, to prevent the transposition of live and neutral. They are also recessed in the wall in a way that makes it impossible to touch connectors once they become live.
|
||||
|
||||
## 4. Defensive Design in Computer software
|
||||
|
||||
> Defensive design in [software engineering](https://en.wikipedia.org/wiki/Software_engineering) is called [defensive programming](https://en.wikipedia.org/wiki/Defensive_programming). [Murphy's law](https://en.wikipedia.org/wiki/Murphy%27s_law) is a well-known statement of the need for defensive design, and also of its ultimate limitations.
|
||||
>
|
||||
> [Software design](https://en.wikipedia.org/wiki/Software_design) entails many ways so that software can be designed to operate more safely.
|
||||
>
|
||||
> - Data entry screens can "sanitize" inputs, e.g. numeric fields contain only digits, signs and a single decimal point if appropriate.
|
||||
>
|
||||
> - Inputs can be sanity checked for legitimate values, e.g. for counts of workplace injuries (or number of people injured) the number can be 0 but can't be negative and must be a whole number; for number of hours worked in one week the amount for any specified employee can be 0, can be fractional, but can't be negative and can't be greater than 168, nor more than 24 times the number of days they were in attendance.
|
||||
>
|
||||
> - A word processor requested to load a saved document should scan it to ensure it is in good form and not corrupted. If it is corrupted, the program should say so, then either accept the partial document that was valid, or refuse the entire document. In either case it should remain running and not quit.
|
||||
|
||||
## 6. Monkey Testing
|
||||
|
||||
https://en.wikipedia.org/wiki/Monkey_testing
|
||||
|
||||
## 7. Why Custom CSS/Javascript is not Monkey Proof
|
||||
|
||||
@xet7 wrote at https://github.com/wekan/wekan/issues/4167#issuecomment-1151557772 to this comment
|
||||
|
||||
> Wekan functions better on pretty much all fronts except for customization options given that one can directly change kanboard CSS to fit their needs.
|
||||
|
||||
From @xet7
|
||||
|
||||
Custom CSS and Javascript is very dangerous: https://github.com/wekan/wekan/issues/3086#issuecomment-627615017
|
||||
|
||||
> I had to previously find a way [how to fix Custom Javascript in RocketChat](https://forums.rocket.chat/t/big-issue-with-custom-javascript/261/4?u=xet7) because it broke my RocketChat install.
|
||||
>
|
||||
> Also, previously I had to [fix XSS bug](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v385-2020-03-23-wekan-release) because adding Javascript to input fields did run that Javascript code.
|
||||
>
|
||||
> I'll try to find is there a safe way to do this.
|
||||
|
||||
Correct solution is to add setting like here https://github.com/wekan/wekan/issues/4558
|
||||
|
||||
WeKan target group is those that call WeKan "Monkey Proof Software", so that WeKan is easy to figure out, user friendly, polished enough. Jira is not "Monkey Proof Software".
|
||||
|
||||
If someone is asking for "Custom CSS", that means they are programmers, and should be sending PRs to WeKan with fixes to UI, new settings, etc, so that WeKan works safely without "Custom CSS", for normal non-programmer people.
|
||||
|
||||
## 6. Towards more Monkey Proof Software
|
||||
|
||||
In Progress:
|
||||
- Optimizing speed
|
||||
- Minimize frontend and backend code
|
||||
- Fixing bugs
|
||||
@@ -0,0 +1,144 @@
|
||||
## Testers to ping with new Wekan Edge release
|
||||
- All those whose issues were fixed [at ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
- @saschafoerster
|
||||
|
||||
Those should reply to new issue that has name `Test Edge Wekan (version-number-here)` at https://github.com/wekan/wekan/issues .
|
||||
|
||||
## Why test?
|
||||
|
||||
https://github.com/wekan/wekan/issues/2811
|
||||
|
||||
## Who should test
|
||||
- If you are the person in your company that gets yelled at when something breaks in new version of Wekan.
|
||||
- If you think xet7 releasing new version of Wekan every day directly to stable production Snap channel is in any way risky.
|
||||
|
||||
## What usually happens when Wekan gets broken
|
||||
|
||||
1. There is many new issues about some same new feature or bug. Yes, also when some notices new feature that is already [at ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md), they add issue about it, usually asking "Can this feature be turned off or made optional?". This is usually if new feature changes some old workflow radically.
|
||||
2. Many do tag @xet7 that are you aware of the issue.
|
||||
3. Someone yells at IRC that "this is too much, it's time to fork Wekan". Well, that's because he gets yelled at by all users of Wekan at his company.
|
||||
4. xet7 does not have time to answer those, he just fixes the issue - usually at the same day, makes new release, closes all related issues with last comment "Please try Wekan (version-number-here)".
|
||||
5. There is [only one comment](https://github.com/wekan/wekan/issues/2812#issuecomment-555860032) that says "This resolved things for me. Thanks for such a quick fix. This is an invaluable piece of software for me!"
|
||||
6. xet7 thinks this is great normal development day: Got some features added, got some bugs fixes, and happily goes to sleep well. This is because above 1-5 has happened many times before, it's just normal.
|
||||
|
||||
## ChangeLog
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
|
||||
## Backup before testing. And backup daily in production.
|
||||
|
||||
Why? Well, Wekan has no undo yet. If you delete Swimlane/List/Card, it's gone.
|
||||
That's why it's harder to reach in submenu. It's better to Arhive those,
|
||||
and unarchive.
|
||||
|
||||
https://github.com/wekan/wekan/wiki/Backup
|
||||
|
||||
You could test at other computer than your production.
|
||||
|
||||
## Snap
|
||||
|
||||
Snap has automatic update, or you can update manually:
|
||||
```
|
||||
sudo snap refresh
|
||||
```
|
||||
You see at https://snapcraft.io/wekan what are current versions.
|
||||
|
||||
To change to Edge:
|
||||
```
|
||||
sudo snap refresh wekan --edge --amend
|
||||
```
|
||||
And back to stable:
|
||||
```
|
||||
sudo snap refresh wekan --stable --amend
|
||||
```
|
||||
|
||||
## Docker
|
||||
|
||||
`docker-compose.yml` is at https://github.com/wekan/wekan .
|
||||
|
||||
### Latest development version from master branch
|
||||
|
||||
Quay:
|
||||
```
|
||||
image: quay.io/wekan/wekan
|
||||
```
|
||||
Docker Hub:
|
||||
```
|
||||
image: wekanteam/wekan
|
||||
```
|
||||
|
||||
### Example of using release tags
|
||||
|
||||
[Quay tags](https://quay.io/repository/wekan/wekan?tag=latest&tab=tags):
|
||||
```
|
||||
image: quay.io/wekan/wekan:v3.55
|
||||
```
|
||||
[Docker Hub tags](https://hub.docker.com/r/wekanteam/wekan/tags):
|
||||
```
|
||||
image: wekanteam/wekan:v3.55
|
||||
```
|
||||
|
||||
### How to change Docker version
|
||||
|
||||
1) Backup first
|
||||
https://github.com/wekan/wekan/wiki/Backup
|
||||
|
||||
```
|
||||
docker-compose stop
|
||||
docker rm wekan-app
|
||||
```
|
||||
2) Change version tag. Then:
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Build Docker version from source
|
||||
|
||||
At docker-compose.yml is these lines:
|
||||
|
||||
```
|
||||
#-------------------------------------------------------------------------------------
|
||||
# ==== BUILD wekan-app DOCKER CONTAINER FROM SOURCE, if you uncomment these ====
|
||||
# ==== and use commands: docker-compose up -d --build
|
||||
#build:
|
||||
# context: .
|
||||
# dockerfile: Dockerfile
|
||||
# args:
|
||||
# - NODE_VERSION=${NODE_VERSION}
|
||||
# - METEOR_RELEASE=${METEOR_RELEASE}
|
||||
# - NPM_VERSION=${NPM_VERSION}
|
||||
# - ARCHITECTURE=${ARCHITECTURE}
|
||||
# - SRC_PATH=${SRC_PATH}
|
||||
# - METEOR_EDGE=${METEOR_EDGE}
|
||||
# - USE_EDGE=${USE_EDGE}
|
||||
#-------------------------------------------------------------------------------------
|
||||
```
|
||||
Uncomment from those this way:
|
||||
```
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- NODE_VERSION=${NODE_VERSION}
|
||||
- METEOR_RELEASE=${METEOR_RELEASE}
|
||||
- NPM_VERSION=${NPM_VERSION}
|
||||
- ARCHITECTURE=${ARCHITECTURE}
|
||||
- SRC_PATH=${SRC_PATH}
|
||||
- METEOR_EDGE=${METEOR_EDGE}
|
||||
- USE_EDGE=${USE_EDGE}
|
||||
```
|
||||
Then start Wekan to http://localhost this way:
|
||||
```
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
## Sandstorm
|
||||
|
||||
1) Install local development version of Sandstorm to your laptop from https://sandstorm.io/install
|
||||
|
||||
2) Download and install experimental version to your local Sandstorm:
|
||||
https://github.com/wekan/wekan/wiki/Sandstorm
|
||||
Local sandstorm is at http://local.sandstorm.io:6080/ .
|
||||
|
||||
3) Download your production Wekan grain .zip file with down arrow button. Upload to your dev local Sandstorm.
|
||||
Try does it work.
|
||||
@@ -0,0 +1,329 @@
|
||||
## Prototype Strategy
|
||||
|
||||
- Try building many prototypes, see what works
|
||||
- https://en.wiktionary.org/wiki/throw_things_at_the_wall_and_see_what_sticks
|
||||
|
||||
## Future
|
||||
|
||||
- Will this happen? With what tech? See https://github.com/wekan/wekan/blob/main/FUTURE.md
|
||||
- You can comment at https://github.com/wekan/wekan/issues/4578
|
||||
- You can help by sending PR to any prototype repo mentioned below
|
||||
|
||||
## Wishes to all web frameworks
|
||||
|
||||
- Documentation about how to upgrade, all required steps. Or alternatively, a script that does changes required to upgrade.
|
||||
- Using parts of frameworks as separate packages, like:
|
||||
- Authentication, like OAuth2, Gmail, etc
|
||||
- Option to not use websockets, because at some corporate networks do not allow them.
|
||||
- Option to not have Javascript at frontend, having SSR only. Working with and without Javascript at frontend, like ufront did.
|
||||
- https://github.com/ufront/ufront
|
||||
- https://jasono.co/2020/10/03/im-going-to-write-a-web-app-framework-again-maybe-well-see/
|
||||
- Please do not discontinue HTML (no Javascript) version https://news.ycombinator.com/item?id=37558372
|
||||
- Storing session to database, for round robin
|
||||
- https://github.com/wekan/wekan/issues/5120
|
||||
- https://stackoverflow.com/questions/65547266/how-to-store-my-session-mysql-with-express-mysql-session
|
||||
- Not having build step:
|
||||
- Keep all files at directories they currently are, with understandable directory structure naming, like:
|
||||
- Feature name
|
||||
- Feature part name 1
|
||||
- Feature part name 2
|
||||
- Only use file from it's location on page where it is needed
|
||||
- Cache dependencies. Make possible coding offline.
|
||||
- Do not uglify
|
||||
- https://world.hey.com/dhh/you-can-t-get-faster-than-no-build-7a44131c
|
||||
- Rails World Opening Keynote by DHH
|
||||
- https://www.youtube.com/watch?v=iqXjGiQ_D-A
|
||||
- https://news.ycombinator.com/item?id=37843951
|
||||
- https://news.ycombinator.com/item?id=37897921
|
||||
- I merged all branches to one main branch, because merging between branches did take a lot of time.
|
||||
- Do not use linters like eslint and prettier. What I did, is I removed all linters, like eslint, prettier etc, because they did disagree about syntax. Point is to make to code minimal change, that fixes something, or adds some feature. Not that most commits would be about fixing syntax.
|
||||
- https://matt-rickard.com/why-is-the-frontend-stack-so-complicated
|
||||
- https://news.ycombinator.com/item?id=37895164
|
||||
- https://deno.com/blog/node-config-hell
|
||||
- How to not become slow and unresponsive after a week https://github.com/wekan/wekan/issues/5140
|
||||
- Run code like CGI, release all memory
|
||||
- Looking for most cross-platform web frameworks, supporting many different CPU, OS and database.
|
||||
- Both On-Premise AND MultiCloud possible
|
||||
- https://github.com/serverless/multicloud
|
||||
- https://github.com/xet7/multicloud
|
||||
- License: MIT and other https://copyfree.org
|
||||
|
||||
## List of realtime web frameworks
|
||||
|
||||
- Meteor
|
||||
- https://www.meteor.com
|
||||
- https://github.com/meteor/meteor
|
||||
- Helene
|
||||
- Forum Post https://forums.meteor.com/t/helene-a-lightweight-real-time-web-framework-for-node-js-and-bun/60626
|
||||
- Repo https://github.com/leonardoventurini/helene
|
||||
- Discussions https://github.com/leonardoventurini/helene/discussions
|
||||
- NPM package https://www.npmjs.com/package/helene
|
||||
- Discord https://discord.com/invite/PbY36PU75C
|
||||
- Any others?
|
||||
|
||||
## Screenshot
|
||||
|
||||
Supporting many more webbrowsers:
|
||||
|
||||
<img src="https://wekan.github.io/manybrowser.png" width="100%" alt="Multiverse WeKan screenshot" />
|
||||
|
||||
## Talks
|
||||
|
||||
- Maintainer of WeKan since December 2016, xet7 (Lauri Ojansivu), about WeKan Multiverse at EU NGI Dapsi https://www.youtube.com/watch?v=BPPjiZHVeyM
|
||||
- https://dapsi.ngi.eu/20-new-solutions-to-bring-the-power-of-data-back-to-peoples-hands/
|
||||
- https://dapsi.ngi.eu/hall-of-fame/multiverse/
|
||||
- WeKan Open Source kanban: add multiple Import/Export/Sync options and UI Designer, making it possible to create any app.
|
||||
|
||||
## Roadmap
|
||||
|
||||
From https://github.com/wekan/wekan/issues/4578#issuecomment-1407769397
|
||||
|
||||
## Standards
|
||||
|
||||
- Web Sustainability Guidelines (WSG) 1.0 at a Glance
|
||||
- https://w3c.github.io/sustyweb/glance.html
|
||||
- Minimize size, support all devices https://w3c.github.io/sustyweb/#benefits-90
|
||||
- Other standards? https://news.ycombinator.com/item?id=36675451
|
||||
|
||||
## Browsers developed for therapy reasons
|
||||
|
||||
Are you fed up? Need some therapy? Write a webbrowser!
|
||||
|
||||
- Gosub
|
||||
- https://adayinthelifeof.nl/2023/09/22/browsers.html
|
||||
- Repo https://github.com/jaytaph/gosub-browser
|
||||
- https://codemusings.nl/@jaytaph/p/MQpHToAx8c1KXyU98Auip4
|
||||
- https://news.ycombinator.com/item?id=37608580
|
||||
- Ladybird
|
||||
- https://www.ladybird.dev
|
||||
- Repo https://github.com/SerenityOS/serenity/tree/master/Ladybird
|
||||
|
||||
## Browsers that have Javascript
|
||||
|
||||
- Use Javascript to add drag-drop etc Javascript features, and hide UI elements like buttons etc that are for non-Javascript
|
||||
|
||||
## Browsers without using Websockets
|
||||
|
||||
- Maybe with long poll. Or no live update, require webpage reload.
|
||||
- For internal corporate networks where websockets are not allowed
|
||||
|
||||
## Browsers that do not support Javascript
|
||||
|
||||
or have Javascript disabled for security reasons.
|
||||
|
||||
- Netsurf https://www.netsurf-browser.org/downloads/ , Development Builds https://ci.netsurf-browser.org/builds/
|
||||
- RISC OS https://www.riscosopen.org/content/downloads , https://www.riscosdev.com/direct/
|
||||
- ReactOS https://reactos.org , https://github.com/howinfo/howinfo/wiki/ReactOS
|
||||
- Redox OS https://www.redox-os.org
|
||||
- Haiku, Linux, Windows, Amiga, Atari etc
|
||||
- Amiga: AWeb, iBrowse
|
||||
- Dillo Webbrowser at FreeDOS https://github.com/wekan/wekan/issues/4578#issuecomment-1248525591
|
||||
- Netscape, IE, etc all browsers at all OS/CPU
|
||||
- FreeDOS: Dillo, Arachne
|
||||
- Text based browsers: Lynx, Links, w3m (sudo apt-get install w3m w3m-img)
|
||||
- Ancient browsers:
|
||||
- http://9p.sdf.org/who/tweedy/ancient_browsers/
|
||||
- https://news.ycombinator.com/item?id=34981257
|
||||
|
||||
## Browsers that are programmable
|
||||
|
||||
- Nyxt
|
||||
- https://github.com/atlas-engineer/nyxt
|
||||
|
||||
## Support more databases
|
||||
|
||||
- SQLite
|
||||
- PostgreSQL
|
||||
- Migrations between databases
|
||||
- Using many databases at the same time
|
||||
- Offline or Local-First
|
||||
- https://news.ycombinator.com/item?id=37584049
|
||||
- https://news.ycombinator.com/item?id=37488034
|
||||
|
||||
## Graphics
|
||||
|
||||
- Raphael JS, supports also many legacy browsers, with VML and SVG graphics https://dmitrybaranovskiy.github.io/raphael/
|
||||
- Related forked repos for various graphics at https://github.com/raphaeljsorg
|
||||
- Or alternatively, just use HTML4, images, imagemaps etc to be compatible to non-Javascript browsers
|
||||
|
||||
## Programming language alternatives
|
||||
|
||||
- Optionally, use some transpiler:
|
||||
- https://en.wikipedia.org/wiki/Source-to-source_compiler
|
||||
- Haxe https://haxe.org , with HaxeUI [GUI/WebUI](http://haxeui.org/) and [TUI](https://github.com/haxeui/haxeui-pdcurses)
|
||||
- Wax https://github.com/xet7/wax
|
||||
- Nim https://nim-lang.org
|
||||
- V https://vlang.io
|
||||
- Maybe transpiling UI to/from HaxeUI XML, HTML4, HTML5, Gopher, Gemini, Lazarus, Gambas, Godot, MUI/ZUI Amiga/AROS
|
||||
|
||||
- Cross-platform:
|
||||
- C89 code for 30+ OS/CPU like at https://github.com/xet7/darkesthour
|
||||
- Pascal code with TRSE https://lemonspawn.com/turbo-rascal-syntax-error-expected-but-begin/
|
||||
- Embedded webserver, for example:
|
||||
- C https://github.com/wekan/hx/blob/main/prototypes/code/webserver/works/c/server.c
|
||||
- Sandstorm https://sandstorm.io , https://github.com/sandstorm-io/sandstorm
|
||||
- Rust https://github.com/dwrensha/sandstorm-rawapi-example-rust
|
||||
- C++ https://github.com/dwrensha/sandstorm-rawapi-example
|
||||
- Try to avoid strange NPM packages
|
||||
- https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-6/
|
||||
|
||||
## Benchmarks
|
||||
|
||||
- For selecting programming language:
|
||||
- https://github.com/wekan/hx/tree/main/prototypes/code/webserver
|
||||
- https://forums.meteor.com/t/performance-tests-between-meteor-3-meteor-2-help-on-format/60458
|
||||
- https://www.techempower.com/benchmarks/
|
||||
- https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks
|
||||
|
||||
## Screenshot of Multiverse WeKan at FreeDOS Dillo
|
||||
|
||||

|
||||
|
||||
## Screenshot of Multiverse WeKan at Netsurf
|
||||
|
||||
### Group and count by first character of board names
|
||||
|
||||
From https://github.com/wekan/wekan/issues/4578#issuecomment-1250143726
|
||||
|
||||
When there is a lot of boards, it is very useful to group by first character of board (and after that click charater to see list of boards for that character, to be added later). I could not figure out how to do it with MongoDB aggregate query. Here is how I did it with SQLite, for type board. SQLite returns results immediately. Note that emojis, UTF-8 shows also on Netsurf browser. TODO is to figure out, could I get these visible also in FreeDOS Dillo browser.
|
||||
```
|
||||
SELECT _id, substr(title,1,1), COUNT(*), type from boards
|
||||
WHERE type=:type GROUP BY substr(title,1,1) ORDER BY substr(title,1,1) ASC;
|
||||
```
|
||||
Actually, somewhere I saved answer from ChatGPT or Bing AI search, what this SQL query using MongoDB Javascript syntax. So maybe I should ask again.
|
||||
|
||||
https://github.com/wekan/php/blob/main/page/allboardschar.php
|
||||
|
||||

|
||||
|
||||
## Prototypes
|
||||
|
||||
### Redbean
|
||||
|
||||
- Currently xet7 actively working with this prototype: https://github.com/wekan/wekanstudio
|
||||
- https://redbean.dev
|
||||
- Minimal kanban board drag drop example
|
||||
- Repo https://github.com/wekan/hx/tree/main/prototypes/code/webserver/works/fullmoon
|
||||
- Redbean amd64 binary works at Win/Mac/Linux/BSD/BIOS without any modifications, because it is based on Cosmopolitan https://github.com/jart/cosmopolitan
|
||||
- Uses HTMX https://htmx.org at UI
|
||||
- Saves to SQLite database
|
||||
- Petclinic fork, using Blink to run at s390x https://github.com/wekan/wekan/wiki/s390x#petclinic-s390x
|
||||
|
||||
### PHP
|
||||
|
||||
- Repo https://github.com/wekan/php
|
||||
- Features:
|
||||
- Some webpages compatible with all browsers
|
||||
- SQLite list all boards with first character, show board with some data
|
||||
- MongoDB test for newer MongoDB
|
||||
- upload file(s) with drag-drop, for upcoming feature https://github.com/wekan/wekan/issues/2936
|
||||
- RTL https://github.com/wekan/wekan/issues/3376#issuecomment-1243922087
|
||||
- Not yet: Login, Move card
|
||||
|
||||
### Gambas
|
||||
|
||||
- Repo https://github.com/wekan/hx/tree/main/prototypes/ui/gambas
|
||||
- Features: Login, dropdown menu structure, SQLite database
|
||||
- Not yet: Show board
|
||||
- Problems: Gambas login page etc requires Javascript, does not work in Netsurf
|
||||
|
||||
### Meteor SSR
|
||||
|
||||
- https://github.com/wekan/we
|
||||
- Features:
|
||||
- Only serverside rendering. Javascript removed removed from frontend.
|
||||
- Only test webpage. No actual features.
|
||||
|
||||
### Node.js 20, Bun and Deno
|
||||
- Repo https://github.com/wekan/wekan-node20
|
||||
- Features:
|
||||
- main.js makes database queries to many databases
|
||||
- Database drivers:
|
||||
- MongoDB driver for Legacy MongoDB 3.2.x, using MongoDB from `sudo snap install wekan`
|
||||
- MongoDB driver for newest MongoDB included, using MongoDB 6.x from rebuild-wekan.sh from https://github.com/wekan/wekan
|
||||
- FerretDB proxy to PostgreSQL, from docker-compose.yml
|
||||
- FerretDB proxy to SQLite, from docker-compose.yml
|
||||
- Bun size is about 93 MB
|
||||
- Deno size is usually about 350 MB https://github.com/wekan/wekan-node20/releases , but from source built Linux arm64 is 1.1 GB because of some bug somewhere.
|
||||
- Deno also includes Node.js as Deno's Node.js compatibility layer.
|
||||
- Node.js supports many CPU/OS
|
||||
- Node.js is used in production and has traceability. https://changelog.com/jsparty/294
|
||||
- https://github.com/wekan/wekan/wiki/s390x
|
||||
- https://nodejs.org/dist/latest-v20.x/
|
||||
- https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4
|
||||
|
||||
### Haxe
|
||||
|
||||
- https://haxe.org
|
||||
- Hello world example
|
||||
- Repo https://github.com/wekan/hx/blob/main/prototypes/code/hello
|
||||
- Transpiled with Haxe to many programming languages
|
||||
- Tinkweb
|
||||
- Repo https://github.com/wekan/hx/tree/main/prototypes/ui/tinkweb
|
||||
- Has router and webpage
|
||||
- Transpiles to PHP and Node.js
|
||||
|
||||
### FreePascal
|
||||
|
||||
- Repo https://github.com/wekan/hx/tree/main/prototypes/code/webserver/works/freepascal-router
|
||||
- Router and some webpage
|
||||
- Works at many retro and modern OS, but not at s390x that FreePascal does not support yet https://wiki.freepascal.org/ZSeries
|
||||
|
||||
### FreeDOS and Bash
|
||||
|
||||
- Repo https://github.com/wekan/wedos
|
||||
- Features:
|
||||
- DOS: .bat script, that shows menu, and uses SQLite DOS version to make queries to WeKan SQLite database
|
||||
- Bash: .sh script, that shows menu, and uses SQLite CLI to make queris to WeKan SQLite database
|
||||
|
||||
### Minio
|
||||
|
||||
- Repo: https://github.com/wekan/minio-metadata
|
||||
- Features:
|
||||
- Uses Bash script and CLI binaries to migerate text data and attachments from MongoDB to SQLite and Minio
|
||||
- There is Node.js, Go etc drivers for using Minio
|
||||
|
||||
### CloudFlare Workers
|
||||
|
||||
- Developing
|
||||
- https://developers.cloudflare.com/pages/framework-guides/
|
||||
- https://developers.cloudflare.com/pages/
|
||||
- https://developers.cloudflare.com/workers/
|
||||
- https://developers.cloudflare.com/pages/platform/language-support-and-tools/
|
||||
- https://miniflare.dev
|
||||
- https://blog.cloudflare.com/workers-playground/
|
||||
- D1 SQLite
|
||||
- https://developers.cloudflare.com/d1/platform/community-projects/#d1-adapter-for-kysely-orm
|
||||
- https://blog.cloudflare.com/d1-open-beta-is-here/
|
||||
- https://blog.cloudflare.com/introducing-d1/
|
||||
- https://www.cloudflare.com/developer-platform/d1/
|
||||
- https://blog.cloudflare.com/hyperdrive-making-regional-databases-feel-distributed/
|
||||
- Northwind Traders example
|
||||
- https://northwind.d1sql.com
|
||||
- https://github.com/cloudflare/d1-northwind
|
||||
- https://github.com/xet7/d1-northwind
|
||||
- Kysely Query builder for D1 SQLite database
|
||||
- https://codedamn.com/news/product/dont-use-prisma
|
||||
- https://news.ycombinator.com/item?id=37804072
|
||||
- https://kysely.dev
|
||||
- https://github.com/kysely-org/kysely
|
||||
- https://www.npmjs.com/package/kysely
|
||||
- Awesome Kysely https://github.com/kysely-org/awesome-kysely
|
||||
- Older database examples: https://github.com/cloudflare/db-connect
|
||||
- Hono
|
||||
- https://blog.yusu.ke/hono-htmx-cloudflare/
|
||||
- https://news.ycombinator.com/item?id=37165054
|
||||
- https://github.com/yusukebe/hono-htmx
|
||||
- https://github.com/xet7/hono-htmx
|
||||
- https://developers.cloudflare.com/pages/framework-guides/
|
||||
- WebGPU
|
||||
- https://blog.cloudflare.com/webgpu-in-workers/
|
||||
- https://news.ycombinator.com/item?id=37673999
|
||||
- CloudFlare TV https://cloudflare.tv
|
||||
- CloudFlare https://cloudflare.com
|
||||
- TODO example with KV https://github.com/wekan/cloudflare-workers-todos
|
||||
|
||||
### Swap microframework, vs HTMX
|
||||
|
||||
- https://github.com/josephernest/Swap
|
||||
- https://news.ycombinator.com/item?id=35991783
|
||||
@@ -0,0 +1,41 @@
|
||||
## Roles
|
||||
|
||||
It depends on role of user what drag drop is allowed https://github.com/wekan/wekan/wiki/REST-API-Role
|
||||
|
||||
## Mobile Drag Drop
|
||||
|
||||
1. Click `Drag Handle Enabled/Disabled` button to enable drag handles
|
||||
|
||||
2. Use drag handles to move Board Icons, Swimlanes, MiniCards, Lists, Checklists, Checklist Items.
|
||||
|
||||
3. Use non-drag-handle area to to view other parts of board, by dragging board up/down/left/right, without moving any icons etc.
|
||||
|
||||
<img src="https://wekan.github.io/dragdrop/mobile-drag-drop.png" width="40%" alt="Wekan logo" />
|
||||
|
||||
## 2 or more external screens of desktop or mobile
|
||||
|
||||
For each screen, you can enable or disable drag handles, because that setting is stored in browser localstorage, not to database. https://github.com/wekan/wekan/issues/4715
|
||||
|
||||
Because this feature was added, `Drag Handle Enabled/Disabled` was moved to current place shown in above screenshot. https://github.com/wekan/wekan/issues/4734
|
||||
|
||||
## All Boards page
|
||||
|
||||
Reorder with drag drop:
|
||||
- Board Icons
|
||||
|
||||
## One Board page
|
||||
|
||||
Reorder with drag drop:
|
||||
|
||||
- Swimlanes
|
||||
- Lists
|
||||
- MiniCards. MiniCard is card, that is not click opened to view card contents.
|
||||
- Opened Card: Checklists
|
||||
- Opened Card: Checklist Items
|
||||
|
||||
## Drag code examples
|
||||
|
||||
- Draggable objects
|
||||
- https://www.redblobgames.com/making-of/draggable/
|
||||
- https://news.ycombinator.com/item?id=37703291
|
||||
- Fixed Drag at Ubuntu Touch Morph browser https://github.com/wekan/wekan/commit/af63259f091cb2ade84493a288ea37c53cd37321
|
||||
@@ -0,0 +1,20 @@
|
||||
# Enabling all Touch Screen Support
|
||||
|
||||
## 1) Wekan / Click right top your username / Change Settings / Show Desktop Drag Handles
|
||||
|
||||
Then you can drag cards with touch screen, for example at Android/iOS/desktop touch screen.
|
||||
|
||||
- [Wekan Drag Handle issue](https://github.com/wekan/wekan/issues/3755)
|
||||
|
||||
## 2) Enable touch screen support of Chrome/Chromium/Chromium Edge
|
||||
|
||||
Change the target inside properties in the Google Chrome shortcut by adding "--touch-events" in the end of the address.
|
||||
```
|
||||
Chrome shortcut > Properties >
|
||||
Target: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --touch-events
|
||||
```
|
||||
And similarly at other non-Windows operating systems, by modifying shortcut.
|
||||
|
||||
- [Chrome touch at Google Support](https://support.google.com/chrome/thread/18609718/how-to-get-drag-drop-working-with-touch-screen-working-on-latest-version-of-chrome?hl=en)
|
||||
- [Chrome touch Wekan discussion](https://github.com/wekan/wekan/discussions/3958)
|
||||
- [Chrome/Chromium/Chromium Edge Touch issue](https://github.com/wekan/wekan/discussions/3958)
|
||||
@@ -0,0 +1,569 @@
|
||||
[Azure Email Communication Service](https://github.com/wekan/wekan/issues/5453)
|
||||
|
||||
[Uberspace Email](https://github.com/wekan/wekan/issues/2009#issuecomment-1017630758)
|
||||
|
||||
## Newest Wekan
|
||||
|
||||
In [Wekan v5.02](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v502-2021-03-02-wekan-release) is fix for STMP settings [that works with very happy feedback](https://github.com/wekan/wekan/issues/3529#issuecomment-789085999). It requires:
|
||||
- **There is no email settings at Admin Panel anymore**
|
||||
- Email settings are made only with snap commands like `sudo snap set wekan mail-url....` or similar in Docker/Source etc `MAIL_URL=...`, more details below.
|
||||
- For any errors like SSLv3 and STARTTLS, check [newest AWS SES info](#example-aws-ses) and use similar settings, other SSLv3/STARTTLS info could be outdated.
|
||||
|
||||
## Gmail
|
||||
|
||||
[Source](https://github.com/wekan/wekan-snap/issues/151)
|
||||
|
||||
This maybe requires setting per-application password in Google Account settings for Gmail.
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtp://user@gmail.com:password@smtp.gmail.com:587'
|
||||
```
|
||||
|
||||
## OAuth2 proxy
|
||||
|
||||
- Google will disable all but OAuth for IMAP, SMTP and POP starting Sept. 30 2024 https://workspaceupdates.googleblog.com/2023/09/winding-down-google-sync-and-less-secure-apps-support.html
|
||||
- https://news.ycombinator.com/item?id=39052196 , where is this: "If you can’t switch to OAuth, you can use my proxy to allow any IMAP (or POP/SMTP) client to be used with a “modern” email provider, regardless of whether the client supports OAuth 2.0 natively: https://github.com/simonrob/email-oauth2-proxy . No need for your client to know about OAuth at all." https://news.ycombinator.com/item?id=39052409
|
||||
|
||||
## ProtonMail Bridge
|
||||
|
||||
[Source](https://github.com/wekan/wekan/issues/4887)
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtp://USER%40DOMAIN:PASSWORD@127.0.0.1:1025?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false'
|
||||
```
|
||||
|
||||
## Some more test code
|
||||
|
||||
```
|
||||
let htmlText = Assets.getText("emailTemplate.html");
|
||||
let modifiedText = htmlText.replace(new RegExp("{{variable}}", 'g'), variable);
|
||||
Email.send({
|
||||
from: "nobody@example.com",
|
||||
to: email,
|
||||
subject: `subject`,
|
||||
html: modifiedText,
|
||||
});
|
||||
```
|
||||
|
||||
## Debugging your SMTP mail server
|
||||
|
||||
If you can't get your email server working with smtp/stmps or MAIL_SERVICE, look is there more config options for your email server at https://nodemailer.com docs, and add new issue about your email server to https://github.com/wekan/wekan/issues or [pull request](Emoji#how-you-could-add-another-plugin).
|
||||
|
||||
For example, for https://nodemailer.com/smtp/
|
||||
|
||||
1) Install node.js 12.x
|
||||
2) Add to top of code example: `var nodemailer = require('nodemailer');`
|
||||
3) Install nodemailer: `npm install nodemailer`
|
||||
4) send email: `node email.js`
|
||||
|
||||
For example, this kind of code uses similar like MAIL_SERVICE in Wekan:
|
||||
|
||||
```
|
||||
var nodemailer = require('nodemailer');
|
||||
|
||||
let transporter = nodemailer.createTransport({
|
||||
service: "Outlook365",
|
||||
auth: {
|
||||
user: 'firstname.lastname@hotmail.com',
|
||||
pass: 'TopSecret'
|
||||
},
|
||||
})
|
||||
|
||||
let info = transporter.sendMail({
|
||||
from: 'Firstname Lastname <firstname.lastname@hotmail.com>',
|
||||
to: 'somebody@example.com',
|
||||
subject: 'Hi',
|
||||
text: 'Hi. Reminder: Meeting tomorrow.',
|
||||
html: '<h1>Hi. Reminder: Meeting tomorrow.</h1>'
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
If with some code example sending email works, xet7 can add it to wekan, like in [Wekan v5.52](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v552-2021-08-26-wekan-release) xet7 added direct nodemailer usage for MAIL_SERVICE.
|
||||
|
||||
## MAIL_SERVICE (not currently in use)
|
||||
|
||||
a) If you use smtps or smtp, please do not add any MAIL_SERVICE settings. For example, AWS SES and Postfix works with only MAIL_URL and MAIL_FROM.
|
||||
|
||||
b) If smtps or smtp does not work, in Wekan v5.52 and newer, you can try these additional MAIL_SERVICE settings. This may still also require MAIL_URL to be valid, while it only uses MAIL_SERVICE settings of [Well Known email services](https://nodemailer.com/smtp/well-known/) that are these:
|
||||
|
||||
126, 163, 1und1, AOL, DebugMail, DynectEmail, FastMail, GandiMail, Gmail, Godaddy, GodaddyAsia, GodaddyEurope, hot.ee, Hotmail, iCloud, mail.ee, Mail.ru, Maildev, Mailgun, Mailjet, Mailosaur, Mandrill, Naver, OpenMailBox, Outlook365, Postmark, QQ, QQex, SendCloud, SendGrid, SendinBlue, SendPulse, SES, SES-US-EAST-1, SES-US-WEST-2, SES-EU-WEST-1, Sparkpost, Yahoo, Yandex, Zoho, qiye.aliyun
|
||||
|
||||
Wekan Snap:
|
||||
```
|
||||
sudo snap set wekan mail-service='Outlook365'
|
||||
sudo snap set wekan mail-service-user='firstname.lastname@hotmail.com'
|
||||
sudo snap set wekan mail-service-password='SecretPassword'
|
||||
```
|
||||
Wekan Gantt GPL Snap:
|
||||
```
|
||||
sudo snap set wekan-gantt-gpl mail-service='Outlook365'
|
||||
sudo snap set wekan-gantt-gpl mail-service-user='firstname.lastname@hotmail.com'
|
||||
sudo snap set wekan-gantt-gpl mail-service-password='SecretPassword'
|
||||
```
|
||||
docker-compose.yml of https://github.com/wekan/wekan:
|
||||
```
|
||||
- MAIL_SERVICE=Outlook365
|
||||
- MAIL_SERVICE_USER=firstname.lastname@hotmail.com
|
||||
- MAIL_SERVICE_PASSWORD=SecretPassword
|
||||
```
|
||||
start-wekan.bat of https://github.com/wekan/wekan:
|
||||
```
|
||||
SET MAIL_SERVICE=Outlook365
|
||||
SET MAIL_SERVICE_USER=firstname.lastname@hotmail.com
|
||||
SET MAIL_SERVICE_PASSWORD=SecretPassword
|
||||
```
|
||||
start-wekan.sh of https://github.com/wekan/wekan:
|
||||
```
|
||||
export MAIL_SERVICE=Outlook365
|
||||
export MAIL_SERVICE_USER=firstname.lastname@hotmail.com
|
||||
export MAIL_SERVICE_PASSWORD=SecretPassword
|
||||
```
|
||||
|
||||
## Special Characters
|
||||
|
||||
**If you have special characters in username or password**, sometimes you need to urlencode them. Not for AWS SES.
|
||||
You can convert special characters of your password at https://www.url-encode-decode.com
|
||||
and copy converted characters to your password.
|
||||
|
||||
## Example: Microsoft Office 365
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtp://user:password@smtp.office365.com:587?ignoreTLS=false&tls={rejectUnauthorized:false}&secure=true'
|
||||
sudo snap set wekan mail-from='Wekan Team Boards <info@example.com>'
|
||||
```
|
||||
|
||||
Converting special characters:
|
||||
```
|
||||
sudo snap set wekan mail-url='smtp://support%40example.com:password@mail.example.com:587/?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false'
|
||||
|
||||
sudo snap set wekan mail-from='Wekan Team Boards <info@example.com>'
|
||||
```
|
||||
## Example: AWS SES
|
||||
|
||||
NOTE: At AWS SES settings, you don't need to convert special characters.
|
||||
|
||||
1) At AWS SES, add verified sender email address, verified domain, verified DKIM etc.
|
||||
|
||||
2) For your example.com domain for SPF purposes, add TXT record like this, where ip4:123.123.123.123 is your Wekan server IP address:
|
||||
|
||||
```
|
||||
@ TXT
|
||||
|
||||
v=spf1 ip4:123.123.123.123 include:amazonses.com ~all
|
||||
```
|
||||
|
||||
If you have other email services like Protonmail, Google Workplace, Outlook, SendGrid, and some other servers, it could look like this, please check your email provider to enable all settings:
|
||||
|
||||
```
|
||||
v=spf1 include:_spf.protonmail.ch ip4:123.123.123.123 ip4:123.100.123.100 include:_spf.google.com include:spf.protection.outlook.com include:sendgrid.net include:amazonses.com ~all
|
||||
```
|
||||
|
||||
3) At AWS SES, create new SMTP credentials for username like "AKIA..." and password, that you add directly to below. Do not modify or escape special characters.
|
||||
|
||||
With AWS SMTP credentials:
|
||||
|
||||
a) Wekan Snap
|
||||
```
|
||||
sudo snap set wekan mail-from='Wekan Boards <boards@example.com>'
|
||||
sudo snap set wekan mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:"SSLv3"}&secureConnection=false'
|
||||
```
|
||||
You see settings with:
|
||||
```
|
||||
sudo snap get wekan
|
||||
```
|
||||
b) Wekan Gantt GPLv2 Snap:
|
||||
```
|
||||
sudo snap set wekan-gantt-gpl mail-from='Wekan Boards <boards@example.com>'
|
||||
sudo snap set wekan-gantt-gpl mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:"SSLv3"}&secureConnection=false'
|
||||
```
|
||||
You see settings with:
|
||||
```
|
||||
sudo snap get wekan-gantt-gpl
|
||||
```
|
||||
c) Docker, Source, etc
|
||||
```
|
||||
MAIL_FROM='Wekan Boards <boards@example.com>'
|
||||
MAIL_URL='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:"SSLv3"}&secureConnection=false'
|
||||
```
|
||||
|
||||
## Example: AWS SES sending email with command line
|
||||
|
||||
[Source](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.html)
|
||||
|
||||
This can be used for debugging on bash shell, does AWS SES work at all. Other shells work too, on Windows it requires installing openssl command.
|
||||
|
||||
1) `password-to-base64.sh` - converts AWS SES STMP credentials to base64 to be used at input.txt email content:
|
||||
```
|
||||
echo -n "AKIA...." | openssl enc -base64
|
||||
echo -n "password-here...." | openssl enc -base64
|
||||
```
|
||||
|
||||
2) `input.txt` - change all to your domains, password, etc where is text `-here` below. NOTE: only at `From:` there is more detailed sender name, not elsewhere like `MAIL FROM:` etc.
|
||||
|
||||
```
|
||||
EHLO example.com-here
|
||||
AUTH LOGIN
|
||||
base64-username-here
|
||||
base64-password-here
|
||||
MAIL FROM: boards@example.com-here
|
||||
RCPT TO: you@example.com-here
|
||||
DATA
|
||||
From: Wekan Boards-here <boards@example.com-here>
|
||||
To: you@example.com-here
|
||||
Subject: Amazon SES SMTP Test
|
||||
|
||||
This message was sent using the Amazon SES SMTP interface.
|
||||
.
|
||||
QUIT
|
||||
```
|
||||
3a) `ses-send-email.sh` , with STARTTLS:
|
||||
```
|
||||
openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.eu-west-1.amazonaws.com:587 < input.txt
|
||||
```
|
||||
3b) `ses-send-email.sh`, with SSL:
|
||||
```
|
||||
openssl s_client -crlf -quiet -connect email-smtp.eu-west-1.amazonaws.com:465 < input.txt
|
||||
```
|
||||
4) Changing above `.sh` scripts to executeable:
|
||||
```
|
||||
chmod +x *.sh
|
||||
```
|
||||
Then you can run them like this:
|
||||
```
|
||||
./password-to-base64.sh
|
||||
```
|
||||
|
||||
## Example: Gmail
|
||||
[Source](https://github.com/wekan/wekan/issues/3529#issuecomment-792724239)
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://username@domain.com:password@smtp.gmail.com:465'
|
||||
sudo snap set wekan mail-from='Wekan Team Boards <info@example.com>'
|
||||
```
|
||||
Convert password via this service https://www.url-encode-decode.com and everything will work.
|
||||
|
||||
### If you get SSLv3 protocol error
|
||||
|
||||
Do instead this `smtp://` and ignoreTLS etc, and at click your right top username / Admin Panel / Email, with TLS support NOT enabled:
|
||||
```
|
||||
sudo snap set wekan mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false'
|
||||
sudo snap set wekan mail-from='Wekan Team Boards <info@example.com>'
|
||||
```
|
||||
### If you use some other snap like wekan-gantt-gpl
|
||||
|
||||
Change part `sudo snap set wekan` to `sudo snap set wekan-gantt-gpl`
|
||||
|
||||
## Example: UCS
|
||||
|
||||
### In admin panel (within admin account on Wekan app itself)
|
||||
- SMTP Host: `smtp.example.com:25/?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false`
|
||||
- SMTP Port: `25`
|
||||
- Username: `webadmin%40example.com`
|
||||
- [_] TLS Support UNCHECKED
|
||||
- From: `Wekan Admin <webadmin@example.com>`
|
||||
|
||||
### Settings in Wekan App settings in UCS dashboard
|
||||
- URL settings: `https://www.example.com/wekan`
|
||||
- LDAP Settings: `(&(objectClass=person)(mailPrimaryAddress=*)(!(shadowExpire=*))(sambaBadPasswordTime=0)(wekanActivated=TRUE)(uid=<some_user_name>))`
|
||||
- Mail URL: `smtp://webadmin%40example.com:password@example.com:25/?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false`
|
||||
- Mail From: `Wekan Notifications <webadmin@example.com>`
|
||||
|
||||
## Example: username contains @
|
||||
|
||||
Below `@` is urlencoded to `%40`
|
||||
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://user%40provider.com:xxxxxx@smtp.provider.com:587'
|
||||
sudo snap set wekan mail-from='Boards Support <user@provider.com>'
|
||||
```
|
||||
|
||||
If settings happends to disappear, it's possible set cron job to run those at morning, see: https://crontab.guru
|
||||
```
|
||||
sudo su
|
||||
export EDITOR=nano
|
||||
crontab -e
|
||||
```
|
||||
There at bottom add these. Optional is to add to end of snap command `2>&1` to disable output,if there is any.
|
||||
```
|
||||
06 00 * * * sudo snap set wekan mail-url='smtps://user%40provider.com:xxxxxx@smtp.provider.com:587'
|
||||
06 01 * * * sudo snap set wekan mail-from='Boards Support <user@provider.com>'
|
||||
```
|
||||
|
||||
## Check is username and password required
|
||||
|
||||
If your email server does not require authentication like username and password, [don't include them in MAIL_URL](https://github.com/wekan/wekan/issues/2106). For example, IBM Notes does not require username and password.
|
||||
|
||||
## Config
|
||||
|
||||
Mail configuration if done by settings of `MAIL_URL` & `MAIL_FROM` environment parameters. Way of setting is due your instalation method e.g. [snap](https://github.com/wekan/wekan-snap/wiki/Install#6-email-and-other-settings), in docker-compose.yml file etc.
|
||||
|
||||
## No mail server
|
||||
|
||||
You can choose to _NOT_ configure a mail server, by not providing the `MAIL_URL` & `MAIL_FROM` environment parameters. Instead the mail message will be send to the terminal output. See [FAQ](FAQ#show-mails-with-a-docker-image-without-mail-configuration) for more info.
|
||||
|
||||
## Email servers: SMTP or Exchange
|
||||
|
||||
Standalone Wekan uses SMTP server for sending email invitations etc.
|
||||
|
||||
For Exchange, you can use [DavMail](http://davmail.sourceforge.net), Wekan SMTP => Davmail => Exchange.
|
||||
|
||||
Another way is to [Configure Postfix to relay to Exchange with NTLM authentication](https://www.linuxquestions.org/questions/linux-newbie-8/configure-postfix-to-relay-to-exchange-server-with-ntlm-authentication-4175410961/#post4712832)
|
||||
|
||||
There are Thunderbird Exchange Calendar extensions for [Exchange 2007/2010/2013/others? Open Source](https://github.com/ExchangeCalendar/exchangecalendar/releases), [Exchange 2007-2015 paid](https://exquilla.zendesk.com/hc/en-us) and [Exhange 2016 paid](http://www.beonex.com/owl/) and [other extensions](https://addons.thunderbird.net/en-US/thunderbird/search/?q=exchange&appver=&platform=), info how to use it is at [article at threenine.co.uk](https://threenine.co.uk/setup-office365-calendar-with-thunderbird/). Wekan has [Calendar feature](https://github.com/wekan/wekan/issues/808).
|
||||
|
||||
Wekan Email settings are required in both MAIL_URL and Admin Panel.
|
||||
|
||||
If you want to receive Email to Wekan, use [Huginn](https://github.com/wekan/wekan/issues/1160) to get E-mail from mailserver and have Huginn to use Wekan REST API to add card to Wekan board.
|
||||
|
||||
## Postfix
|
||||
|
||||
If you want to configure a mail server, you could use a mail server out-side of your machine (like the example above). Or you could start another Docker container which runs Postfix (try the [`marvambass/versatile-postfix`](https://hub.docker.com/r/marvambass/versatile-postfix/) Docker image).
|
||||
|
||||
If you already got a Postfix service running on your host machine, you can add the local IP address to the docker-compose.yml file and use the hostname in the `MAIL_URL`:
|
||||
```
|
||||
environment:
|
||||
[...]
|
||||
- MAIL_URL=smtp://mailserver
|
||||
- MAIL_FROM=noreply@domain.com
|
||||
extra_hosts:
|
||||
- "mailserver:192.168.1.20"
|
||||
```
|
||||
**Note:** `192.168.1.20` needs to be changed to your local server IP address.
|
||||
|
||||
And finally add the Docker IP range (172.17.x.x) to the Postfix trusted networks list in `/etc/postfix/main.cf`:
|
||||
```
|
||||
mynetworks = 127.0.0.0/8 172.17.0.0/16 [::ffff:127.0.0.0]/104 [::1]/128
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Email is quite important in Wekan, as without it you can't send password reset links nor can you verify your e-mail address. Here are some ways to figure out what is wrong with your mail server settings in WeKan.
|
||||
|
||||
## Log Files
|
||||
Firstly, make sure you're logged into your server and following your log files.
|
||||
|
||||
@:~$ tail -f path/to/wekan.log
|
||||
|
||||
If you're using the Docker container through docker-compose, you can follow the log file like this:
|
||||
|
||||
@:~$ docker-compose logs -f wekan
|
||||
|
||||
If you're using a snap package, you'll get the logs with
|
||||
|
||||
@:~$ journalctl -u snap.wekan.wekan
|
||||
|
||||
## Error Messages
|
||||
Once you've got the log files in front of you, go to the WeKan frontend and send a password reset link, or try to register. This will try to send an e-mail, and you should see any error messages in the log file.
|
||||
|
||||
### Wrong Port
|
||||
If you see an error message like the following one, your port number is wrong. If you're using plain old SMTP or STARTTLS, your port should be 25. If you're using TLS, you may need to change your port to 465. Some mail servers may use port 587 instead of the two above.
|
||||
|
||||
```
|
||||
wekan_1 | Exception while invoking method 'forgotPassword' Error: connect ECONNREFUSED 64.22.103.211:587
|
||||
wekan_1 | at Object.Future.wait (/build/programs/server/node_modules/fibers/future.js:449:15)
|
||||
wekan_1 | at Mail._syncSendMail (packages/meteor.js:213:24)
|
||||
wekan_1 | at smtpSend (packages/email.js:110:13)
|
||||
wekan_1 | at Object.Email.send (packages/email.js:168:5)
|
||||
wekan_1 | at AccountsServer.Accounts.sendResetPasswordEmail (packages/accounts-password/password_server.js:614:9)
|
||||
wekan_1 | at [object Object].Meteor.methods.forgotPassword (packages/accounts-password/password_server.js:546:12)
|
||||
wekan_1 | at packages/check.js:130:16
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at Object.exports.Match._failIfArgumentsAreNotAllChecked (packages/check.js:129:41)
|
||||
wekan_1 | at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1734:18)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:719:19
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:717:40
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:715:46
|
||||
wekan_1 | at [object Object]._.extend.protocol_handlers.method (packages/ddp-server/livedata_server.js:689:23)
|
||||
wekan_1 | - - - - -
|
||||
wekan_1 | at Object.exports._errnoException (util.js:907:11)
|
||||
wekan_1 | at exports._exceptionWithHostPort (util.js:930:20)
|
||||
wekan_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1081:14)
|
||||
```
|
||||
|
||||
### Wrong Protocol
|
||||
If you have the "Enable TLS support for SMTP server", but your does not directly support TLS (it may use STARTTLS instead), then you'll get the following error. Just uncheck the checkbox in the Admin Panel.
|
||||
|
||||
```
|
||||
wekan_1 | Exception while invoking method 'forgotPassword' Error: 139872240588608:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794:
|
||||
wekan_1 | at Object.Future.wait (/build/programs/server/node_modules/fibers/future.js:449:15)
|
||||
wekan_1 | at Mail._syncSendMail (packages/meteor.js:213:24)
|
||||
wekan_1 | at smtpSend (packages/email.js:110:13)
|
||||
wekan_1 | at Object.Email.send (packages/email.js:168:5)
|
||||
wekan_1 | at AccountsServer.Accounts.sendResetPasswordEmail (packages/accounts-password/password_server.js:614:9)
|
||||
wekan_1 | at [object Object].Meteor.methods.forgotPassword (packages/accounts-password/password_server.js:546:12)
|
||||
wekan_1 | at packages/check.js:130:16
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at Object.exports.Match._failIfArgumentsAreNotAllChecked (packages/check.js:129:41)
|
||||
wekan_1 | at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1734:18)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:719:19
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:717:40
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:715:46
|
||||
wekan_1 | at [object Object]._.extend.protocol_handlers.method (packages/ddp-server/livedata_server.js:689:23)
|
||||
wekan_1 | - - - - -
|
||||
wekan_1 |
|
||||
wekan_1 | at Error (native)
|
||||
```
|
||||
|
||||
### STARTTLS Sending test email failed
|
||||
|
||||
```
|
||||
Sending email failed
|
||||
Error trying to send email: 139625961224000:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:827:
|
||||
```
|
||||
To fix it, in snap/docker/source environment variable settings, with username and password urlencoded:
|
||||
```
|
||||
snap set wekan mail-from='Boards Support <boards@example.com>'
|
||||
|
||||
snap set wekan mail-url='smtp://support%40example.com:password@mail.example.com:587/?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false'
|
||||
```
|
||||
Admin Panel:
|
||||
```
|
||||
SMTP Host:
|
||||
mail.example.com:587/?ignoreTLS=true&tls={rejectUnauthorized:false}&secure=false
|
||||
|
||||
SMTP Port:
|
||||
587
|
||||
|
||||
Username:
|
||||
support%40example.com
|
||||
|
||||
Password:
|
||||
password
|
||||
|
||||
TLS support:
|
||||
[_] <== not checked
|
||||
|
||||
From:
|
||||
Boards Support <boards@example.com>
|
||||
|
||||
DNS settings, with server IP address in ipv4 section:
|
||||
TXT: mail.example.com & & TXT: example.com
|
||||
v=spf1 a mx ipv4:123.123.123.123/32 include:_spf.google.com include:example.com include:mail.example.com include:_spf.google.com ~all
|
||||
```
|
||||
|
||||
### Self-signed Certificate
|
||||
Unfortunately at this stage, WeKan does not support self-signed certificates. You will see the following error if your SMTP server is using a self-signed certificate. Ways to remedy to this are (by order of preference):
|
||||
* disable TLS on your SMTP server. For postfix juste add "smtpd_user_tls = no" to main.cf. !!! Unless doing this, wekan will try to connect with STARTTLS !!!
|
||||
* to get a certificate from a CA, or
|
||||
* to add "?tls={rejectUnauthorized:false}" to the end of the [MAIL_URL environment variable](https://nodemailer.com/smtp/), or
|
||||
* to add "?ignoreTLS=true" to the end of the [MAIL_URL environment variable](https://nodemailer.com/smtp/), or
|
||||
* to remove the TLS certificate completely.
|
||||
|
||||
```
|
||||
wekan_1 | Exception while invoking method 'forgotPassword' Error: 139872240588608:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794:
|
||||
wekan_1 | at Object.Future.wait (/build/programs/server/node_modules/fibers/future.js:449:15)
|
||||
wekan_1 | at Mail._syncSendMail (packages/meteor.js:213:24)
|
||||
wekan_1 | at smtpSend (packages/email.js:110:13)
|
||||
wekan_1 | at Object.Email.send (packages/email.js:168:5)
|
||||
wekan_1 | at AccountsServer.Accounts.sendResetPasswordEmail (packages/accounts-password/password_server.js:614:9)
|
||||
wekan_1 | at [object Object].Meteor.methods.forgotPassword (packages/accounts-password/password_server.js:546:12)
|
||||
wekan_1 | at packages/check.js:130:16
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at Object.exports.Match._failIfArgumentsAreNotAllChecked (packages/check.js:129:41)
|
||||
wekan_1 | at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1734:18)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:719:19
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:717:40
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:715:46
|
||||
wekan_1 | at [object Object]._.extend.protocol_handlers.method (packages/ddp-server/livedata_server.js:689:23)
|
||||
wekan_1 | - - - - -
|
||||
wekan_1 |
|
||||
wekan_1 | at Error (native)
|
||||
```
|
||||
|
||||
### Incorrect TLS Certificate
|
||||
Lastly, if you see the following error message it is because the certificate has not been correctly installed on the SMTP server.
|
||||
|
||||
```
|
||||
wekan_1 | Exception while invoking method 'forgotPassword' Error: unable to verify the first certificate
|
||||
wekan_1 | at Object.Future.wait (/build/programs/server/node_modules/fibers/future.js:449:15)
|
||||
wekan_1 | at Mail._syncSendMail (packages/meteor.js:213:24)
|
||||
wekan_1 | at smtpSend (packages/email.js:110:13)
|
||||
wekan_1 | at Object.Email.send (packages/email.js:168:5)
|
||||
wekan_1 | at AccountsServer.Accounts.sendResetPasswordEmail (packages/accounts-password/password_server.js:614:9)
|
||||
wekan_1 | at [object Object].Meteor.methods.forgotPassword (packages/accounts-password/password_server.js:546:12)
|
||||
wekan_1 | at packages/check.js:130:16
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at Object.exports.Match._failIfArgumentsAreNotAllChecked (packages/check.js:129:41)
|
||||
wekan_1 | at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1734:18)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:719:19
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:717:40
|
||||
wekan_1 | at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
|
||||
wekan_1 | at packages/ddp-server/livedata_server.js:715:46
|
||||
wekan_1 | at [object Object]._.extend.protocol_handlers.method (packages/ddp-server/livedata_server.js:689:23)
|
||||
wekan_1 | - - - - -
|
||||
wekan_1 | at Error (native)
|
||||
wekan_1 | at TLSSocket.<anonymous> (_tls_wrap.js:1063:38)
|
||||
wekan_1 | at emitNone (events.js:67:13)
|
||||
wekan_1 | at TLSSocket.emit (events.js:166:7)
|
||||
wekan_1 | at TLSSocket._init.ssl.onclienthello.ssl.oncertcb.TLSSocket._finishInit (_tls_wrap.js:621:8)
|
||||
wekan_1 | at TLSWrap.ssl.onclienthello.ssl.oncertcb.ssl.onnewsession.ssl.onhandshakedone (_tls_wrap.js:453:38)
|
||||
```
|
||||
|
||||
## No News Is Good News
|
||||
Of course, if you don't see any of these errors in your WeKan log file, then the problem is not in WeKan. Check your SMTP server's mail logs (if you can) to get a better idea of what might be going wrong.
|
||||
|
||||
|
||||
***
|
||||
|
||||
## BELOW IS NOT TESTED YET DOCS
|
||||
|
||||
They are moved here from https://github.com/wekan/wekan/issues/961
|
||||
|
||||
### Configure Wekan
|
||||
|
||||
Sample:
|
||||
### Wekan with TLS/SSL
|
||||
To run Wekan secured with TLS/SSL do the following steps:
|
||||
1. Setup a Web-Server/-Proxy with TLS/SSL support that maps requests to wekan. [Link](url)
|
||||
2. Set protocol to http**s**.
|
||||
`export ROOT_URL='https://example.com/'`
|
||||
3. Set Wekan to an internal port.
|
||||
`export PORT=54321`
|
||||
4. Restart and run Wekan.
|
||||
|
||||
### Wekan at subpath
|
||||
To run Wekan to appear at a subpath of your domain:
|
||||
1. Setup a Web-Server/-Proxy that maps requests to wekan. [Link](url)
|
||||
2. Append subpath to domain, without trailing slash.
|
||||
`export ROOT_URL='http://example.com/mywekan'`
|
||||
3. Set Wekan to an internal port.
|
||||
`export PORT=54321`
|
||||
4. Restart and run Wekan.
|
||||
|
||||
### SMTP with TLS/SSL
|
||||
To enable Wekan sending Mail from a mail server with TLS/SSL:
|
||||
1. Set Wekan to the specified port (465 / 587).
|
||||
`export MAIL_URL='smtp://user:password@example.com:587/'`
|
||||
2. Restart and run Wekan.
|
||||
|
||||
### Mail Sender
|
||||
To define a sender name for the mails automatically sent by Wekan.
|
||||
1. ...`export MAIL_FROM='Thomas Anderson <neo@matrix.org>'`
|
||||
|
||||
## Using mail service from zoho
|
||||
If you have your personal mail on zoho for your domain example.com, then follow these steps to add MAIL_URL.
|
||||
Let's assume following username
|
||||
username=user1@example.com
|
||||
password=12@3424dsfsf
|
||||
|
||||
Step 1: encode the username and password
|
||||
|
||||
encoded username: user1%40example.com
|
||||
encoded password: 12%403424dsfsf
|
||||
|
||||
Step 2: form MAIL_URL
|
||||
|
||||
MAIL_URL=smtps://user1%40example.com:12%403424dsfsf@smtp.zoho.com:465/
|
||||
|
||||
By default zoho uses port number 465 with TLS enabled.
|
||||
|
||||
Step 3: form MAIL_FROM
|
||||
|
||||
MAIL_FROM=Wekan Notifications <user1@example.com>
|
||||
+249
@@ -0,0 +1,249 @@
|
||||
> **»The only stupid question is the one that is not asked.«**
|
||||
> *– Hull, E., K. Jackson, et al. (2005).*
|
||||
|
||||
## About Wekan
|
||||
|
||||
Wekan is an completely Open Source and Free software
|
||||
collaborative [kanban board](https://en.wikipedia.org/wiki/Kanban_board) application with MIT license.
|
||||
|
||||
Whether you’re maintaining a personal todo list, planning your holidays with some friends,
|
||||
or working in a team on your next revolutionary idea, Kanban boards are an unbeatable tool
|
||||
to keep your things organized. They give you a visual overview of the current state of your project,
|
||||
and make you productive by allowing you to focus on the few items that matter the most.
|
||||
|
||||
Since Wekan is a free software, you don’t have to trust us with your data and can
|
||||
install Wekan on your own computer or server. In fact we encourage you to do
|
||||
that by providing one-click installation on various platforms.
|
||||
|
||||
- Wekan is used in [most countries of the world](https://snapcraft.io/wekan).
|
||||
- Wekan largest user has 30k users using Wekan in their company.
|
||||
- Wekan has been [translated](https://app.transifex.com/wekan/) to about 70+ languages.
|
||||
- [Features](Features): Wekan has real-time user interface.
|
||||
- [Platforms](Platforms): Wekan supports many platforms.
|
||||
Wekan is critical part of new platforms Wekan is currently being integrated to.
|
||||
- [Integrations](Integrations): Current possible integrations and future plans.
|
||||
|
||||
## About niche of WeKan
|
||||
|
||||
It's a very specific niche, with limited amount competitors, with all of this applied combined:
|
||||
|
||||
- Kanban with very many features, polish and usability
|
||||
- Permissive MIT license (if some other changes to GPL, Open Core, has https://sso.tax , is propietary etc, it's not in same niche anymore)
|
||||
- Self-hosted (or SaaS)
|
||||
- All code https://github.com/wekan/wekan and docs https://github.com/wekan/wekan/wiki Open Source
|
||||
- Available for many OS and CPU platforms, listed at download/install section of https://wekan.github.io
|
||||
- Translated to 70+ languages at https://app.transifex.com/wekan
|
||||
- Has optional affordable Commercial Support for Features/Fixes/Support/Hosting available https://wekan.team/commercial-support/ that funds development of WeKan. Commercial Support provides private support chat with maintainer of WeKan.
|
||||
- Is actively maintained with major features and fixes being added
|
||||
- Does not include any enabled telemetry or externally loaded dependencies by default, it does not ping home. Only Snap platform has number of servers per country counted by Canonical that provides Snap store https://snapcraft.io/wekan , not any more specific details.
|
||||
- Alternative to Enterprise software that can cost 500k euro per year
|
||||
|
||||
## Requirements
|
||||
|
||||
- 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) /
|
||||
[Mac](Mac) / [Windows](Install-Wekan-from-source-on-Windows).
|
||||
[More Platforms](Platforms). [ARM progress](https://github.com/wekan/wekan/issues/1053#issuecomment-410919264).
|
||||
- 1 GB RAM minimum free for Wekan. Production server should have miminum total 4 GB RAM.
|
||||
For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/main/docker-compose.yml): 3 frontend servers,
|
||||
each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.
|
||||
- Enough disk space and alerts about low disk space. If you run out disk space, MongoDB database gets corrupted.
|
||||
- SECURITY: Updating to newest Wekan version very often. Please check you do not have automatic updates of Sandstorm or Snap turned off.
|
||||
Old versions have security issues because of old versions Node.js etc. Only newest Wekan is supported.
|
||||
Wekan on Sandstorm is not usually affected by any Standalone Wekan (Snap/Docker/Source) security issues.
|
||||
- [Reporting all new bugs immediately](https://github.com/wekan/wekan/issues).
|
||||
New features and fixes are added to Wekan [many times a day](https://github.com/wekan/wekan/blob/main/CHANGELOG.md).
|
||||
- [Backups](Backup) of Wekan database once a day miminum.
|
||||
Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet.
|
||||
Some bug can cause Wekan board to not load at all, requiring manual fixing of database content.
|
||||
|
||||
## What is Wekan Team?
|
||||
|
||||
[Wekan Team](https://wekan.team) is Wekan Commercial Support company run by CEO [xet7](https://github.com/xet7), current maintainer of Wekan. xet7 does respond to feedback at GitHub issues very actively, because Wekan is community driven Open Source project. Because conflicting opinions can not be implemented, sometimes xet7 has to behave like a benevolent dictator. Every Wekan team member is free to choose what to contribute and when. We can not force anybody to implement anything. Wekan development speed increases when new Wekan contributors join and start to send PRs to existing and new issues.
|
||||
|
||||
## What is Bio of xet7 ?
|
||||
|
||||
[Lauri Ojansivu](https://github.com/xet7) is CEO at [WeKan Team](https://wekan.team),
|
||||
Cross-Platform FOSS maintainer,
|
||||
Cloud Architect, Full-Stack Developer, SysAdmin and SysOp.
|
||||
He has experience of [having added and removed over 4 million lines of code](https://github.com/wekan/wekan/blob/main/releases/count-lines-of-code-per-committer.sh) to
|
||||
[Meteor Full-Stack Web Framework](https://www.meteor.com)
|
||||
based [WeKan Open Source kanban](https://wekan.github.io),
|
||||
that has been [translated to 70+ languages](https://explore.transifex.com/wekan/wekan/),
|
||||
and is currently used at [most countries of the world](https://snapcraft.io/wekan).
|
||||
At 2024-06-04, he is currently [4h most active GitHub committer at Finland](https://committers.top/finland).
|
||||
|
||||
He holds a BBA as computer designer and system engineer
|
||||
at Kemi-Tornio AMK, Finland.
|
||||
He is credited as having built quality control system
|
||||
with comparisons of groups and fitness test calculations,
|
||||
company infra, migration from On-Premises to Cloud,
|
||||
SLA support, IT support, [games](https://github.com/xet7/notegame), database apps, websites,
|
||||
[winner of 2th place at EU NGI ONTOCHAIN Hackathon](https://wekan.github.io/donated/ontochain-certificate.png),
|
||||
[winner of 20i FOSS Awards](https://wekan.github.io/donated/foss-awards-2022/20i_FOSS_Awards_Winners_Announced_(Press_Release).pdf), and [porting to 30+ CPU/OS](https://github.com/xet7/darkesthour).
|
||||
|
||||
At MeteorJS Dispatches Video Podcast, he has been
|
||||
interviewed [about WeKan](https://www.youtube.com/watch?v=ke-mbnZM3zE&t=1342s),
|
||||
[Meteor Security](https://www.youtube.com/watch?v=zic-h8jG6F8), and other topics.
|
||||
He teaches using computers at local nerd club.
|
||||
At his free time, he is porting FOSS software to many CPU/OS,
|
||||
and [translating them from English to Finnish](https://xet7.org).
|
||||
|
||||
## How to convince my company management that Wekan "is less evil" than Trello?
|
||||
|
||||
Yes, xet7 received this question in Email.
|
||||
|
||||
Trello:
|
||||
- Code is proprietary. Only Atlassian personnel has access Trello source code.
|
||||
- You can not install Trello to your own servers.
|
||||
- Trello has access to all of your data.
|
||||
- You can not run Trello in internal network that is not connected to Internet.
|
||||
|
||||
Wekan:
|
||||
- All Wekan code is Open Source at https://github.com/wekan/wekan with MIT license, free also for commercial use.
|
||||
- You don't need to pay monthly fee for using Wekan. Only if you need Commercial Support https://wekan.team for some bugfix, feature or integration, you can pay for that.
|
||||
- You can download all Wekan code and run in internal network that is not connected to Internet. You can keep all your data to yourself.
|
||||
- Snap/Docker/Sandstorm versions runs inside sandbox and does not have any access to elsewhere on server filesystem.
|
||||
- Snap version of Wekan is built directly from https://github.com/wekan/wekan repo on Canonical's build service that does security checks etc.
|
||||
- Docker version of Wekan is built directly from https://github.com/wekan/wekan by [Quay](https://quay.io/wekan/wekan) and [Docker Hub](https://hub.docker.com/r/wekanteam/wekan/) and they do security checks etc.
|
||||
- Sandstorm version is checked by [ocdtrekkie](https://github.com/ocdtrekkie) that it does not break anything, before he lets new version of Wekan into [Sandstorm App Market](https://apps.sandstorm.io/app/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h).
|
||||
- Wekan does not load any files from Internet, when starting Wekan. For further restrictions, you could on internal server only allow incoming and outgoing traffic from
|
||||
on internal server firewall to those computers that need to use Wekan.
|
||||
- There is contributors to Wekan from all over the world, that add fixes and features to Wekan.
|
||||
- There has been some code reviews done by security researchers https://wekan.github.io/hall-of-fame/ and there has been fixes to Wekan related to that.
|
||||
- xet7 tries to be less evil by trying to listen to some user feedback. For example, someone suggested [inner shadow](https://github.com/wekan/wekan/issues/1690), so it was added, but because of feedback from users inner shadow was removed. Same with removing and adding back [SMTP settings in Admin Panel](https://github.com/wekan/wekan/issues/1790). Unfortunately it's not possible to make everyone happy because different people have different opinions, so xet7 tries to select something that makes some sense. Improvement suggestions welcome.
|
||||
|
||||
## When new version of Wekan will be released? When my pull request will be tested, commented or merged?
|
||||
|
||||
Usually:
|
||||
* Fastest: multiple times a day. Sometimes this is 7 releases per day. This is usually because some bug is found and new releases are done in rapid schedule until bug is fixed. Also sometimes there is many new pull requests per day, or fast pace of adding new features. This is like said by Eric S. Raymond: ["Release early. Release often. And listen to your customers."](https://en.wikipedia.org/wiki/Release_early,_release_often)
|
||||
* Slowest: Once a month.
|
||||
* One release contains anything from one typo fix to many major features and bugfixes.
|
||||
|
||||
For [Wekan Platforms](Platforms), it means these choices:
|
||||
|
||||
* Snap: You get updates automatically immediately, or updates automatically scheduled at midnight
|
||||
* Source/Docker/VirtualBox: You need to test and install new Wekan version yourself
|
||||
* Sandstorm: ocdtrekkie tests before releasing to Sandstorm App Market, and you backup your grains and upgrade by clicking upgrade button when you wish
|
||||
|
||||
## What Wekan version number means?
|
||||
|
||||
* Every release has release date and release number.
|
||||
* Every release increments release number by 0.01. This practise started at 2017-03-05 v0.12. Before it release number was much more compicated like v0.11.1-rc2. After v0.99 comes v1.00, v1.01, v1.02, etc.
|
||||
* Version number is only incrementing number. Wekan has been in production use for a long time already, so v1.00 is not about being production ready. There has been many performance improvements, but there is still a lot to improve.
|
||||
* Wekan still has bugs, like any other software. So this is not about being bug free.
|
||||
* Wekan will keep changing, and providing migrations from old to newest version. In that sense, Wekan has been LTS release as long as it's been maintained already. There have been many fixes to make migrations possible, and adding more fixes will continue.
|
||||
* Development happens in in edge branch. When release is made, edge branch is merge merged to devel/master/meteor-1.8 branches.
|
||||
|
||||
# Features
|
||||
|
||||
## Will my feature request be implemented?
|
||||
|
||||
There are alternative ways to have your feature implemented:
|
||||
|
||||
a) [Commercial Support](https://wekan.team/commercial-support/)
|
||||
|
||||
b) Pay someone from your company or some other developer to code feature and submit as pull request
|
||||
|
||||
c) Develop feature yourself and submit it as pull requests to devel [Wekan repo](https://github.com/wekan/wekan) branch.
|
||||
|
||||
[According to Open Hub](https://www.openhub.net/p/wekan), Wekan code is only about 10500 lines without Meteor.js framework and NPM modules, so it's very small when comparing to other software, and quite logically organized. With git history viewer like gitk it's possible to see how different features are implemented.
|
||||
|
||||
For Sandstorm-specific features, have the feature enabled in Sandstorm by using environment variable isSandstorm = true like is at wekan/sandstorm.js .
|
||||
|
||||
In wiki there is [Developer Documentation](Developer-Documentation).
|
||||
|
||||
## Will you accept my pull request?
|
||||
We totally rely on pull requests for new features and bug fixes. If your pull request works, it's very likely to be accepted by xet7.
|
||||
|
||||
## How can I contribute to Wekan?
|
||||
We’re glad you’re interested in helping the Wekan project! We welcome bug reports, enhancement ideas, and pull requests, in our GitHub bug tracker. Have a look at the [[Contributing notes|developer-documentation]] for more information how you can help improve and enhance Wekan. We are working to make it possible to have bounties for features. We welcome sponsors.
|
||||
|
||||
## Are there any tests?
|
||||
There are near to zero tests, because nobody has contributed tests as pull request.
|
||||
|
||||
## Is there a plugin system?
|
||||
No. It's not possible in web browser to a) Install npm modules inside Docker or b) Install code afterwards on Sandstorm, because application code is read-only and signed. All features in code are built in, and all data related to features is stored on MongoDB.
|
||||
|
||||
## Can Wekan be rewritten in another programming language?
|
||||
|
||||
[xet7 tried to rewrite, but it's only at very early steps](https://github.com/wekan/demo/wiki/Roadmap).
|
||||
|
||||
# History
|
||||
|
||||
## Weren't you called Libreboard before?
|
||||
Yes, Libreboard was the old project name, which superseded the even older project name Metrello. As the original name suggests, Metrello was a Trello clone built with Meteor. It used a lot of the original assets from Trello and even the name was very similar. When the project turned more mature and gained more interest by the community, this was obviously a [problem]. To get its own identity and due to a DMCA from Trello, efforts started to [redesign] Metrello, which also included to find a new name and so Maxime Quandalle came up with “OpenBoard”, to underline the open source nature of the project. Unfortunately the com domain was already taken and so she replaced the Open with Libre, which stands for free (as in freedom) in many Latin derived languages.
|
||||
|
||||
After renaming it to Libreboard, a [new logo] was designed and the project continued to live on as Libreboard. Unfortunately it turned out, that the new logo was apparently ripped-off from a [concept] published at Dribbble, and so a new logo had to be found. There were a lot of [ideas from the community][logo-ticket], and at the end Maxime [proposed][wekan-proposal] a completely new name, Wekan, together with a design proposal for a new logo.
|
||||
|
||||
## What was Wekan fork / Wefork?
|
||||
After 2016-09-02 there were no pull requests reviewed and integrated for nearly 2 months. At 2016-10-20 Wekan community created fork and started merging many bugfixes and new features into Wefork. 2017-01-29 Wekan author mquandalle gave access to Wekan and at 2017-01-31 xet7 started merging Wefork back to Wekan. 2017-02-08 All of Wefork is now merged and moved back to official Wekan. Wefork will not accept any new issues and pull requests. All development happens on Wekan. [Wefork announcement and merging back](https://github.com/wekan/wekan/issues/640#issuecomment-276383458), more info: [Team](Team)
|
||||
|
||||
## What is the difference between Wekan and Trello?
|
||||
The main difference between the two is that Wekan is completely open source and available under the permissive MIT license. That makes it possible to host it on your own server (or your company's or organization's server) and you keep the full control over all data. No need to fear it will disappear some day, like a commercial service like Trello could.
|
||||
Additionally the long term goal is to have features that are not available on Trello or other alternatives, making Wekan flexible and suitable for complex project organizations.
|
||||
|
||||
## Why does Wekan look so different now compared to < v0.9?
|
||||
Wekan started as a just for fun project to explore meteor and its features and the initial version had a lot of the Trello assets (CSS, Images, Fonts) in it and copied a lot of its design. Due to an DMCA takedown notice and obviously to get its own identity, the old design was dropped after v0.8 and a new UI was developed
|
||||
|
||||
See the related tickets [#92] and [#97] for more information.
|
||||
|
||||
[#92]: https://github.com/wekan/wekan/issues/92
|
||||
[#97]: https://github.com/wekan/wekan/issues/97
|
||||
|
||||
# Etiquette
|
||||
|
||||
## Why am I called a troll?
|
||||
* You use word "shame", that means you would like to have a feature or fix without contributing any code or payment yourself, worded in a way to make it itch conscience.
|
||||
* You want a feature, but you add thumbs down emoji reactions
|
||||
* You are adding image reactions
|
||||
* You want priorities changed. Current priorities are:
|
||||
* [High priority](https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aopen+label%3AHigh-priority): security issues and high severity bugs
|
||||
* Medium priority: Import/Export
|
||||
* Others. Actual roadmap will be updated later.
|
||||
* You write that you are providing constructive criticism
|
||||
* You think that free software includes free implemented features
|
||||
* You are adding something other than:
|
||||
* Thumbs up reactions to existing posts
|
||||
* Feature specs
|
||||
* Technical details
|
||||
* Links to related documentation
|
||||
* Links to example code to get a feature implemented
|
||||
* Pull requests
|
||||
|
||||
## Why am I called a spammer?
|
||||
* You are adding new comments that have only content like:
|
||||
* +1
|
||||
* +1 I can confirm this
|
||||
* +1 It would be great to have this
|
||||
* +1 This is the only feature for preventing my company to move to Wekan
|
||||
* You are adding something other than:
|
||||
* Thumbs up reactions to existing posts
|
||||
* Feature specs
|
||||
* Technical details
|
||||
* Links to related documentation
|
||||
* Links to example code to get a feature implemented
|
||||
* Pull requests
|
||||
|
||||
## What you should do if you see a troll or a spammer?
|
||||
Add only one link to this FAQ. Do not in any way comment or feed the trolls.
|
||||
|
||||
[problem]: https://github.com/wekan/wekan/issues/92
|
||||
[redesign]: https://github.com/wekan/wekan/issues/94
|
||||
[new logo]: https://github.com/wekan/wekan/issues/64#issuecomment-69005150
|
||||
[concept]: https://dribbble.com/shots/746215-Pigeon
|
||||
[logo-ticket]: https://github.com/wekan/wekan/issues/64#issuecomment-74357809
|
||||
[wekan-proposal]: https://github.com/wekan/wekan/issues/64#issuecomment-135221046
|
||||
|
||||
---
|
||||
|
||||
# Sandstorm
|
||||
|
||||
## What Sandstorm is not anymore?
|
||||
Not a Company, Not a Startup, Not a Product with Enterprise version. Everything is now [Open Source](https://en.wikipedia.org/wiki/Open-source_software) and [Free software](https://en.wikipedia.org/wiki/Free_software).
|
||||
|
||||
## What is Sandstorm?
|
||||
[Sandstorm](https://sandstorm.io) is a open-source and free software security audited platform with grains, logging, admin settings, server clustering and App Market. App Market has Wekan as installable App. SSO options like LDAP, passwordless email, SAML, GitHub and Google Auth are already available on Sandstorm. Sandstorm is preferred platform for Wekan, as it would take a lot of work to reimplement everything in standalone Wekan.
|
||||
|
||||
## How can you contribute to Sandstorm?
|
||||
See [Sandstorm website about contributing pull requests](https://sandstorm.io) and [returning to Open Source community roots, including donation info](https://sandstorm.io/news/2017-02-06-sandstorm-returning-to-community-roots).
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
[Other things that are not related to WeKan kanban](https://github.com/wekan/wekan/wiki/NOT-related-to-Wekan)
|
||||
|
||||
## Description
|
||||
|
||||
Lauri Ojansivu (xet7) has [trademark to WeKan](https://www.tmdn.org/tmview/#/tmview/detail/FI50202100052006A), as can be seen from bottom of official WeKan webpage https://wekan.github.io . Official domain is https://wekan.team .
|
||||
|
||||
Lauri Ojansivu, as maintainer of WeKan Open Source kanban, has added and removed about [4 million lines of code](https://github.com/wekan/wekan/graphs/contributors) to WeKan since December 2016. All changes to WeKan are at [ChangeLog](https://github.com/wekan/wekan/graphs/contributors). WeKan is used at [most countries of the world](https://wekan.github.com)
|
||||
|
||||
Lauri Ojansivu has nickname xet7 at many places at Internet, for example:
|
||||
|
||||
- https://github.com/xet7
|
||||
|
||||
Problem is, fake companies try to register WeKan these domains, or other domains that have these words:
|
||||
|
||||
- wekan
|
||||
- wekan io, virus page
|
||||
- wekan cn, fake spam company "WeiRong Holdings Ltd" and "Yongchen Holdings Ltd" trying to register
|
||||
- xet7
|
||||
- xet7 cn, fake spam company "WeiRong Holdings Ltd" trying to register
|
||||
|
||||
Usually those fake companies setup virus webpages, or other fake webpages.
|
||||
|
||||
## Fake mobile apps that do not work
|
||||
|
||||
SMI TEAMWORK at [iOS App Store](https://itunes.apple.com/de/app/smi-teamwork/id1232167123?mt=8) and [Google Play Store](https://play.google.com/store/apps/details?id=com.siliconmotion.teamwork) . xet7 has notified them to remove it.
|
||||
|
||||
## Fake companies trying to register WeKan domains
|
||||
|
||||
### 2023-12-27 From chinaregistrar.org.cn , about "Yongchen Holdings Ltd"
|
||||
|
||||
Dear Manager,
|
||||
|
||||
(If you are not the person who in charge of this, please forward this to your CEO, because this is urgent. Thanks!)This is a formal email.We are the domain registration and solution center in China.
|
||||
|
||||
On December 23, 2023, we received an application from Yongchen Holdings Ltd requested “wekan” as their internet keyword and China (CN) domain names( wekan.cn/ wekan.com.cn/ wekan.net.cn/ wekan.org.cn).
|
||||
|
||||
After checking it, we find this name conflict with your company name or trademark.In order to deal with this matter better, we send email to you and confirm whether this company is your distributor or business partner in China?
|
||||
|
||||
Best Regards
|
||||
|
||||
Jason
|
||||
|
||||
### 2023-05-22 From Zhihai Ning, zhihaining at 163 dot com, of WeiRong Holdings Ltd
|
||||
|
||||
To whom it concerns,
|
||||
|
||||
We will register the China domain names "wekan.cn" "wekan.com.cn" "wekan.net.cn" "wekan.org.cn" and internet keyword "wekan" and have submitted our application. We are waiting for Mr. Frank Liu's approval. These CN domains and internet keyword are very important for us to promote our business in China. Although Mr. Frank Liu advised us to change another name, we will persist in this name.
|
||||
|
||||
Kind regards
|
||||
|
||||
Zhihai Ning
|
||||
|
||||
### 2023-12-18 From chinaregistrar.org.cn , about "WeiRong Holdings Ltd"
|
||||
|
||||
Dear Manager,
|
||||
|
||||
(If you are not the person who in charge of this, please forward this to your CEO, because this is urgent. Thanks!)This is a formal email.We are the domain registration and solution center in China.
|
||||
|
||||
On December 18, 2023, we received an application from WeiRong Holdings Ltd requested “wekan” as their internet keyword and China (CN) domain names( wekan.cn/ wekan.com.cn/ wekan.net.cn/ wekan.org.cn).
|
||||
|
||||
After checking it, we find this name conflict with your company name or trademark.In order to deal with this matter better, we send email to you and confirm whether this company is your distributor or business partner in China?
|
||||
|
||||
Best Regards
|
||||
|
||||
Jason
|
||||
|
||||
## Fake companies trying to register xet7 domains
|
||||
|
||||
### 2023-12-22 From Hunjun Zhang, hunjun_zhang at 163 dot com, of WeiRong Holdings Ltd
|
||||
|
||||
To whom it concerns,
|
||||
|
||||
We will register the China domain names “xet7.cn” "xet7.com.cn" "xet7.net.cn" "xet7.org.cn" and internet keyword "xet7” and have submitted our application. We are waiting for Mr.Martin Wang approval and think these CN domains and internet keyword are very important for our business. Even though Mr.Martin Wang advises us to change another name, we will persist in this name.
|
||||
|
||||
Best Regards
|
||||
|
||||
Hunjun Zhang
|
||||
|
||||
### 2023-12-20 From tldschina.com , about "WeiRong Holdings Ltd"
|
||||
|
||||
Dear Manager,
|
||||
|
||||
(If you are not the person who in charge of this, please forward this to your CEO, because this is urgent.Thanks!)
|
||||
I'm Martin Wang, Services & Operating Manager, from Network Service Company which is the domain name registration center in Shanghai, China.
|
||||
|
||||
On December 18, 2023, we received an application from WeiRong Holdings Ltd requested “xet7” as their internet keyword and China (CN) domain names( xet7.cn xet7.com.cn xet7.net.cn xet7.org.cn).
|
||||
|
||||
After checking it, we find this name conflict with your company name or trademark. In order to deal with this matter better, we send email to you and confirm whether or not your company have affiliation with this company in china?
|
||||
|
||||
Kind regards
|
||||
|
||||
Martin
|
||||
|
||||
## Other spam from spam company "WeiRong Holdings Ltd" of domain 163 com
|
||||
|
||||
From: jackyoptic at 163 dot com
|
||||
|
||||
Re: 2.3USD for 1.25G SFP Module 1310nm 20km DDM Cisco Juniper Compatible GLC-LH-SMD
|
||||
|
||||
Hello.
|
||||
|
||||
We produce the Fiber Optical Module Transceiver for many years, our SFP module could compatibled Cisco, Aruba, HPE, Juniper Mikrotik ADVA .... router, switch for many years,
|
||||
|
||||
If you need below equipments, please call me.
|
||||
|
||||
SFP Optical Transceiver 155M, 1.25G
|
||||
|
||||
SFP+ 10G Optical Transceiver
|
||||
|
||||
XFP 10G Optical Transceiver
|
||||
|
||||
X2 10G Optical Transceiver
|
||||
|
||||
25G QSFP+ Optical Transceiver
|
||||
|
||||
40G QSFP+ Optical Transceiver
|
||||
|
||||
100G QSFP28, CFP, CFP2, CFP4, CXP Optical Transceiver
|
||||
|
||||
SFP+ 10G DAC, AOC Cable
|
||||
|
||||
QSFP 40G DAC, AOC Cable
|
||||
|
||||
QSFP100G DAC, AOC Cable
|
||||
|
||||
.... etc
|
||||
|
||||
GLC-LH-SMD, 1.25G 1310NM, 10KM, With DDM
|
||||
|
||||
$2.3/PC
|
||||
|
||||
|
||||
10G SFP+ SR, 10G 850NM 300M With DDM
|
||||
|
||||
$4.3/PC
|
||||
|
||||
|
||||
All the Optical Transceiver offer 4years warranty, we could offer OEM, print your logo on the labels and offer the SFP code to customer
|
||||
|
||||
Our SFP could change the soft code, if you want compatible with Cisco, Finisar, HP, Mikrotik, Juniper, Extreme, HUAWEI, ZTE...., only need change the SFP code, no need keep many stock.
|
||||
|
||||
If you need catalog and pricelist, please reply our email, I will send you more information.
|
||||
|
||||
Regards,
|
||||
|
||||
Jacky
|
||||
|
||||
## WeKan Enterprise Solutions
|
||||
|
||||
xet7 does not know, what is this company? It is not related to WeKan kanban.
|
||||
|
||||
- https://www.wekanenterprisesolutions.com
|
||||
- https://www.linkedin.com/company/wekanenterprisesolutions/
|
||||
- https://in.linkedin.com/company/wekanenterprisesolutions/
|
||||
|
||||
## Wekan France
|
||||
|
||||
xet7 does not know, what is this company? It is not related to WeKan kanban.
|
||||
|
||||
- https://www.linkedin.com/company/wekan-france/
|
||||
@@ -0,0 +1,616 @@
|
||||
# Wekan - Open Souce kanban - IRC FAQ
|
||||
|
||||
- [Wekan website](https://wekan.github.io)
|
||||
|
||||
### If you are in a hurry, please don't use IRC
|
||||
|
||||
Instead, [please search existing open and closed issues or add new issue to Wekan Feature Requests and Bugs](https://github.com/wekan/wekan/issues) (open issues have not been solved yet), or alternatively [read docs](https://github.io/wekan/wekan/wiki). Thanks!
|
||||
|
||||
### Required license to enter IRC channel
|
||||
|
||||
License:
|
||||
|
||||
[_] If you ask something, you will wait patiently on IRC channel for answer, idling for at least a week, and not leave IRC channel immediately.
|
||||
|
||||
### Congratulations! If you agree with IRC license above, you can join Wekan IRC channel
|
||||
|
||||
Wekan IRC is `#wekan` channel at:
|
||||
- Libera.Chat
|
||||
- (or OFTC)
|
||||
|
||||
Unfortunately Freenode `#wekan` was taken over by Freenode admins, so it's no longer in use.
|
||||
|
||||
***
|
||||
|
||||
## QA, answers by [xet7](https://github.com/xet), Maintainer of Wekan
|
||||
|
||||
## Answers to IRC questions are added to this wiki page, because most coming to IRC channel leave immediately, and don't wait for answer. Real IRC users know idling and stay at IRC channel. It is required that you read everything in this page before coming to IRC channel.
|
||||
***
|
||||
### Q: Max 20 comments visible?
|
||||
```
|
||||
[16:11:09] <Dalisay> hi
|
||||
[16:11:23] <Dalisay> and here we go again, again wekan
|
||||
has been released without enough testing
|
||||
[16:11:31] <Dalisay> Comments can NOT be added any more
|
||||
[16:11:42] <Dalisay> the comments only show in
|
||||
the comment-counter on the minicard
|
||||
[16:11:53] <Dalisay> but, the comments are
|
||||
not visible when scrolling down
|
||||
```
|
||||
A: What new Wekan release? I tested newest versions Wekan for Snap/Docker/Sandstorm, and comments can be added to card. Please add new issue with more details https://github.com/wekan/wekan/issues
|
||||
|
||||
If you mean bug about [only 20 newest comments visible](https://github.com/wekan/wekan/issues/2377), that bug is fixed on non-public boards. I will add more fixes to that.
|
||||
|
||||
### Q: Contributing to Wekan?
|
||||
```
|
||||
[16:12:54] <Dalisay> yes, it's open source
|
||||
[16:12:57] <Dalisay> yes, it's free
|
||||
[16:13:02] <Dalisay> but this is not okay any more
|
||||
[16:13:27] <Dalisay> if this does not change, I will
|
||||
gather a group of developers to make a reasonable fork
|
||||
```
|
||||
A: I don't know why you think fork would be necessary. I welcome all new contributors and co-maintainers, and help them to get up to speed. You can send your pull requests to Wekan https://github.com/wekan/wekan/pulls . I do have also [blog post about it](https://blog.wekan.team/2018/02/benefits-of-contributing-your-features-to-upstream-wekan/index.html). All what I do on Wekan is based of feedback at GitHub issues, chats and emails. Wekan is friendly Community driven Open Source project. I do also provide [Commercial Support](https://wekan.team/commercial-support) for features and fixes.
|
||||
|
||||
### Q: CPU usage?
|
||||
```
|
||||
[16:14:01] <Dalisay> in my opinion, the board is still in
|
||||
an eary RC state, and not stable by any means
|
||||
[16:14:04] <Dalisay> so many bugs all the time
|
||||
[16:14:09] <Dalisay> we are not talking about minor bugs.
|
||||
[17:50:41] <Dalisay> oh, and the VERY old bug is also back again:
|
||||
[17:50:42] <Dalisay> https://pastebin.com/raw/qpPiaWp6
|
||||
[17:50:53] <Dalisay> CPU overload because of wekan
|
||||
[17:51:43] <Dalisay> this is the fastest server we have
|
||||
ever run, and wekan is the only software on it
|
||||
[17:51:48] <Dalisay> yet, it still overpowers the CPU
|
||||
[17:51:59] <Dalisay> wekan is really not ready to be used on a daily basis
|
||||
[17:52:12] <Dalisay> We have many boards and many users, and we rely on wekan
|
||||
[17:52:23] <Dalisay> it disrupts our work life more than it helps us
|
||||
[17:53:01] <Dalisay> no matter if wekan is open source or not,
|
||||
some minimum standards of quality should be maintained
|
||||
[17:55:37] <Dalisay> Here, that's a bug from the year 2016 !
|
||||
[17:55:38] <Dalisay> https://github.com/wekan/wekan/issues/718
|
||||
[17:55:44] <Dalisay> this bug is 3 years old
|
||||
[17:56:00] <Dalisay> that's again not a minor thing
|
||||
[17:56:11] <Dalisay> that's a major thing that disrupts the work flow
|
||||
[17:56:20] <Dalisay> it means, that the server admin will be called
|
||||
all the time to restart the board
|
||||
```
|
||||
A: Yes, that bug is back, to fix 2 other bugs. [I added explanation](https://github.com/wekan/wekan/issues/718#issuecomment-561377824). CPU usage is getting improved in newer Wekan releases.
|
||||
|
||||
***
|
||||
### Q: Import multiple Trello boards?
|
||||
|
||||
```
|
||||
[13:15:32] <netopejr> Hello, i there way how to import multiple
|
||||
Trello booards? I have over 100 boards which i need to migrate
|
||||
to Wekan. Importing via add board -> import -> from trello
|
||||
works more or less but its time consuming.
|
||||
```
|
||||
|
||||
A: This will be implemented sometime with [Mass Import from Trello](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/RNTZ8NAm46mAeEDev)
|
||||
|
||||
### Q: Fork?
|
||||
```
|
||||
[15:24:31] <Dalisay> hi
|
||||
[15:25:13] <Dalisay> I don't mean to come across ungrateful.
|
||||
[15:25:29] <Dalisay> But I really want to mention, that wekan should be
|
||||
tested much better before releasing a new version.
|
||||
[15:25:46] <Dalisay> It's not important to release a new version every day.
|
||||
[15:25:58] <Dalisay> It's okay if there is a new version only every 2 weeks.
|
||||
[15:26:09] <Dalisay> But whenever there is a new version, it should be stable.
|
||||
[15:26:14] <Dalisay> really stable. rocksolid.
|
||||
[15:26:32] <Dalisay> We can not move cards!
|
||||
[15:26:35] <Dalisay> We can not add cards
|
||||
[15:27:00] <Dalisay> and when I run "snap revert wekan", I get the other
|
||||
version which has the bug of the unsorted columns
|
||||
[15:28:10] <Dalisay> I really understand that it's open source and
|
||||
free software.
|
||||
[15:28:24] <Dalisay> But people trust wekan in real life. They use it
|
||||
on a daily basis in their work life.
|
||||
[15:28:36] <Dalisay> It's a nightmare, when you come to work in the
|
||||
morning, and nothing works any more
|
||||
[15:28:55] <Dalisay> The previous version has a major bug (the lists
|
||||
that could not be sorted and showed in the wrong order)
|
||||
[15:29:06] <Dalisay> and the current version is also buggy
|
||||
(can't move cards / can't add new cards)
|
||||
[15:29:20] <Dalisay> These updates come via snap automatically.
|
||||
[15:29:27] <Dalisay> That involves a lot of trust.
|
||||
[15:30:51] <Dalisay> There really must be more testing.
|
||||
[15:31:14] <Dalisay> Also the github issues page has reports already.
|
||||
[15:32:20] <Dalisay> This user also explains what I just said:
|
||||
[15:32:21] <Dalisay> https://github.com/wekan/wekan/issues/2814#issuecomment-555427628
|
||||
[15:33:20] <Dalisay> "snap revert wekan" messes up the list order
|
||||
because this was a bug in the previous version
|
||||
[15:33:30] <Dalisay> so there is no bug-free version available now.
|
||||
[15:33:36] <Dalisay> I am not talking about small bugs.
|
||||
[15:34:03] <Dalisay> these are all bugs that massively mess up the
|
||||
functionality to a degree, that it renders the board useless
|
||||
[15:34:42] <Dalisay> Wekan is such a promising project.
|
||||
[15:34:47] <Dalisay> But the testing must be much better.
|
||||
[15:54:46] <Dalisay> aaaaaaaaaaaand OPENING cards on Samsung
|
||||
phones & tablets stopped working again!
|
||||
[15:54:55] <Dalisay> it worked in the "edge" version of wekan
|
||||
[15:54:59] <Dalisay> now it does not work any more
|
||||
[15:55:12] <Dalisay> cards can NOT be opened any more on Samsung phones & tablets
|
||||
[15:55:24] <Dalisay> constantly, there is something that breaks
|
||||
[15:55:53] <Dalisay> Really, wekan could be so promising,
|
||||
but I think it's time for a fork
|
||||
[15:58:56] <Dalisay> https://github.com/wekan/wekan/issues/2814
|
||||
[15:59:22] <Dalisay> https://github.com/wekan/wekan/issues/2810
|
||||
[16:00:14] <Dalisay> bye, cya later
|
||||
```
|
||||
A:
|
||||
- Please test newest Wekan
|
||||
- Do you have time to be Wekan co-maintainer?
|
||||
- What is URL to your fork? Please send it to me with email to x@xet7.org . Thanks! Currently there is about 2200 forks of Wekan, it would be hard to find without exact URL.
|
||||
- What features and fixes have you implemented to Wekan?
|
||||
- [What usually happens when Wekan gets broken](Test-Edge#what-usually-happens-when-wekan-gets-broken).
|
||||
- [Benefits of contributing your features to upstream Wekan](https://blog.wekan.team/2018/02/benefits-of-contributing-your-features-to-upstream-wekan/index.html).
|
||||
- [What was Wekan fork](FAQ#what-was-wekan-fork--wefork).
|
||||
|
||||
***
|
||||
### Q: Other mobile browsers?
|
||||
```
|
||||
[12:48:54] <MarioSC> For example, on an Oppo phone, clicking on cards
|
||||
works in Google Chrome.
|
||||
[12:49:12] <MarioSC> On Samsung devices, clicking on cards fails
|
||||
```
|
||||
A: Please try newest Wekan.
|
||||
|
||||
### Q: Colored text?
|
||||
```
|
||||
[13:06:20] <MarioSC> Whenever we want to make titles or
|
||||
descriptions or comments colored, we must use
|
||||
outdated (deprecate) html tags
|
||||
[13:06:43] <MarioSC> <span style="color:#ff0000;">
|
||||
Important</span> won't work
|
||||
[13:06:49] <MarioSC> so we have to go with:
|
||||
[13:06:55] <MarioSC> <font color="red">Important</font>
|
||||
[13:07:04] <MarioSC> which is really deprecated
|
||||
[13:07:21] <MarioSC> Ideal would be, if the board
|
||||
understood all kinds of html...
|
||||
[13:07:25] <MarioSC> especially things like:
|
||||
[13:07:42] <MarioSC> font-weight
|
||||
[13:07:45] <MarioSC> text-decoration
|
||||
[13:07:51] <MarioSC> font-variant
|
||||
[13:07:56] <MarioSC> color
|
||||
[13:08:00] <MarioSC> background-color
|
||||
```
|
||||
A: Currently [some GitHub markdown](https://guides.github.com/features/mastering-markdown/)
|
||||
works. It needs some research is it possible
|
||||
to enable more html, or have visual editor
|
||||
elsewhere.
|
||||
|
||||
|
||||
### Q: Wekan on mobile Chrome?
|
||||
```
|
||||
[15:49:52] <Rojola1> xet7, I saw your answer to the
|
||||
mobile card question
|
||||
[15:50:13] <Rojola1> it really won't work in Chrome
|
||||
[15:50:19] <Rojola1> everyone in the organization
|
||||
has the same issue
|
||||
[15:50:27] <Rojola1> every phone, every tablet
|
||||
[15:50:40] <Rojola1> Chrome in the newest version,
|
||||
even in the dev-version
|
||||
```
|
||||
A: Please try newest Wekan.
|
||||
|
||||
### Q: Older Node version?
|
||||
|
||||
```
|
||||
[16:47:42] <imestin> Is Wekan compatible with older
|
||||
versions of Node?
|
||||
```
|
||||
A: You can try, but older Node versions have
|
||||
security issues that are fixed in newest Node version.
|
||||
|
||||
### Q: Wekan crashing?
|
||||
|
||||
```
|
||||
[15:20:04] <Rojola> hi
|
||||
[15:20:12] <Rojola> xet7, are you there by any chance?
|
||||
[15:20:18] <Rojola> I told you about my problems with
|
||||
wekan
|
||||
[15:20:23] <Rojola> now, at this very moment, I am having
|
||||
one
|
||||
[15:20:30] <Rojola> Normally I just restart the board to
|
||||
keep working
|
||||
[15:20:48] <Rojola> but it's a Saturday, so nobody
|
||||
currently works on the board, and I can let the board
|
||||
struggle without restarting it
|
||||
[15:20:54] <Rojola> this gives us time for finding
|
||||
out what's wrong
|
||||
[15:21:21] <Rojola> the error in the browser reads:
|
||||
[15:21:22] <Rojola> ---
|
||||
[15:21:24] <Rojola> This page isn’t working
|
||||
[15:21:24] <Rojola> ***.***.***.*** didn’t send any data.
|
||||
[15:21:24] <Rojola> ERR_EMPTY_RESPONSE
|
||||
[15:21:25] <Rojola> ---
|
||||
[15:21:29] <Rojola> ^ I masked the IP
|
||||
[15:22:03] <Rojola> I added many cards to the board, and
|
||||
I had no idea, that the server died in the background
|
||||
[15:22:15] <Rojola> so, if I restart the board now,
|
||||
I will loose all the cards which I added
|
||||
[15:23:21] <Rojola> I heavily depend on wekan for
|
||||
my life, and it scares me when it glitches
|
||||
[15:23:31] <Rojola> especially since the board
|
||||
struggles so much so often
|
||||
[15:23:49] <Rojola> also an issue is, when I add
|
||||
cards, and then they vanish
|
||||
[15:24:09] <Rojola> that happened a short while
|
||||
ago - I added 2 cards, then they were gone
|
||||
[15:44:02] <Rojola> xet7, I realized, the
|
||||
server is not dead.
|
||||
[15:44:08] <Rojola> It's just very, very,
|
||||
very slow
|
||||
[15:44:21] <Rojola> after like... an hour...
|
||||
a board loaded
|
||||
[15:44:31] <Rojola> most cards are lost, though
|
||||
[15:44:55] <Rojola> I don't know how to
|
||||
bugfix this
|
||||
```
|
||||
A: You should upgrade to newest Wekan, or
|
||||
be online when xet7 is online to debug.
|
||||
xet7's own boards are not crashing.
|
||||
|
||||
***
|
||||
### Q: Unsaved changes indicator?
|
||||
|
||||
A: Added Feature Request https://github.com/wekan/wekan/issues/2537
|
||||
|
||||
***
|
||||
### Q: Wekan on Sandstorm features?
|
||||
At IRC #sandstorm
|
||||
```
|
||||
[20:40:57] <pwa2> are desktop notifications from
|
||||
wekan possible in sandstorm? I see references to
|
||||
notifications throughout the code, but haven't
|
||||
been able to answer this question on my own. Thanks.
|
||||
[21:05:22] <xet7> pwa2: Wekan does not yet have push
|
||||
notifications https://github.com/wekan/wekan/issues/2026 ,
|
||||
sometime they will be added. I don't know yet would
|
||||
they work on Sandstorm, because I can't test yet.
|
||||
[21:11:38] <pwa2> @xet7 thanks!
|
||||
[21:12:11] <xet7> :)
|
||||
[21:16:59] <pwa2> i've read the issue reports regarding
|
||||
email notifications in wekan, where they have to be
|
||||
configured both at the board level and at the member
|
||||
settings level. However, the wekan app in sandstorm does
|
||||
not have the "Edit Notifications" menu item. So are
|
||||
email notifications from Wekan under Sandstorm not
|
||||
implemented either? Or is there some configuration
|
||||
switch someplace? "Change Password" and
|
||||
"Change Language" are also missing from Member Settings
|
||||
under Sandstorm, which makes some sense.
|
||||
[21:19:58] <xet7> pwa2: I need to add code to Wekan
|
||||
to enable Wekan to send email at Sandtorm
|
||||
https://github.com/wekan/wekan/issues/2208#issuecomment-469290305
|
||||
[21:20:52] <xet7> pwa2: Sandstorm apps need special
|
||||
code for accessing outside secure sandboxed grain
|
||||
[21:21:57] <pwa2> @xet7 thanks again!
|
||||
[21:23:10] <xet7> pwa2: It's not possible to change
|
||||
password in Sandstorm, because Sandtorm does not store
|
||||
passwords at all, it has 3rd party auth
|
||||
Google/LDAP/Passwordless etc. I only recently enabled
|
||||
multiple boards, not all of user management is
|
||||
implemented yet https://github.com/wekan/wekan/issues/2405
|
||||
[21:23:44] <xet7> pwa2: I will fix all those,
|
||||
but it takes some time to develop.
|
||||
```
|
||||
|
||||
***
|
||||
### Q: Board crashes?
|
||||
|
||||
```
|
||||
<Rojola> Board crashes on server that has Wekan and RocketChat installed.
|
||||
<Rojola> /var/log/syslog contains a lot
|
||||
```
|
||||
A: Well, what does /var/log/syslog contain?
|
||||
Without that info it's kind of hard to debug.
|
||||
|
||||
You could try export that board to Wekan JSON, and then import that Wekan JSON.
|
||||
|
||||
I do have server at AWS LightSail that has 4 GB RAM and 60 GB SSD,
|
||||
running [Snap versions of Wekan and RocketChat installed this way](OAuth2)
|
||||
on same server, and it does not crash.
|
||||
|
||||
BTW, I did yesterday release [Wekan v2.95 with these new features](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v295-2019-07-01-wekan-release).
|
||||
|
||||
***
|
||||
### Q: Board cleanup?
|
||||
|
||||
```
|
||||
[18:02:20] <Rojola> hi
|
||||
[18:02:29] <Rojola> May I please ask for help bugfixing a wekan board?
|
||||
[18:02:53] <Rojola> There are many boards with many cards,
|
||||
and since about 2 days, everything got very, very, very slow
|
||||
[18:03:06] <Rojola> we must restart the board every
|
||||
2 minutes to be able to access it
|
||||
[18:03:11] <Rojola> it's a nightmare
|
||||
[18:03:23] <Rojola> you add a card / comment, just to realize,
|
||||
it has not been saved to the server
|
||||
[18:03:38] <Rojola> the board has stopped working after over 1,5 years
|
||||
[18:17:03] <Rojola> I'm AFK for a while, but I will check
|
||||
for answers a little later
|
||||
[23:44:45] <Rojola> is there still nobody around?
|
||||
[02:25:22] <Rojola1> is anyone here?
|
||||
[02:25:24] <Rojola1> xet7?
|
||||
[02:25:27] <Rojola1> anyone?
|
||||
```
|
||||
A: I was at meeting or sleeping when you asked. When I came back to IRC you were not online. Anyway, you can [make backup](Backup) and do some [cleanup](https://github.com/wekan/wekan-cleanup) to delete 1,5 years worth of activities etc. Next time, if you have questions, you get faster answers at [GitHub issues](https://github.com/wekan/wekan/issues), because I get email notifications of all new issues and comments on issues.
|
||||
|
||||
***
|
||||
### Q: Rules as code?
|
||||
|
||||
```
|
||||
[23:40:03] <IRC-Source_15> Hey does anyone know
|
||||
if it is possible to code in rules (as opposed to using the front end UI)?
|
||||
```
|
||||
A: Not yet. There are [Rules issues](https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aopen+rules+label%3AFeature%3ACards%3AIFTTT-Rules) about Rules variables. If you have ideas how to make translated Rules UI have also translated code, please add new GitHub issue Feature Request or PR.
|
||||
|
||||
***
|
||||
### Q: LDAP Bug: [ERROR] InvalidCredentialsError: 80090308: LdapErr: DSID-0C090400
|
||||
|
||||
```
|
||||
[14:58:26] hello everyone. I am getting this erro:
|
||||
[14:58:30] Error
|
||||
[14:58:31] [ERROR] InvalidCredentialsError: 80090308:
|
||||
LdapErr: DSID-0C090400, comment: AcceptSecurityContext error, data 52e, v1db1
|
||||
[14:59:19] can someone check this and tell me if I did
|
||||
something wrong? : https://paste.ee/p/uuUDb
|
||||
[14:59:33] The credentials are correct
|
||||
[15:26:09] This is the error in my syslog: https://paste.ee/p/mJdtL
|
||||
```
|
||||
A: https://github.com/wekan/wekan/issues/2490
|
||||
|
||||
### Q: LDAP Group Filtering
|
||||
|
||||
```
|
||||
[13:17:27] <leOff> hi everyone
|
||||
[13:18:07] <leOff> was wondering if i could get some help regarding ldap
|
||||
group filtering .. documentation is pretty much inexistent
|
||||
[13:19:58] <leOff> in particular, what exactly are the keys
|
||||
ldap-group-filter-member-attribute ,
|
||||
ldap-group-filter-member-format and ldap-group-filter-member-name
|
||||
supposed to point to
|
||||
[13:21:15] <leOff> ldap-group-filter-member-attribute is it
|
||||
the membership attribute which is part of the user entry,
|
||||
or is it the member list attribute in the group entry?
|
||||
[13:21:59] <leOff> ldap-group-filter-member-format ...
|
||||
this one i have no idea what might be
|
||||
[13:23:20] <leOff> and finally, ldap-group-filter-member-name
|
||||
is it and enumeration of the group names
|
||||
(related to ldap-group-filter-member-attribute probably)
|
||||
which are allowed to login?
|
||||
[13:25:30] <leOff> I REALLY would like to limit my groups
|
||||
available since i have some very large groups .. up to 15k users
|
||||
```
|
||||
A: https://github.com/wekan/wekan/issues/2356#issuecomment-494573761
|
||||
|
||||
### Q: Copying Checklists?
|
||||
|
||||
```
|
||||
[09:25:51] <sfielding> I have now about one year of exp with Wekan
|
||||
usage somewhat daily, and it has become my favourite productivity tool.
|
||||
[09:27:36] <sfielding> Initially we used it with Sandstorm, but
|
||||
because of closed sandbox model we changed into standalone snap install.
|
||||
[09:28:02] <sfielding> Ldap integration works as expected
|
||||
[09:34:42] <sfielding> Only situation where I end up using tedious
|
||||
copy & paste string transferring is when moving checklists
|
||||
from one card to another.
|
||||
[12:49:45] <xet7> sfielding: click card hamburger menu =>
|
||||
Copy Checklist Template to Many Cards
|
||||
```
|
||||
|
||||
### Q: LDAP?
|
||||
|
||||
A: [LDAP for Standalone is now available](LDAP).
|
||||
|
||||
```
|
||||
[17:56:10] <regdude> Hi! I'm trying to setup Wekan with LDAP,
|
||||
but can't seem to get it to work.
|
||||
Where could I found logs for why LDAP is not working?
|
||||
[17:56:18] <regdude> does not seem to send out any LDAP packets
|
||||
[17:58:31] <regdude> oh, it does not do anything
|
||||
```
|
||||
|
||||
Please see is there existing issues at [LDAP Bugs and Feature Requests](https://github.com/wekan/wekan-ldap/issues), or add a new one.
|
||||
|
||||
### Q: Is there in Wekan: My Cards: List of all boards/lists/cards for every card where person is assigned to card ?
|
||||
```
|
||||
[15:25:23] <superlou> If I have a Wekan board per project, with people assigned
|
||||
cards in multiple projects, is there a way to provide a list of the tasks for
|
||||
a person across all of their projects?
|
||||
```
|
||||
|
||||
A: Yes. Click right top your username / My Cards.
|
||||
|
||||
### Q: Wekan Internal Server Error
|
||||
|
||||
2018-11-09
|
||||
|
||||
```
|
||||
[20:45:22] <Rojola> hi
|
||||
[20:45:35] <Rojola> Before I came here, I tried to find a solution myself
|
||||
[20:46:17] <Rojola> e.g. I read the error log, read the installation troubleshooting docs, did research, and played around with the SMTP settings
|
||||
[20:46:52] <Rojola> then I joined #sandstorm but nobody replied
|
||||
[20:47:07] <Rojola> The problem:
|
||||
[20:47:31] <Rojola> I always get an "Internal Server Error" when I try to send me the registration email
|
||||
[20:49:15] <Rojola> https://filebin.net/11q54qsyd7rigpiq/internal_server_error.png?t=ziblx18b
|
||||
[20:49:28] <Rojola> in theory, sandstorm + wekan is installed
|
||||
[20:49:35] <Rojola> but, in reality I can not access it
|
||||
```
|
||||
|
||||
A: See 4) at https://github.com/wekan/wekan/wiki/Adding-users . This is Stanalone Wekan (Snap, Docker, Source) email setting. This has nothing to do with Sandstorm.
|
||||
|
||||
***
|
||||
|
||||
### Q: 2018-11-07 Answer speed
|
||||
```
|
||||
[12:50:46] <gros> hey
|
||||
[12:53:45] <gros> I won't whine, because I know sometimes it is
|
||||
hard to answers to user's questions, but I'm here
|
||||
since several days, I see that other users asks some things,
|
||||
and no one is answering
|
||||
[12:58:11] <gros> I think that you could close this channel in fact,
|
||||
it will make win time for users
|
||||
[12:58:24] <gros> and again I don't whine, thanks for the great Wekan :)
|
||||
```
|
||||
A:
|
||||
|
||||
- Fastest: If you want fast answers, get [Commercial Support](https://wekan.team/commercial-support/).
|
||||
- Medium speed: If you have time to wait, [add new GitHub issue](https://github.com/wekan/wekan/issues).
|
||||
- Slow: [Wekan Community Chat with webbroser and mobile Rocket.Chat](https://chat.vanila.io/channel/wekan)
|
||||
- Slowest: If you want to chat on IRC, please stay at IRC idling, and ask question again also at some other day. Sometimes there is Internet connectivity issues, if it looks like xet7 is not online. IRC is very nice, some Wekan users prefer it. Answers to IRC questions are added to this wiki page, because most coming to IRC channel leave immediately, and don't wait for answer.
|
||||
|
||||
***
|
||||
|
||||
### Q: SMTP sending to own domain but not Gmail
|
||||
```
|
||||
[16:18:47] <k_sze> Does anybody have an idea why I can send e-mail from Wekan
|
||||
to my personal domain, but not to a Gmail address?
|
||||
[17:34:16] <k_sze> And now Wekan doesn't actually work. I set it up
|
||||
from Snap on Ubuntu 18.04.
|
||||
[17:34:32] <k_sze> (Wekan doesn't work after I reboot Ubuntu)
|
||||
[17:38:51] <k_sze> Like, I get 502 Bad Gateway from my nginx reverse proxy
|
||||
```
|
||||
|
||||
A: Did you set your domain SPF records (as TXT records) and DKIM records on your domain that your SMTP server uses? Problem is not in Wekan, it's your SMTP server. For example AWS SES works. Also see [Troubleshooting Email](Troubleshooting-Mail).
|
||||
|
||||
***
|
||||
|
||||
### Q: Integrating Wekan
|
||||
```
|
||||
[03:32:12] <ajay> Hi can anyone tell me how to integrate wekan in
|
||||
other applications
|
||||
[03:32:50] <ajay> i am want to integrate it in QGIS for task management
|
||||
[03:33:01] <ajay> *i want
|
||||
```
|
||||
A: Use [Wekan REST API](REST-API). For example, see [Wekan Gogs integration](https://github.com/wekan/wekan-gogs). You can also use [Outgoing Webhooks](Outgoing-Webhook-to-Discord) to send data to some Incoming Webhook. There is also [IFTTT Rules](IFTTT) for some automations.
|
||||
|
||||
***
|
||||
|
||||
### QA: Rescuing Subtask board
|
||||
```
|
||||
[18:33:29] <wekanuser> hello I have a wekan board that
|
||||
never loads, I just get the spinner. all the other
|
||||
boards are working fine. This happened after we moved
|
||||
some subtasks from a subtask board to the main board.
|
||||
any tips would be appreciated. thanks.
|
||||
[18:33:58] <xet7> wekanuser: What Wekan version?
|
||||
[18:34:45] <xet7> Can you move subtasks back to subtask board?
|
||||
[18:42:02] <wekanuser> v 1.55.0. re: move tasks back to
|
||||
subtask board - I can't, since the parent board will not load.
|
||||
[18:42:35] <wekanuser> - I was in subtask board, and moved
|
||||
manually each subtask over to parent board. Then went to
|
||||
parent board and it will not load.
|
||||
[18:43:28] <wekanuser> - the cards would not load on
|
||||
the main board, but I was able to make an "export"
|
||||
of the board from the GUI and re-imported it, to another
|
||||
board but only a fraction of the stories and swimlanes were there.
|
||||
[18:43:58] <wekanuser> - when I accessed the parent board
|
||||
via the rest api, I see all my cards, looks like everything is there
|
||||
[18:44:07] <wekanuser> - so something is hanging on loading the board
|
||||
[18:44:32] <xet7> Do you still need subtasks on board?
|
||||
[18:45:09] <wekanuser> no, since the subtasks on the subtasks
|
||||
board have been moved, there should be nothing "linking" there
|
||||
[18:46:11] <xet7> Do you see any subtask related in
|
||||
exported JSON file? So you could remove subtasks from it before importing?
|
||||
[18:47:06] <wekanuser> thanks, I will check
|
||||
[18:47:34] <xet7> Does the exported JSON file have all data of
|
||||
that board? You could check do you see same as with API
|
||||
[18:47:56] <xet7> You can also create new board that is
|
||||
similar structure of your exported board, and compare structure
|
||||
[18:48:52] <xet7> Also please add new issue to
|
||||
https://github.com/wekan/wekan/issues about what happened,
|
||||
so somebody can think how to prevent that happening.
|
||||
[18:52:53] <wekanuser> it appears the json file has all the data
|
||||
[18:54:04] <xet7> Nice :) Then you can compare it with similar
|
||||
working board, what is different
|
||||
[18:54:39] <xet7> Does it have any custom fields?
|
||||
[18:55:02] <xet7> sometimes removing custom fields makes import work
|
||||
[18:56:05] <wekanuser> yes there are custom fields, I will consider
|
||||
trying that. re: removing subtasks, you mean the subtask cards?
|
||||
or the subtask references in parent cards?
|
||||
[18:56:27] <xet7> Try first remove subtask references
|
||||
[18:56:49] <xet7> compare to other exported board JSON that
|
||||
does not have any subtasks
|
||||
[18:57:38] <xet7> You don't need to try removing
|
||||
custom fields yet, there has been some custom fields fixes
|
||||
[18:58:14] <xet7> I would think that when there is
|
||||
references to not existing subtasks then that could bring those problems
|
||||
[19:10:37] <wekanuser> thanks, working on remove subtask refs'
|
||||
[19:12:31] <wekanuser> I assume that is making
|
||||
parentId :"" empty,
|
||||
as I see only subtasks referencing parents,
|
||||
not parents referencing subtasks
|
||||
[21:54:39] <wekanuser> update: process of elimination
|
||||
lead to the import board working if I remove all all
|
||||
activities from the json file before import
|
||||
[21:56:47] <xet7> Nice :) Then I think I should not
|
||||
include activities in export.
|
||||
[22:03:06] <wekanuser> is there an option to exclude
|
||||
things from export? I only see the "BUTTON" that does an export
|
||||
[22:06:16] <xet7> not yet
|
||||
[22:07:19] <wekanuser> I am probing for possible bad activity item
|
||||
[22:08:00] <xet7> Probably some activity types are not imported correctly
|
||||
[19:22:59] <wekanuser> thanks for the help yesterday,
|
||||
board has been restored. I will document my issue in a real ticket,
|
||||
hopefully it will help someone else. Thanks again
|
||||
[19:23:13] <xet7> :)
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
### QA: Wekan in iFrame
|
||||
```
|
||||
[17:42:12] <siqueira> Hi, I want to embed my Kanban
|
||||
from wekan in my website using iframe. Does Wekan
|
||||
support this feature?
|
||||
[18:13:59] <xet7> siqueira: Yes, set trusted-url to
|
||||
your web address that iframes Wekan
|
||||
https://github.com/wekan/wekan-snap/wiki/Supported-settings-keys
|
||||
[18:15:35] <xet7> siquiera: If you have problems with browser
|
||||
javascript console, or something not working, you can
|
||||
also set browser-policy-enabled='false' that enables
|
||||
all iframing - but that has a little less security
|
||||
[18:18:13] <xet7> siquiera: Problem with iframing
|
||||
Wekan is that link to card does not work well.
|
||||
For that it's better to have Wekan in sub-url, and
|
||||
add "iframe" replacing HTML/CSS at beginning of
|
||||
body tag, and at end of body tag, but that
|
||||
feature is not yet in Wekan, I'm currently developing it.
|
||||
[19:25:07] <siqueira> xet7, Thanks a lot
|
||||
for the information! I just want to have my
|
||||
public tasks on my website. I think the
|
||||
browser-policy-enabled can solve my problem,
|
||||
until I wait for the new feature. Thanks :)
|
||||
[19:25:51] <xet7> siqueira: You can set
|
||||
board as public, and provide that public link in iframe.
|
||||
[19:27:32] <siqueira> I will try it :)
|
||||
```
|
||||
A: Currently having Wekan in iframe is broken, because browser APIs changed. See [this issue for progress](https://github.com/wekan/wekan/issues/3875).
|
||||
|
||||
|
||||
***
|
||||
|
||||
### Q: Docker reverse proxy
|
||||
|
||||
```
|
||||
yogab> Hi! How are you today ? Can i ask
|
||||
a docker x reverse proxy x wekan question here ?
|
||||
```
|
||||
|
||||
A: Hmm, it seems you did not ask. Just guessing, maybe it's about [Traefik reverse proxy and Docker](Traefik-and-self-signed-SSL-certs).
|
||||
|
||||
***
|
||||
|
||||
## Still reading?
|
||||
|
||||
Wow, you are so cool ! You gonna be an expert guru soon.
|
||||
|
||||
Check out here for more wild stuff: https://github.com/wekan/wekan/wiki
|
||||
|
||||
There is:
|
||||
- Info about translations, dev stuff, changelog, and huge amount of Wekan features.
|
||||
@@ -0,0 +1,38 @@
|
||||
Also: [Hall of Shame: Fake companies](https://github.com/wekan/wekan/wiki/Hall-of-Shame)
|
||||
|
||||
## These are NOT in any way related to WeKan
|
||||
|
||||
### Birds
|
||||
- [Weka](https://en.wikipedia.org/wiki/Weka)
|
||||
|
||||
### Music
|
||||
- [Wekan - Skid](https://www.youtube.com/watch?v=XkqabSLgfxQ)
|
||||
- [Wekan Reworked Skid (Touché Remix)](https://www.youtube.com/watch?v=SAOfzuwOtHg)
|
||||
- [Love & Dream Trance Progressive Mix By Harris Wekan](https://www.youtube.com/watch?v=iUgerssvY5U)
|
||||
- [Trance Electro By Harris Wekan](https://www.youtube.com/watch?v=uop8DwsC7W0)
|
||||
- [Trance Sympho by Harris Wekan](https://www.youtube.com/watch?v=4ajJae6vO6Y)
|
||||
- [Trance Techno House Mix By Harris Wekan](https://www.youtube.com/watch?v=YEfye_IJLXM)
|
||||
- [Harris Wekan Vs ULTRAVOICE](https://www.youtube.com/watch?v=-NEnLzH-DTY)
|
||||
- [Vegas Acceptable In The 80's Mashup Remix By Harris Wekan](https://www.youtube.com/watch?v=_wiMZ0U0uIY)
|
||||
- [The Beatles - We Can Work it Out](https://www.youtube.com/watch?v=Qyclqo_AV2M)
|
||||
- [WeKaN- Zatańcz Dziś Dla Mnie - (Karaoke) - NOWOŚĆ 2015](https://www.youtube.com/watch?v=JrhDvcF8tBo)
|
||||
- [GWEWEKA BY JOY TENDO MATA@GOSPELMODES](https://www.youtube.com/watch?v=ak-6NC-2AJ8)
|
||||
- [APOSTLE JONATHAN GWE WEKKA OFFICIAL VIDEO FEELINGZ 256 FILMZ PRODUCTIONZ](https://www.youtube.com/watch?v=oJhwgUIsfX0)
|
||||
- [Bunda Yang Berduka - Agung Weka & St. Petrus 1 Choir](https://www.youtube.com/watch?v=yEtVcdj5D50)
|
||||
- [Richard Ronald Wekan](https://www.youtube.com/channel/UCL_DFLxVEby7MkuyTQ7W0hg)
|
||||
- [Weka Waka - Ouma Omore](https://www.youtube.com/watch?v=3FXPmRs6rDM)
|
||||
- [WEKA WEGA by joyce irungu (Official video 2018) skiza code 8633220](https://www.youtube.com/watch?v=YpIuFASiK5M)
|
||||
- [Gwe Weka Ulala Spice Diana Music](https://www.youtube.com/watch?v=-t2udMMsqJo)
|
||||
- [Dangdut New Weka Music - Egois - Yuni - Live Gabus - RJM AUDIO](https://www.youtube.com/watch?v=leRfhAcYqHE)
|
||||
|
||||
### Village Promotion
|
||||
- [Wekan Village Promotion](https://www.youtube.com/watch?v=buXuTRTysN4)
|
||||
|
||||
### Machine Learning Environment
|
||||
- [Weka](https://en.wikipedia.org/wiki/Weka_(machine_learning))
|
||||
|
||||
### Kansas
|
||||
- Kansas Sampler Foundation https://www.kansassampler.org/wekan/
|
||||
|
||||
### Drilling
|
||||
- https://www.kopadi.fi/fi/timanttityokalut/poraus/timanttiporakoneet/weka-dks-32-timanttiporakone/
|
||||
@@ -0,0 +1,59 @@
|
||||
# In English
|
||||
|
||||
### News about Wekan
|
||||
|
||||
* [Wekan v1.0 relased 2018-05-21](https://blog.wekan.team/2018/05/wekan-v1-00-released/index.html), link to it also at [HN](https://news.ycombinator.com/item?id=17120252)
|
||||
|
||||
* [Hacker News 2018-05-12: Myth of Dying Programming Language and Framework](https://news.ycombinator.com/item?id=17054264)
|
||||
|
||||
* [Hacker News 2018-05-12: Upcoming Wekan v1.00 and Platforms](https://news.ycombinator.com/item?id=17054245)
|
||||
|
||||
* [Hacker News 2018-04-07: Ask HN: Is Meteor.js dead?](https://news.ycombinator.com/item?id=16782266) - xet7 did answer about releasing Wekan v0.81 at 2018-04-10, and Wekan being used in companies that have thousands of users, so Meteor.js is not dead.
|
||||
|
||||
* [Hacker News 2018-04-02: Show HN: See GitHub issues on a Kanban board (kaizenboard.xyz)](https://news.ycombinator.com/item?id=16732329) - has comments by xet7, current maintainer of Wekan
|
||||
|
||||
* [Hacker News 2018-02-20: Transparency](https://news.ycombinator.com/item?id=16421782)
|
||||
|
||||
* [Hacker News 2018-02-15: Time Well Spent](https://news.ycombinator.com/item?id=16382544)
|
||||
|
||||
* [Hacker News 2018-02-13: Benefits of contributing your features to upstream Wekan](https://news.ycombinator.com/item?id=16366387)
|
||||
|
||||
* [Hacker News 2018-01-23: Wekan progress on x64 and ARM](https://news.ycombinator.com/item?id=16209090)
|
||||
|
||||
* [Hacker News 2017-12-23: 2 years of Wekan: what we archieved](https://news.ycombinator.com/item?id=15994145)
|
||||
|
||||
* [Hacker News 2017-11-04 Ask HN: Is Meteor.js still a thing?](https://news.ycombinator.com/item?id=15624623) - has links to Wekan as Meteor.js project
|
||||
|
||||
* [Hacker News 2017-08-17 Wekan: An open-source Trello-like kanban](https://news.ycombinator.com/item?id=15039587) - has comments by xet7, current maintainer of Wekan
|
||||
|
||||
### YouTube
|
||||
|
||||
Maxime Quandalle, original author of Wekan
|
||||
|
||||
* [Wekan: The Open-Source Trello-like Kanban 2015-12-03](https://www.youtube.com/watch?v=N3iMLwCNOro)
|
||||
|
||||
* [Wekan (ex-LibreBoard= - OuiShare Labs Camp #3](https://www.youtube.com/watch?v=iTQt8YitlMA)
|
||||
|
||||
### Upcoming Wekan Platforms
|
||||
|
||||
* [EthKan](https://github.com/EthKan)
|
||||
|
||||
* [Friend](Friend)
|
||||
|
||||
# In Spanish
|
||||
|
||||
* Linuxaditos.com 2018-05-27 [Wekan: una aplicación para la gestión de los flujos de producción](https://www.linuxadictos.com/wekan-una-aplicacion-para-la-gestion-de-los-flujos-de-produccion.htm)
|
||||
* 2017-12 [YouTube: Alternativa a Trello Wekan - Eugenio Chaparro](https://www.youtube.com/playlist?list=PLCTD_CpMeEKTcv63j09oPz0L4JHHSNahp)
|
||||
|
||||
# In German
|
||||
|
||||
* Shorter mention: [Heise.de 2017-20-25 Open Source und lokal statt Cloud: Wekan als Trello-Alternative]( https://www.heise.de/ix/meldung/Open-Source-und-lokal-statt-Cloud-Wekan-als-Trello-Alternative-3871747.html)
|
||||
* Above page has link to longer article: [Heise.de 2017-10 Tools und Tipps: Trello-Alternative Wekan](https://www.heise.de/ix/heft/Kartendeck-3838575.html)
|
||||
|
||||
# In French
|
||||
|
||||
### YouTube
|
||||
|
||||
Maxime Quandalle, original author of Wekan
|
||||
|
||||
* [Le web temps-réel avec Meteor - Maxime Quandalle](https://www.youtube.com/watch?v=ZZfiQXkssH0)
|
||||
@@ -0,0 +1,8 @@
|
||||
Wekan works on x64. There is not yet version for [Raspberry Pi](https://github.com/wekan/wekan/issues/1053).
|
||||
|
||||
Wekan requires MongoDB 3.2.x . For other requirements and versions see [VirtualBox scripts](https://github.com/wekan/wekan-maintainer/tree/master/virtualbox) or [Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile).
|
||||
|
||||
Known bugs with other versions:
|
||||
- Node 6.x: 100% CPU usage.
|
||||
- MongoDB 3.4.x: Wekan crashes when uploading attachment.
|
||||
- [Hardened kernel prevents creating new Wekan boards at Sandstorm](https://github.com/wekan/wekan/issues/1398)
|
||||
@@ -0,0 +1,53 @@
|
||||
Please read Etiquette at [FAQ](FAQ) and [Developer Documentation](Developer-Documentation).
|
||||
|
||||
# New Roadmap
|
||||
|
||||
[New Roadmap is at GitHub Projects](https://github.com/wekan/wekan/projects/2). xet7 is testing functionality of GitHub Projects vs this wiki vs Wekan board where Roadmap previously was. Sometime Roadmap moves back to Wekan board.
|
||||
|
||||
***
|
||||
|
||||
# Old Roadmap below, not up-to-date
|
||||
|
||||
# In progress
|
||||
|
||||
GitHub Username | Feature | Status | Sponsor
|
||||
------------ | ------------- | ------------ | ------------
|
||||
[xet7](https://github.com/xet7) | [Calendar View](https://github.com/wekan/wekan/issues/808) | In Progress | [Bountysource](https://www.bountysource.com/issues/41780513-add-feature-calendar-view)
|
||||
[GhassenRjab](https://github.com/GhassenRjab) | [Search](https://github.com/wekan/wekan/issues/552) | In Progress | [Bountysource](https://www.bountysource.com/issues/32132712-feature-request-search-items) and nm11
|
||||
[Serubin](https://github.com/Serubin) | [Top-level projects](https://github.com/wekan/wekan/issues/641) | In Progress | [Bountysource](https://www.bountysource.com/issues/36035028-top-level-projects)
|
||||
[xet7](https://github.com/xet7), [thuanpq ](https://github.com/thuanpq) | [Teams/Organizations similar to Trello](https://github.com/wekan/wekan/issues/802) . Beginnings of user admin [already implemented](https://github.com/wekan/wekan/pull/1325) at [Wekan v0.55](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v055-2017-11-19-wekan-release) | In Progress | [FUUG.fi](https://fuug.fi/2017/wekan-kanban-taulun-perustoimintojen-kehitys-alkuun/) and [Bountysource](https://www.bountysource.com/issues/41780380-add-feature-teams-organizations-similar-to-trello)
|
||||
[andresmanelli](https://github.com/andresmanelli) | [Gogs issue/commit integration](https://github.com/wekan/wekan/issues/253) | [Part 1 in Wekan already](https://github.com/wekan/wekan/pull/1189) |
|
||||
[papoola](https://github.com/papoola) | [Custom Fields](https://github.com/wekan/wekan/issues/807) | In Progress |
|
||||
[mfshiu](https://github.com/mfshiu) | [Custom Fields, Moving card on mobile phone, Filter cards by keyword](https://github.com/wekan/wekan/issues/1022#issuecomment-337646110), Integrate Wekan with [RIOT](http://riot.im) so user can be notified immediately on cell phone when Wekan cards change | Works, no pull request yet
|
||||
|
||||
# Not started yet
|
||||
|
||||
GitHub Username | Feature | Status | Sponsor
|
||||
------------ | ------------- | ------------ | ------------
|
||||
[xet7](https://github.com/xet7) | [Add direct SQLite/MySQL/PostgreSQL/etc support](https://github.com/wekan/wekan/issues/787) | Not started yet |
|
||||
[xet7](https://github.com/xet7) | Have all settings (SMTP etc) in environment variables or Docker Compose file, no need to setup manually at Admin Panel | Not started yet |
|
||||
[xet7](https://github.com/xet7) | [LDAP for Standalone](https://github.com/wekan/wekan/issues/119) | Not started yet | [FUUG.fi](https://fuug.fi/2017/wekan-kanban-taulun-perustoimintojen-kehitys-alkuun/) and d
|
||||
[xet7](https://github.com/xet7) | [IFTTT support](https://github.com/wekan/wekan/issues/1160) | Not started yet | [Bountysource](https://www.bountysource.com/issues/47991500-feature-request-if-this-then-that-style-support-i-e-recurring-cards)
|
||||
[xet7](https://github.com/xet7) | [Board templates](https://github.com/wekan/wekan/issues/786) | Not started yet | [Bountysource](https://www.bountysource.com/issues/41724710-add-feature-board-templates)
|
||||
[xet7](https://github.com/xet7) | [Scheduling events](https://github.com/wekan/wekan/issues/1101) | Not started yet | [Bountysource](https://www.bountysource.com/issues/46762619-scheduling-events)
|
||||
[xet7](https://github.com/xet7) | [Better mobile web support](https://github.com/wekan/wekan/issues/953) | Not started yet | [FUUG.fi](https://fuug.fi/2017/wekan-kanban-taulun-perustoimintojen-kehitys-alkuun/) and<br /> [Bountysource](https://www.bountysource.com/issues/43608850-hard-sometimes-impossible-to-use-wekan-on-mobile-android-ios-because-of-ui-ux-issues) | In progress | [FUUG.fi](https://fuug.fi/2017/wekan-kanban-taulun-perustoimintojen-kehitys-alkuun/) and [Bountysource](https://www.bountysource.com/issues/41780380-add-feature-teams-organizations-similar-to-trello)
|
||||
[xet7](https://github.com/xet7) | [Advanced WebHooks with Mattermost](https://github.com/wekan/wekan/issues/1297) | Not started yet | d
|
||||
[xet7](https://github.com/xet7) | [Add Company logo above Wekan logo at login page, with custom CSS.](https://github.com/wekan/wekan/issues/1196) | Not started yet | d
|
||||
[xet7](https://github.com/xet7) | [Wekan <=> MongoDB <=> ToroDB => MySQL read-only mirroring](https://github.com/torodb/stampede/issues/203) | Not started yet. There is [PosgreSQL version](https://github.com/wekan/wekan-postgresql) already. |
|
||||
[xet7](https://github.com/xet7) | Update wiki to have newest Features, Integrations, Team etc info | Not started yet. |
|
||||
[xet7](https://github.com/xet7) | [Copy URL of card](https://github.com/wekan/wekan/issues/1188) | At Sandstorm: Not started yet. |
|
||||
[xet7](https://github.com/xet7) | A bot that responds to translation pull requests with link to [translations at Transifex](https://app.transifex.com/wekan/), etc documentation. Also other maintainer routine tasks. | Not started yet. |
|
||||
|
||||
Also see [other bounties at Bountysource](https://www.bountysource.com/teams/wekan)
|
||||
|
||||
## Done
|
||||
|
||||
GitHub Username | Feature | Status | Sponsor
|
||||
------------ | ------------- | ------------ | ------------
|
||||
[xet7](https://github.com/xet7) | Added fixes for [Excessive CPU usage](https://github.com/wekan/wekan-mongodb/issues/2) from various contributors to encourage [mfshiu](https://github.com/mfshiu) to contribute his Wekan features in progress | Done |
|
||||
[GhassenRjab](https://github.com/GhassenRjab), [thuanpq ](https://github.com/thuanpq) | [Move or copy cards from one board to another on Standalone](https://github.com/wekan/wekan/issues/797) | Done | [Bountysource](https://www.bountysource.com/issues/41780302-add-feature-move-or-copy-cards-from-one-board-to-another)
|
||||
[xet7](https://github.com/xet7) | [Copy URL of card](https://github.com/wekan/wekan/issues/1188) | Done at Standalone. |
|
||||
[xet7](https://github.com/xet7) and [ocdtrekkie](https://github.com/ocdtrekkie) | [Newest Wekan for Sandstorm](https://github.com/wekan/wekan/issues/799) | Done |
|
||||
[GhassenRjab](https://github.com/GhassenRjab) | [Import activities from Trello and Wekan](https://github.com/wekan/wekan/pull/1187) | Done |
|
||||
[soohwa](https://github.com/soohwa) | [REST API : Better error output](https://github.com/wekan/wekan/issues/1037#issuecomment-301271356)| Done |
|
||||
[brooksbecton](https://github.com/brooksbecton) | [Swipebox for attachment images](https://github.com/wekan/wekan/issues/201) | Done |
|
||||
@@ -0,0 +1,78 @@
|
||||
# Current Team
|
||||
|
||||
GitHub Username | Location | Position | Details
|
||||
------------ | ------------ | ------------ | ------------
|
||||
[xet7](https://github.com/xet7) | Finland | Maintainer since 2016-12 | Source/Docker/Ubuntu snap/VirtualBox releases, testing and merging pull requests, organizing and answering issues, updating wiki and website, some features.
|
||||
|
||||
If anyone finds what issue can be closed, is already fixed, you find how to fix it, or can check with Docker version tags in what version something broke and in next was fixed, please add comment to issue about it. xet7 gets email from every new issue and comment to issue. Pull requests very welcome. Thanks!
|
||||
|
||||
# Current most frequent Testers
|
||||
|
||||
GitHub Username | Location | Position | Details
|
||||
------------ | ------------ | ------------ | ------------
|
||||
[jinthakur](https://github.com/jinthakur) | USA | Contributor | Can help testing bundle on Windows and finding in which Wekan version Docker tag something worked and in next version broke, please tag @jinthakur when that is needed, he saves a lot of time of xet7
|
||||
[juliensl](https://github.com/juliensl) | Universe | Contributor | Can help finding in which Wekan version Docker tag something worked and in next version broke, please tag @juliensl when that is needed, he saves a lot of time of xet7
|
||||
|
||||
# Current most frequent Contributors
|
||||
|
||||
Also, see newest contributors at [ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
|
||||
GitHub Username | Location | Position | Details
|
||||
------------ | ------------ | ------------ | ------------
|
||||
[marc1006](https://github.com/marc1006) | Universe | Contributor | XSS fix, etc many features and fixes
|
||||
[NicoP-S](https://github.com/NicoP-S) | Germany | Contributor | Added Card voting, fixed Change slug on card rename, etc
|
||||
[habenamare](https://github.com/habenamare) | Ethiopia | Contributor | Added the 'Currency' Custom Field type, etc
|
||||
[helioguardabaxo](https://github.com/helioguardabaxo) | Brazilia | Contributor | Added Theme: Modern. Etc.
|
||||
[CidKramer](https://github.com/CidKramer) | Universe | Contributor | Added Clearblue theme. Etc.
|
||||
[gvespignani70](https://github.com/gvespignani70) | Universe | Contributor | Added an API to get the cards for a specific custom field value. Etc.
|
||||
[hgustafsson](https://github.com/hgustafsson) | Universe | Contributor | Alignment and spacing of minicard labels
|
||||
[GitGramm](https://github.com/GitGramm) | Universe | Contributor | Added dates & assignees to REST API calls, etc
|
||||
[krupupakku](https://github.com/krupupakku) | Spain | Contributor | Fixed Swimlanes ID missing in new boards. Fixed avatar-image class. Etc.
|
||||
[wackazong](https://github.com/wackazong) | Universe | Contributor | Fixed Create card does not allow an empty member list. Etc.
|
||||
[bentiss](https://github.com/bentiss) | Universe | Contributor | Added OpenAPI docs generation, swimlanes etc.
|
||||
[jimmyjones2](https://github.com/jimmyjones2) | Universe | Contributor | OpenShift template updates
|
||||
[salleman33](https://github.com/salleman33) | France | Contributor | Created Wekan LDAP code. Etc.
|
||||
[Akuket](https://github.com/Akuket) | Universe | Contributor | Added salleman33's LDAP code to Wekan. Etc.
|
||||
[justinr1234](https://github.com/justinr1234) | Universe | Contributor | Added more MongoDB indexes for huge Wekan speedup. Added prettier that formats code style. Etc.
|
||||
[road42](https://github.com/road42) | Germany | Contributor | Devcontainer etc.
|
||||
[urakagi](https://github.com/urakagi) | Taiwan | Contributor | Fixed app hang. [In the filter menu, 1) Turning on "show archive" will request archived lists and show them on the ListView. 2) Turning on "hide empty lists" will hide empty lists on the ListView](https://github.com/wekan/wekan/pull/2632). Etc.
|
||||
|
||||
***
|
||||
|
||||
# Previous Contributors
|
||||
|
||||
This page lists some of the contributors that have donated their time, resources or code to the project. This list is not up-to-date.
|
||||
|
||||
GitHub Username | Chat Username | Location | Position | Details
|
||||
------------ | ------------- | ------------ | ------------ | ------------
|
||||
[brymut](https://github.com/brymut) | Kenya | Contributor | Added export CSV/TSV. Etc.
|
||||
[lkisme](https://github.com/lkisme) | - | China | Contributor | [Admin Panel](https://github.com/wekan/wekan/pull/871)
|
||||
[jymcheong](https://github.com/jymcheong) | Universe | Contributor | Added Card Open Webhook.
|
||||
[Serubin](https://github.com/Serubin) | serubin | Universe | Contributor | [Fix Double slash problem](https://github.com/wekan/wekan/pull/932)
|
||||
[liske](https://github.com/liske) | Germany | Contributor | Added card REST API fix, card time fix etc.
|
||||
[rhelsing](https://github.com/rhelsing) | ryan.helsing | USA | Contributor | [Comment permissions](https://github.com/wekan/wekan/pull/1008)
|
||||
[BaobabCoder](https://github.com/BaobabCoder) | BaobabCoder | France | Contributor | [Delete List](https://github.com/wekan/wekan/pull/1050)
|
||||
[whodafly](https://github.com/whodafly) | superfly | USA | Contributor | [Troubleshooting Mail](Troubleshooting-Mail), [Import Checklists from Trello](https://github.com/wekan/wekan/pull/894)
|
||||
[stephenmoloney](https://github.com/stephenmoloney) | - | Ireland | Contributor | Dockerfile and Travis config, Meteor 1.4 and Node 4.x port
|
||||
[GhassenRjab](https://github.com/GhassenRjab) | ghassen.rjab | Universe | Contributor | [Fix Export Board](https://github.com/wekan/wekan/pull/1067), [Fix "W" shortcut](https://github.com/wekan/wekan/pull/1066), [Sort languages](https://github.com/wekan/wekan/pull/1070), [Add Breton language name](https://github.com/wekan/wekan/pull/1071), [Edit card description with invalid markdown](https://github.com/wekan/wekan/pull/1073), [Fix importing Trello board](https://github.com/wekan/wekan/pull/1080), [Import due date from Trello](https://github.com/wekan/wekan/pull/1082), [Import Wekan board](https://github.com/wekan/wekan/pull/1117), [Export and import attachments as base64 encoded files](https://github.com/wekan/wekan/pull/1134), [Export and import checklists](https://github.com/wekan/wekan/pull/1140), [Export and import boards in Sandstorm](https://github.com/wekan/wekan/pull/1144), [FIX SECURITY ISSUE Files accessible without authentication](https://github.com/wekan/wekan/issues/1105)
|
||||
[nztqa](https://github.com/nztqa) | - | Universe | Contributor | [Delete card when deleting list](https://github.com/wekan/wekan/pull/1054), [Disable unnecessary link feature](https://github.com/wekan/wekan/pull/1042), [Fix IE 11 drag board to scroll](https://github.com/wekan/wekan/pull/1052), [Fix filter reset on moving between starred boards](https://github.com/wekan/wekan/pull/1074), [Fix Admin Panel link available to all users, only link is hidden](https://github.com/wekan/wekan/pull/1076), [Fix Case-sensitive email handling](https://github.com/wekan/wekan/issues/675), [Fix admin panel route for subfolder](https://github.com/wekan/wekan/pull/1084), [Fix i18n route for subfolder](https://github.com/wekan/wekan/pull/1085), [Fix incorrect attachment link with subfolder in the url](https://github.com/wekan/wekan/pull/1086), [Fix link to card](https://github.com/wekan/wekan/pull/1087), [Fix duplicate id generation](https://github.com/wekan/wekan/pull/1093), [When finished input of checklist item, open new checklist item](https://github.com/wekan/wekan/pull/1099), [Fix Possible to add empty item to checklist](https://github.com/wekan/wekan/pull/1107), [Improve UI design of checklist items](https://github.com/wekan/wekan/pull/1108), [Outgoing Webhooks](https://github.com/wekan/wekan/pull/1119), [Adding user to board causes node.js to crash](https://github.com/wekan/wekan/issues/1131), [Fix double shashes](https://github.com/wekan/wekan/issues/962), [GitHub Issue template](https://github.com/wekan/wekan/pull/1146), [Fix showing card activity history in IE11](https://github.com/wekan/wekan/pull/1152), [Add display Wekan version number and runtime environment to Admin Panel](https://github.com/wekan/wekan/pull/1156), [Change Email address](https://github.com/wekan/wekan/pull/1161)
|
||||
[jtickle](https://github.com/jtickle) | - | USA | Contributor | [Fix Double slash problem](https://github.com/wekan/wekan/pull/1114)
|
||||
[huneau](https://github.com/huneau) | - | Universe | Contributor | REST API, [Console, file, and zulip logger on database changes](https://github.com/wekan/wekan/pull/1010)
|
||||
[mayjs](https://github.com/mayjs) | - | Universe | Contributor | REST API
|
||||
[zarnifoulette](https://github.com/zarnifoulette) | - | Universe | Contributor | [REST API: Add PUT method to update a card](https://github.com/wekan/wekan/pull/1095) and [related fix](https://github.com/wekan/wekan/pull/1097), [Fix Activity user messed up when creating a card using the REST-API](https://github.com/wekan/wekan/pull/1116)
|
||||
[Zokormazo](https://github.com/Zokormazo) | Zokormazo | Spain | Contributor | [Add isAdmin to user Schema](https://github.com/wekan/wekan/pull/970), [Add TLS toggle to Admin Panel SMTP setting](https://github.com/wekan/wekan/pull/960)
|
||||
[shtefcs](https://github.com/shtefcs) | kinder | Universe | [Vanila](https://vanila.io) Founder | [Chat](https://chat.vanila.io/channel/wekan), growth hacking
|
||||
[jelenajjo](https://github.com/jelenajjo) | jelena | Universe | [Vanila](https://vanila.io) Web Developer | [Themes](https://github.com/wekan/wekan/issues/781), upcoming new website
|
||||
[dwrensha](https://github.com/dwrensha) | - | USA | [Sandstorm](https://sandstorm.io) Developer | Packaging Wekan releases for Sandstorm
|
||||
[kentonv](https://github.com/kentonv) | - | USA | [Sandstorm](https://sandstorm.io) Developer | [Cap’n Proto](https://capnproto.org) and [node-capnp](https://github.com/kentonv/node-capnp)
|
||||
[ocdtrekkie](https://github.com/ocdtrekkie) | ocdtrekkie | USA | [Sandstorm](https://sandstorm.io) user from beginning of Sandstorm | Testing and accepting Wekan releases for Sandstorm
|
||||
[JamborJan](https://github.com/JamborJan) | - | Universe | [Sandstorm](https://sandstorm.io) Developer | [Add bigger screenshots](https://github.com/wekan/wekan/pull/940)
|
||||
[nebulade](https://github.com/nebulade) | - | Germany | [Cloudron](https://cloudron.io) Developer | [Re-enable export](https://github.com/wekan/wekan/pull/1059)
|
||||
[kubiko](https://github.com/kubiko) | - | UK | [Canonical](https://www.canonical.com) Developer | [snap package](https://github.com/wekan/wekan-snap), [Adding snapcraft build support from source](https://github.com/wekan/wekan/pull/1091), [Use version scriptlet in snap](https://github.com/wekan/wekan/pull/1164)
|
||||
[whowillcare](https://github.com/whowillcare) | Universe | Contributor | Added WYSIWYG card comment editor that can be turned off with `sudo snap set wekan richer-card-comment-editor='false'`, Global webhook to Admin Panel, etc a lot of features.
|
||||
|
||||
# Previous Team members
|
||||
|
||||
GitHub Username | Location | Position | Details
|
||||
------------ | ------------- | ------------ | ------------
|
||||
[mquandalle](https://github.com/mquandalle) | France | Author | xet7 still has direct contact with him
|
||||
@@ -0,0 +1,32 @@
|
||||
## Standalone Wekan: Snap, (Docker, Source, VirtualBox)
|
||||
|
||||
1) [Install Wekan Snap](https://github.com/wekan/wekan-snap/wiki/Install)
|
||||
|
||||
2) Go to your Wekan URL like https://example.com/sign-up (your address + /sign-up)
|
||||
|
||||
3) Register your username, email address and password. First registered user will be admin, and next ones normal users. If you want other admins too, you can change their permission to admin at Admin Panel.
|
||||
|
||||
4) **If you get Internal Server Error when creating account, it's because you have not configured email, and you can ignore it. WORKING EMAIL IS NOT REQUIRED. Wekan works without setting up email.**
|
||||
|
||||
If you really want email sending, do for example:
|
||||
```
|
||||
sudo snap set wekan mail-url='smtps://user:pass@mailserver.example.com:457/'
|
||||
sudo snap set wekan mail-from='Example Wekan Support <support@example.com>'
|
||||
```
|
||||
For more options see [Troubleshooting Email](Troubleshooting-Mail)
|
||||
|
||||
5) Login to Wekan at https://example.com/sign-in (your address + /sign-in)
|
||||
|
||||
6) Click on top right your username / Admin Panel. You can change permissions, name, email address and password in Admin Panel.
|
||||
|
||||

|
||||
|
||||
7) For registering other users:
|
||||
|
||||
a) Let them self-register, or open webbrowser incongnito window, and register them at https://example.com/sign-up (your address + /sign-up)
|
||||
|
||||
b) If your email works, click Admin Panel / Settings / Registration / [X] Disable self-registration. Then invite new users to selected boards by email address.
|
||||
|
||||
## Deleting Users
|
||||
|
||||
[No delete feature yet](https://github.com/wekan/wekan/issues/1289)
|
||||
@@ -0,0 +1,3 @@
|
||||
[Wekan v5.55 and newer](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v555-2021-08-31-wekan-release)
|
||||
|
||||
<img src="https://wekan.github.io/allow-private-boards-only.png" width="60%" alt="Allow private boards only" />
|
||||
@@ -0,0 +1,31 @@
|
||||
These are on Standalone Wekan: Snap/Docker/Source/VirtualBox. Some of these are also at Sandstorm Wekan.
|
||||
|
||||
## Move to Archive: Restore possible
|
||||
|
||||
Board => ☰ => Move Board to Archive
|
||||
|
||||
Swimlane => ☰ => Move Swimlane to Archive
|
||||
|
||||
List => ☰ => Move List to Archive
|
||||
|
||||
Card => ☰ => Move Card to Archive
|
||||
|
||||
## Restore Card/List/Swimlane from Archive
|
||||
|
||||
Board => ☰ => Archive => Cards/Lists/Swimlanes Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
|
||||
## Restore or Delete board
|
||||
|
||||
All Boards => Archive => Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
|
||||
## Deleting - NO UNDO
|
||||
|
||||
Deleting Board: All Boards => Archive => Delete
|
||||
|
||||
Deleting Card: Card => ☰ => More => Delete (at right bottom corner)
|
||||
|
||||
Deleting List: List => ☰ => More => Delete (at right bottom corner)
|
||||
|
||||
Deleting Swimlane:
|
||||
1) Swimlane => ☰ => Move Swimlane to Archive
|
||||
2) Board => ☰ => Archive => Cards/Lists/Swimlanes Restore (or Delete - but that has no undo!! It's FINAL DELETE).
|
||||
@@ -0,0 +1,11 @@
|
||||
## Description
|
||||
|
||||
- Cover image = Image that you see first at not yet opened minicard, book, or magazine.
|
||||
- Minicard = At board, small card, that you have not yet clicked to open card.
|
||||
- Thumbnail Image = Small Picture of Attachment Image, like at Minicard and Card.
|
||||
- At opened card, when you click thumbnail, it opens big picture slideshow.
|
||||
|
||||
## Minicard Cover Image and Count of attachments
|
||||
|
||||
<img src="https://wekan.github.io/cover/cover-and-attachment.png" width="100%" alt="Minicard Cover Image and Count of attachments" />
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
[Custom Fields issue](https://github.com/wekan/wekan/issues/807)
|
||||
|
||||
## To translators, about the word Custom
|
||||
|
||||
See other feature for description of Custom https://github.com/wekan/wekan/wiki/Customize-Translations
|
||||
|
||||
## 1) Click: Board hamburger menu / Custom Fields
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-1.png" width="50%" alt="Custom Field Step 1" />
|
||||
|
||||
## 2) Click: Create Field, add details and Save
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-2.png" width="50%" alt="Custom Field Step 1" />
|
||||
|
||||
## 3) Click: Card Details hamburger menu / Edit custom fields
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-3.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 4) Click: Your Custom Field name to insert it to Card
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-4.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 5) Click: Your selection from your Custom Field
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-5.png" width="100%" alt="Custom Field Step 1" />
|
||||
|
||||
## 6) Custom Field is shown at Minicard and Card Details
|
||||
|
||||
<img src="https://wekan.github.io/custom-field-6.png" width="100%" alt="Custom Field Step 1" />
|
||||
@@ -0,0 +1,24 @@
|
||||
In Wekan v4.40 and newer:
|
||||
|
||||
- Custom Logo for Login and Top Left Corner.
|
||||
- Optional link when clicking logo.
|
||||
- Settings at Admin Panel / Settings / Layout.
|
||||
|
||||
Added [with this commit](https://github.com/wekan/wekan/commit/a7c3317ed696fad8e211b22afbb3012f3a4f2ddb). As you can see from that commit:
|
||||
- Height 27 px in Top Left Corner Logo. Width auto = automatic.
|
||||
- Width 300 px in Login Logo. Height auto = automatic.
|
||||
|
||||
Image can be for example jpg/png/gif/svg.
|
||||
|
||||
For those sizes, if logo is a little bigger or smaller, it will be zoomed.
|
||||
|
||||
## Storing logo images elsewhere
|
||||
|
||||
Add image like `https://example.com/logo.png`
|
||||
|
||||
## Storing logos in Wekan
|
||||
|
||||
1. Create board and change it from private to public (visible to everyone at Internet)
|
||||
2. Add card
|
||||
3. Add logo images to card as attachment
|
||||
4. Right click on top image and copy image link to Admin Panel/Settings/Layout/Logo image URL
|
||||
@@ -0,0 +1,228 @@
|
||||
# Current
|
||||
|
||||
Not all from [CHANGELOG](https://github.com/wekan/wekan/blob/main/CHANGELOG.md) are added to here yet.
|
||||
|
||||
## Kanban
|
||||
|
||||
### WIP Limits
|
||||
|
||||

|
||||
|
||||
### Boards: List of all your public and private boards, board shortcuts at top of page
|
||||
|
||||

|
||||
|
||||
### Wekan full screen or window on desktop (without browser buttons etc)
|
||||
|
||||
[Info about browser standalone app mode](https://github.com/wekan/wekan/pull/1184)
|
||||
|
||||
### Wekan full screen on mobile Firefox
|
||||
|
||||
[Instructions and screenshot](https://github.com/wekan/wekan/issues/953#issuecomment-336537875)
|
||||
|
||||
### Restore archived board
|
||||
|
||||

|
||||
|
||||
### Star board
|
||||
|
||||

|
||||
|
||||
### Watch board
|
||||
|
||||

|
||||
|
||||
### Keyboard shortcuts button at bottom right corner
|
||||
|
||||

|
||||
|
||||
### Board menu when clicking 3 lines "hamburger" menu on right
|
||||
|
||||

|
||||
|
||||
### Member setting when clicking your username on top right corner
|
||||
|
||||

|
||||
|
||||
NOTE: Edit Notification duplicate was removed from above menu at https://github.com/wekan/wekan/pull/1948 so Edit Notification is only available at below menu screenshot.
|
||||
|
||||
### Member settings / Edit Notification
|
||||
|
||||

|
||||
|
||||
### Member settings / Change settings
|
||||
|
||||

|
||||
|
||||
### Members: Click member initials or avatar
|
||||
|
||||

|
||||
|
||||
### Members: Click member initials or avatar => Permissions Admin/Normal/Comment only
|
||||
|
||||

|
||||
|
||||
### Lists: Add, archive and restore archived, delete list.
|
||||
|
||||

|
||||
|
||||
### Cards: Description, Customizable Labels, Checklists, Attachment images and files, Comments. Archive and restore archived card. Delete card.
|
||||
|
||||
Tip: Normally you archive a card so you can restore it back. If you want to delete cards faster, drag cards to new list, and delete that new list. Deleting cannot be undone, more clicks are by design. There was previously easily clicked button to delete a list and people deleted important list by accident, and that bug report was fixed.
|
||||
|
||||
### [Markdown in card description and comments](https://github.com/wekan/wekan/issues/1038)
|
||||
### [International Date Formatting for Due Date according to language](https://github.com/wekan/wekan/issues/838)
|
||||
|
||||

|
||||
|
||||
### Cards: Drag and drop images to card. Paste images with Ctrl-V.
|
||||
|
||||
### 1) First attachment: Select Card 3 lines "hamburger" menu / Edit Attachments
|
||||
|
||||

|
||||
|
||||
### 2) Select: Clipboard or drag and drop
|
||||
|
||||

|
||||
|
||||
### 3) Drag and drop image, or Ctrl-V.
|
||||
|
||||

|
||||
|
||||
### 4) Second image attachment and others can be added from Add Attachment button near first attachment.
|
||||
|
||||

|
||||
|
||||
### Multi-selection => Checkmark select cards => drag-drop all selected to some list
|
||||
|
||||

|
||||
|
||||
### Filtered views
|
||||
|
||||

|
||||
|
||||
## Authentication, Admin Panel, SMTP Settings
|
||||
|
||||
NOTE: There is user admin as "People" in Admin Panel, but no screenshot here yet.
|
||||
|
||||
* Source and Docker platforms: [Admin Panel](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#v0111-rc2-2017-03-05-wekan-prerelease): Self-registration, or change to invite-only and inviting users to boards. SMTP Settings.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
* Sandstorm Platform: Admin: LDAP, passwordless email, SAML, GitHub and Google Auth. Add and remove users. SMTP Settings. Wekan, Rocket.Chat, etc apps available with one click install.
|
||||
|
||||
## Import
|
||||
|
||||
* Import Trello board: Text, labels, images, comments, checklists. Not imported yet: stickers, etc.
|
||||
* [Import Wekan board](https://github.com/wekan/wekan/pull/1117): Text, labels, images, comments, checklists.
|
||||
|
||||
## Export
|
||||
|
||||
* Export Wekan board: [Export menu item above the board archive item, when you click the sandwich bar icon on the top right](https://github.com/wekan/wekan/pull/1059). If Export menu is not visible, you can change [Export menu to be visible by setting yourself as board admin in MongoDB](https://github.com/wekan/wekan/issues/1060).
|
||||
|
||||
## Working with big boards
|
||||
|
||||
* [JSON tools, copying files to clipboard](https://github.com/wekan/wekan/issues/610#issuecomment-310862951)
|
||||
|
||||
## API
|
||||
|
||||
* [REST API Issue](https://github.com/wekan/wekan/issues/1037)
|
||||
* [REST API Docs](REST-API)
|
||||
* [Python client to REST API](https://github.com/wekan/wekan-python-api-client)
|
||||
* [Wekan Sandstorm cards to CSV using Python](Wekan-Sandstorm-cards-to-CSV-using-Python)
|
||||
|
||||
## Webhooks
|
||||
Sending notifications for board activities. Tested with [Slack](https://slack.com/) and [Rocket.chat](https://rocket.chat/).
|
||||
```
|
||||
Content-type: application/json
|
||||
{
|
||||
"text": "board activities"
|
||||
[...]
|
||||
}
|
||||
```
|
||||
|
||||
Different activities send different webhook data. You can find the details in the wiki page [Webhook data](Webhook-data)
|
||||
|
||||
* [Outgoing Webhooks](https://github.com/wekan/wekan/pull/1119)
|
||||
|
||||
### Enabled
|
||||
#### 1) Board menu when clicking 3 lines "hamburger" menu on right
|
||||
|
||||

|
||||
|
||||
#### 2) Outgoing Webhooks
|
||||
|
||||

|
||||
|
||||
### Disabled
|
||||
|
||||
Leave the URL field blank.
|
||||
|
||||
## Cleanup
|
||||
|
||||
* [Wekan database cleanup script](https://github.com/wekan/wekan-cleanup)
|
||||
* [Docker cleanup](https://github.com/wekan/wekan/issues/985)
|
||||
|
||||
## Stats
|
||||
|
||||
* [Daily export of Wekan changes as JSON to Logstash and
|
||||
ElasticSearch / Kibana (ELK)](https://github.com/wekan/wekan-logstash)
|
||||
* [Statistics Python script for Wekan Dashboard](https://github.com/wekan/wekan-stats)
|
||||
* [Console, file, and zulip logger on database changes](https://github.com/wekan/wekan/pull/1010) with [fix to replace console.log by winston logger](https://github.com/wekan/wekan/pull/1033)
|
||||
|
||||
## Versions of Meteor and Node
|
||||
|
||||
* Upgraded to [Meteor 1.4](https://github.com/wekan/wekan/pull/957) and [Node v4](https://github.com/wekan/wekan/issues/788) on [meteor-1.4 branch](https://github.com/wekan/wekan/tree/meteor-1.4)
|
||||
|
||||
## Translations
|
||||
|
||||
* [Translate Wekan at Transifex](https://app.transifex.com/wekan/)
|
||||
|
||||

|
||||
|
||||
# Already merged, will be at next version
|
||||
|
||||
* [Changelog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
|
||||
# Wishes for pull requests
|
||||
|
||||
### Existing pull requests, cleanup/cherry-picking/new pull requests welcome
|
||||
|
||||
* [Export/Import Excel TSV/CSV data](https://github.com/wekan/wekan/pull/413)
|
||||
* [Move/Clone Board/List](https://github.com/wekan/wekan/pull/446) and [Move or copy cards from one board to another](https://github.com/wekan/wekan/issues/797) that [needs help in implementation](https://github.com/wekan/wekan/issues/979)
|
||||
* [Replace CollectionFS with meteor-file-collection](https://github.com/wekan/wekan/pull/875)
|
||||
|
||||
### Wishes for API pull requests
|
||||
|
||||
* [Using API to script Email to board/card, notifications on cards to email, etc](https://github.com/wekan/wekan/issues/794)
|
||||
|
||||
### Wishes for Admin Panel
|
||||
|
||||
* [SMTP test, show possible errors on that test webpage](https://github.com/wekan/wekan/issues/949)
|
||||
* [Teams/Organizations](https://github.com/wekan/wekan/issues/802) including Add/Modify/Remove Teams/Users/Passwords and Private/Public Team settings
|
||||
* [Themes](https://github.com/wekan/wekan/issues/781) and making custom apps with Themes
|
||||
|
||||
### Wishes for Boards
|
||||
|
||||
* [Custom fields](https://github.com/wekan/wekan/issues/807)
|
||||
* [Children/Related cards](https://github.com/wekan/wekan/issues/709), subtasks. Dependencies.
|
||||
* [Top Level Projects](https://github.com/wekan/wekan/issues/641)
|
||||
* [Swimlanes (rows)](https://github.com/wekan/wekan/issues/955)
|
||||
* Kanban workflows
|
||||
* Gantt charts
|
||||
* [WIP limits](https://github.com/wekan/wekan/issues/783)
|
||||
* [Timesheet/Time tracking](https://github.com/wekan/wekan/issues/812)
|
||||
* Managing website
|
||||
* [Same cards, multiple column sets](https://github.com/wekan/wekan/issues/211), related to [Themes](https://github.com/wekan/wekan/issues/781)
|
||||
* [Calendar view](https://github.com/wekan/wekan/issues/808)
|
||||
* [Vote on cards, number of votes, average](https://github.com/wekan/wekan/issues/796)
|
||||
* [Board templates](https://github.com/wekan/wekan/issues/786)
|
||||
* [Checklist templates](https://github.com/wekan/wekan/issues/904)
|
||||
|
||||
# More
|
||||
|
||||
[Platforms](Platforms)
|
||||
|
||||
[Integrations](Integrations)
|
||||
@@ -0,0 +1,35 @@
|
||||
## 1) Click: Menu item for the rules
|
||||
|
||||
<img src="https://wekan.github.io/ifttt/main_menu-ifttt.png" alt="Navigation menu for the rule dialog" />
|
||||
|
||||
|
||||
## 2) Rule Menu: Overview, deleting and adding new rules
|
||||
<img src="https://wekan.github.io/ifttt/ifttt_main_dialog.PNG" alt="Dialog Overview for the rules" />
|
||||
|
||||
|
||||
## 2a) Add new rule : Triggers
|
||||
Currently, there are three types of triggers: board, card and checklist
|
||||
|
||||
| Board | Card | Checklist |
|
||||
| ------------- | ------------- | ------------- |
|
||||
| create card | added/removed label, attachment, person | checklist added/removed |
|
||||
| card moved to | | check item checked/unchecked |
|
||||
| card moved from | | checklist completed |
|
||||
|
||||
|
||||
## 2b) Add new rule : Actions
|
||||
For every trigger, there are 4 types of actions: board, card, checklist and mail
|
||||
|
||||
| Board | Card | Checklist | Mail |
|
||||
| ------------- | ------------- | ------------- | ------------- |
|
||||
| move card to list | add/remove label, attachment, person | checklist add/remove | send email to |
|
||||
| move to top/bottom | set title/description | check/uncheck item | |
|
||||
| archive/unarchive | | checklist complete | |
|
||||
|
||||
|
||||
# Example : How the rule works
|
||||
* Rule 1: When a card is added to the board -> Add label yellow
|
||||
* Rule 2: When a card is moved to List 2 -> Add checklist ToDo
|
||||
* Rule 3: When a card is added to List 1 -> Add label blue
|
||||
|
||||
<img src="https://wekan.github.io/ifttt/how_to_work_with_rules.gif" alt="gif animation for rules" />
|
||||
@@ -0,0 +1,5 @@
|
||||
1. As Wekan Admin user, at `All Boards` page on top of board, click `Clone Board`
|
||||
2. If cloned board does open correctly, check does it have any data missing.
|
||||
3. If original board does not open correctly, at `All Boards` page on top of board icon click `Archive`
|
||||
4. At `All Boards` page top right if buttons `Archive` and `Templates`. Click `Archive`.
|
||||
5. If you don't need that original board anymore, click `Delete` to delete that original board permanently.
|
||||
@@ -0,0 +1,40 @@
|
||||
[Original issue](https://github.com/wekan/wekan/issues/4589)
|
||||
|
||||
[Commit](https://github.com/wekan/wekan/commit/82fa632197a0e3b88d26c557f1dc8cc18b05b18b)
|
||||
|
||||
## Examples
|
||||
|
||||
[Examples From NPM package](https://www.npmjs.com/package/markdown-it-mathjax3)
|
||||
|
||||
**Inline**
|
||||
|
||||
Surround your LaTeX with a single $ on each side for inline rendering.
|
||||
|
||||
`$\sqrt{3x-1}+(1+x)^2$`
|
||||
|
||||
**Block**
|
||||
|
||||
Use two ($$) for block rendering. This mode uses bigger symbols and centers the result.
|
||||
```
|
||||
$$\begin{array}{c}
|
||||
|
||||
\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
|
||||
= \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
|
||||
|
||||
\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
|
||||
|
||||
\nabla \cdot \vec{\mathbf{B}} & = 0
|
||||
|
||||
\end{array}$$
|
||||
```
|
||||
## Syntax
|
||||
|
||||
Math parsing in markdown is designed to agree with the conventions set by pandoc:
|
||||
```
|
||||
Anything between two $ characters will be treated as TeX math. The opening $ must
|
||||
have a non-space character immediately to its right, while the closing $ must
|
||||
have a non-space character immediately to its left, and must not be followed
|
||||
immediately by a digit. Thus, $20,000 and $30,000 won’t parse as math. If for some
|
||||
reason you need to enclose text in literal $ characters, backslash-escape them and
|
||||
they won’t be treated as math delimiters.
|
||||
```
|
||||
@@ -0,0 +1,35 @@
|
||||
If in List titles you like to create numbered text like this:
|
||||
```
|
||||
3. Something
|
||||
```
|
||||
Write it this way (to escape dot), so it shows correctly:
|
||||
```
|
||||
3\. Something
|
||||
```
|
||||
This happens because of markdown support for autonumbering in input fields.
|
||||
|
||||
For example, if you write numbered list like:
|
||||
```
|
||||
1. Something nice
|
||||
1. Something cool
|
||||
1. Something great
|
||||
```
|
||||
It will be autonumbered like this, so you can cut/paste reorder list freely, without manually reordering numbers:
|
||||
```
|
||||
1. Something nice
|
||||
2. Something cool
|
||||
3. Something great
|
||||
```
|
||||
For example, when you reorder numbered list like this:
|
||||
```
|
||||
1. Something great
|
||||
1. Something nice
|
||||
1. Something cool
|
||||
```
|
||||
It will show automatically numbered like this:
|
||||
```
|
||||
1. Something great
|
||||
2. Something nice
|
||||
3. Something cool
|
||||
```
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
[Browser compatibility matrix](Browser-compatibility-matrix)
|
||||
|
||||
## Install your Wekan server as an app
|
||||
|
||||
- At below info, `Navigate to login page of Wekan` is your Wekan server, example https://wekan.yourcompany.com/sign-in
|
||||
- App icon at Windows desktop, mobile etc
|
||||
- App does not have webbrowser buttons like address bar
|
||||
- Works in Wekan v4.02 and newer
|
||||
|
||||
### Windows desktop: Windows Chromium Edge
|
||||
|
||||
1. Open Chromium Edge.
|
||||
|
||||
2. Navigate to login page of Wekan
|
||||
|
||||
3. From Edge menu, install site as app, by clicking top right `⋮` and this menu, that can be used to install and manage/remove apps:
|
||||
|
||||
<img src="https://wekan.github.io/chromium-edge-install-pwa.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
4. In next popup, give name to app, like `YourCompany Wekan`, and click `Add`
|
||||
|
||||
5. Now new app is in your Windows Start menu.
|
||||
|
||||
### iOS Safari
|
||||
|
||||
1. Open Safari.
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. At middle bottom click Share button that is box with arrow up.
|
||||
|
||||
4. Scroll down and click "Add to Home Screen" and "Add".
|
||||
|
||||
### Android Chrome
|
||||
|
||||
1. Open Chrome
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. Click top right menu `⋮` / Add to home screen.
|
||||
|
||||
4. Follow the onscreen instructions to install.
|
||||
|
||||
### Android Firefox (if that feature works and is not removed)
|
||||
|
||||
1. Open Firefox.
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. At right side of URL address, click button that has + inside of home icon.
|
||||
|
||||
4. Follow the onscreen instructions to install.
|
||||
|
||||
### Android Brave
|
||||
|
||||
1. Open Brave.
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. Click bottom right menu `⋮` / Add to home screen.
|
||||
|
||||
4. Follow the onscreen instructions to install.
|
||||
|
||||
### Android Opera
|
||||
|
||||
1. Open Opera.
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. Click top right menu `⋮` / Add to / Home screen.
|
||||
|
||||
4. Follow the onscreen instructions to install.
|
||||
|
||||
### Android Vivaldi
|
||||
|
||||
1. Open Vivaldi.
|
||||
|
||||
2. Navigate to login page of Wekan.
|
||||
|
||||
3. At right side of URL address, click [V] / Add to home screen.
|
||||
|
||||
4. Follow the onscreen instructions to install.
|
||||
|
||||
## Fullscreen Android app with Caddy and WeKan Server
|
||||
|
||||
These are mostly just notes to WeKan maintainer xet7 itself, how xet7 did get official WeKan Android Play Store app working at fullscreen of Android phone and Android tablet. Requires a lot time to setup, not recommended.
|
||||
|
||||
Related, for creating apps to other appstores: https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
|
||||
1. https://www.pwabuilder.com to create Android app. Select fullscreen when creating app, also requires correctly installed assetlinks.json with below Caddy config to get fullscreen. When creating app, make your own signing key if you don't have one yet. Releasing Android app is at Play Console https://play.google.com/console/ .
|
||||
|
||||
2. PWABuilder has about 100+ downloadable icons etc webmanifest requirements like is at https://github.com/wekan/wekan/tree/main/public
|
||||
|
||||
3. Clone WeKan repo, add favicons etc from step 2 to wekan/public/ , and build WeKan bundle from source like at https://github.com/wekan/wekan/wiki/Emoji . Note: Currently WeKan does not have feature for custom favicons, it would require a lot of work for 100+ favicons etc customizations.
|
||||
|
||||
4. Run bundle at server like https://github.com/wekan/wekan/wiki/Offline or https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
|
||||
5. Install Caddy like https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config , with this config for PWA at https://boards.example.com , there add assetlinks.json details you got when you downloaded Android .zip file from https://pwabuilder.com , see assetlinks issue about where at Play Console those 2 SHA256 keys https://github.com/pwa-builder/PWABuilder/issues/3867#issuecomment-1450826565
|
||||
|
||||
6. At Play Console https://play.google.com/console/ there is `App Integrity` button in the sidemenu (highlighted blue in the screenshot) where you find required 2 SHA256 keys for Caddyfile:
|
||||
|
||||

|
||||
|
||||
7. Caddy uses tabs for indenting. At `/etc/caddy` you can also `caddy format > ca` to format output and forward to new file, and if it works then `mv ca Caddyfile` and validate it `caddy validate` and reload `caddy reload`. Sometimes update caddy with `caddy upgrade` and after that `caddy stop` and `caddy start`.
|
||||
|
||||
8. Also related is Parallel Snaps install to one server at encrypted VM at https://github.com/wekan/wekan-snap/wiki/Many-Snaps-on-LXC
|
||||
|
||||
9. In newest requirements installing assetlinks.json is to PWA URL (like https://boards.example.com), when it before was to main domain (like https://example.com), so here just in case it's installed to both, as text in `/etc/caddy/Caddyfile`. Also see https://docs.pwabuilder.com/#/builder/android
|
||||
|
||||
10. For figuring out Caddy 2 config, xet7 found related tips from Caddy forum https://caddy.community/t/well-known-file-location/16632/4
|
||||
|
||||
`/etc/caddy/Caddyfile`
|
||||
|
||||
```
|
||||
# Redirecting http to https
|
||||
|
||||
(redirect) {
|
||||
@http {
|
||||
protocol http
|
||||
}
|
||||
redir @http https://{host}{uri}
|
||||
}
|
||||
|
||||
example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
header /.well-known/* Content-Type application/json
|
||||
header /.well-known/* Access-Control-Allow-Origin *
|
||||
respond /.well-known/assetlinks.json `[
|
||||
{
|
||||
"relation": ["delegate_permission/common.handle_all_urls"],
|
||||
"target": {
|
||||
"namespace": "android_app",
|
||||
"package_name": "team.example.boards.twa",
|
||||
"sha256_cert_fingerprints": [
|
||||
"AA:AA... FIRST SHA256 KEY",
|
||||
"61:41... 2nd SHA256 KEY"
|
||||
]
|
||||
}
|
||||
}
|
||||
]`
|
||||
root * /data/websites/example.com
|
||||
file_server
|
||||
}
|
||||
|
||||
boards.example.com {
|
||||
tls {
|
||||
alpn http/1.1
|
||||
}
|
||||
header /.well-known/* Content-Type application/json
|
||||
header /.well-known/* Access-Control-Allow-Origin *
|
||||
respond /.well-known/assetlinks.json `[
|
||||
{
|
||||
"relation": ["delegate_permission/common.handle_all_urls"],
|
||||
"target": {
|
||||
"namespace": "android_app",
|
||||
"package_name": "team.example.boards.twa",
|
||||
"sha256_cert_fingerprints": [
|
||||
"AA:AA... FIRST SHA256 KEY",
|
||||
"61:41... 2nd SHA256 KEY"
|
||||
]
|
||||
}
|
||||
}
|
||||
]`
|
||||
reverse_proxy 192.168.100.3:3025
|
||||
}
|
||||
```
|
||||
Loaded 100 of 570 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user