mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-10-10 02:16:12 -05:00
Compare commits
1 Commits
feature-tr
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
![]() |
86534dc959 |
20
Dockerfile
20
Dockerfile
@@ -5,7 +5,7 @@
|
||||
# Purpose: Compiles the frontend
|
||||
# Notes:
|
||||
# - Does PNPM stuff with Typescript and such
|
||||
FROM --platform=$BUILDPLATFORM docker.io/node:20-trixie-slim AS compile-frontend
|
||||
FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim AS compile-frontend
|
||||
|
||||
COPY ./src-ui /src/src-ui
|
||||
|
||||
@@ -32,7 +32,7 @@ RUN set -eux \
|
||||
# Purpose: Installs s6-overlay and rootfs
|
||||
# Comments:
|
||||
# - Don't leave anything extra in here either
|
||||
FROM ghcr.io/astral-sh/uv:0.8.22-python3.12-bookworm-slim AS s6-overlay-base
|
||||
FROM ghcr.io/astral-sh/uv:0.8.23-python3.12-bookworm-slim AS s6-overlay-base
|
||||
|
||||
WORKDIR /usr/src/s6
|
||||
|
||||
@@ -170,8 +170,20 @@ RUN set -eux \
|
||||
&& apt-get update \
|
||||
&& apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} \
|
||||
&& echo "Installing pre-built updates" \
|
||||
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all \
|
||||
https://github.com/paperless-ngx/builder/releases/download/jbig2enc-v${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& curl --fail --silent --no-progress-meter --show-error --location --remote-name-all --parallel --parallel-max 4 \
|
||||
https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
||||
https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
||||
https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10-common_${GS_VERSION}.dfsg-1_all.deb \
|
||||
https://github.com/paperless-ngx/builder/releases/download/jbig2enc-${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& echo "Installing qpdf ${QPDF_VERSION}" \
|
||||
&& dpkg --install ./libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& dpkg --install ./qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& echo "Installing Ghostscript ${GS_VERSION}" \
|
||||
&& dpkg --install ./libgs10-common_${GS_VERSION}.dfsg-1_all.deb \
|
||||
&& dpkg --install ./libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
||||
&& dpkg --install ./ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \
|
||||
&& echo "Installing jbig2enc" \
|
||||
&& dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \
|
||||
&& echo "Configuring imagemagick" \
|
||||
|
319
dev.txt
319
dev.txt
@@ -1,319 +0,0 @@
|
||||
adduser 3.134
|
||||
apt 2.6.1
|
||||
base-files 12.4+deb12u11
|
||||
base-passwd 3.6.1
|
||||
bash 5.2.15-2+b8
|
||||
bsdutils 1:2.38.1-5+deb12u3
|
||||
ca-certificates 20230311+deb12u1
|
||||
coreutils 9.1-1
|
||||
curl 7.88.1-10+deb12u12
|
||||
dash 0.5.12-2
|
||||
debconf 1.5.82
|
||||
debian-archive-keyring 2023.3+deb12u2
|
||||
debianutils 5.7-0.5~deb12u1
|
||||
diffutils 1:3.8-4
|
||||
dirmngr 2.2.40-1.1
|
||||
dpkg 1.21.22
|
||||
e2fsprogs 1.47.0-2
|
||||
file 1:5.44-3
|
||||
findutils 4.9.0-4
|
||||
fontconfig 2.14.1-4
|
||||
fontconfig-config 2.14.1-4
|
||||
fonts-liberation 1:1.07.4-11
|
||||
fonts-urw-base35 20200910-7
|
||||
gcc-12-base 12.2.0-14+deb12u1
|
||||
gettext 0.21-12
|
||||
gettext-base 0.21-12
|
||||
ghostscript 10.03.1~dfsg-1
|
||||
gnupg 2.2.40-1.1
|
||||
gnupg-l10n 2.2.40-1.1
|
||||
gnupg-utils 2.2.40-1.1
|
||||
gosu 1.14-1+b10
|
||||
gpg 2.2.40-1.1
|
||||
gpg-agent 2.2.40-1.1
|
||||
gpg-wks-client 2.2.40-1.1
|
||||
gpg-wks-server 2.2.40-1.1
|
||||
gpgconf 2.2.40-1.1
|
||||
gpgsm 2.2.40-1.1
|
||||
gpgv 2.2.40-1.1
|
||||
grep 3.8-5
|
||||
gzip 1.12-1
|
||||
hicolor-icon-theme 0.17-2
|
||||
hostname 3.23+nmu1
|
||||
icc-profiles-free 2.0.1+dfsg-1.1
|
||||
imagemagick 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||
imagemagick-6-common 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||
imagemagick-6.q16 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||
init-system-helpers 1.65.2
|
||||
jbig2dec 0.19-3
|
||||
jbig2enc 0.30-1
|
||||
libacl1 2.3.1-3
|
||||
libaom3 3.6.0-1+deb12u1
|
||||
libapt-pkg6.0 2.6.1
|
||||
libarchive13 3.6.2-1+deb12u2
|
||||
libassuan0 2.5.5-5
|
||||
libattr1 1:2.5.1-4
|
||||
libaudit-common 1:3.0.9-1
|
||||
libaudit1 1:3.0.9-1
|
||||
libavahi-client3 0.8-10+deb12u1
|
||||
libavahi-common-data 0.8-10+deb12u1
|
||||
libavahi-common3 0.8-10+deb12u1
|
||||
libavcodec59 7:5.1.6-0+deb12u1
|
||||
libavformat59 7:5.1.6-0+deb12u1
|
||||
libavutil57 7:5.1.6-0+deb12u1
|
||||
libblkid1 2.38.1-5+deb12u3
|
||||
libbluray2 1:1.3.4-1
|
||||
libbrotli1 1.0.9-2+b6
|
||||
libbsd0 0.11.7-2
|
||||
libbz2-1.0 1.0.8-5+b1
|
||||
libc-bin 2.36-9+deb12u10
|
||||
libc6 2.36-9+deb12u10
|
||||
libcairo-gobject2 1.16.0-7
|
||||
libcairo2 1.16.0-7
|
||||
libcap-ng0 0.8.3-1+b3
|
||||
libcap2 1:2.66-4+deb12u1
|
||||
libchromaprint1 1.5.1-2+b1
|
||||
libcjson1 1.7.15-1+deb12u2
|
||||
libcodec2-1.0 1.0.5-1
|
||||
libcom-err2 1.47.0-2
|
||||
libconfig-inifiles-perl 3.000003-2
|
||||
libcrypt1 1:4.4.33-2
|
||||
libcups2 2.4.2-3+deb12u8
|
||||
libcurl4 7.88.1-10+deb12u12
|
||||
libdatrie1 0.2.13-2+b1
|
||||
libdav1d6 1.0.0-2+deb12u1
|
||||
libdb5.3 5.3.28+dfsg2-1
|
||||
libdbus-1-3 1.14.10-1~deb12u1
|
||||
libde265-0 1.0.11-1+deb12u2
|
||||
libdebconfclient0 0.270
|
||||
libdeflate0 1.14-1
|
||||
libdrm-common 2.4.114-1
|
||||
libdrm2 2.4.114-1+b1
|
||||
libedit2 3.1-20221030-2
|
||||
libexpat1 2.5.0-1+deb12u1
|
||||
libext2fs2 1.47.0-2
|
||||
libffi8 3.4.4-1
|
||||
libfftw3-double3 3.3.10-1
|
||||
libfontconfig1 2.14.1-4
|
||||
libfontenc1 1:1.1.4-1
|
||||
libfreetype6 2.12.1+dfsg-5+deb12u4
|
||||
libfribidi0 1.0.8-2.1
|
||||
libgcc-s1 12.2.0-14+deb12u1
|
||||
libgcrypt20 1.10.1-3
|
||||
libgdbm-compat4 1.23-3
|
||||
libgdbm6 1.23-3
|
||||
libgdk-pixbuf-2.0-0 2.42.10+dfsg-1+deb12u2
|
||||
libgdk-pixbuf2.0-common 2.42.10+dfsg-1+deb12u2
|
||||
libgif7 5.2.1-2.5
|
||||
libglib2.0-0 2.74.6-2+deb12u6
|
||||
libgme0 0.6.3-6
|
||||
libgmp10 2:6.2.1+dfsg1-1.1
|
||||
libgnutls30 3.7.9-2+deb12u5
|
||||
libgomp1 12.2.0-14+deb12u1
|
||||
libgpg-error0 1.46-1
|
||||
libgraphite2-3 1.3.14-1
|
||||
libgs-common 10.0.0~dfsg-11+deb12u7
|
||||
libgs10 10.03.1~dfsg-1
|
||||
libgs10-common 10.03.1~dfsg-1
|
||||
libgsm1 1.0.22-1
|
||||
libgssapi-krb5-2 1.20.1-2+deb12u3
|
||||
libharfbuzz0b 6.0.0+dfsg-3
|
||||
libheif1 1.15.1-1+deb12u1
|
||||
libhogweed6 3.8.1-2
|
||||
libhwy1 1.0.3-3+deb12u1
|
||||
libice6 2:1.0.10-1
|
||||
libicu72 72.1-3+deb12u1
|
||||
libidn12 1.41-1
|
||||
libidn2-0 2.3.3-1+b1
|
||||
libijs-0.35 0.35-15
|
||||
libimagequant0 2.17.0-1
|
||||
libjbig0 2.1-6.1
|
||||
libjbig2dec0 0.19-3
|
||||
libjpeg62-turbo 1:2.1.5-2
|
||||
libjxl0.7 0.7.0-10+deb12u1
|
||||
libk5crypto3 1.20.1-2+deb12u3
|
||||
libkeyutils1 1.6.3-2
|
||||
libkrb5-3 1.20.1-2+deb12u3
|
||||
libkrb5support0 1.20.1-2+deb12u3
|
||||
libksba8 1.6.3-2
|
||||
liblcms2-2 2.14-2
|
||||
libldap-2.5-0 2.5.13+dfsg-5
|
||||
liblept5 1.82.0-3+b3
|
||||
liblerc4 4.0.0+ds-2
|
||||
liblqr-1-0 0.4.2-2.1
|
||||
libltdl7 2.4.7-7~deb12u1
|
||||
liblz4-1 1.9.4-1
|
||||
liblzma5 5.4.1-1
|
||||
libmagic-mgc 1:5.44-3
|
||||
libmagic1 1:5.44-3
|
||||
libmagickcore-6.q16-6 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||
libmagickwand-6.q16-6 8:6.9.11.60+dfsg-1.6+deb12u3
|
||||
libmariadb3 1:10.11.11-0+deb12u1
|
||||
libmbedcrypto7 2.28.3-1
|
||||
libmd0 1.0.4-2
|
||||
libmfx1 22.5.4-1
|
||||
libmount1 2.38.1-5+deb12u3
|
||||
libmp3lame0 3.100-6
|
||||
libmpg123-0 1.31.2-1+deb12u1
|
||||
libncurses6 6.4-4
|
||||
libncursesw6 6.4-4
|
||||
libnettle8 3.8.1-2
|
||||
libnghttp2-14 1.52.0-1+deb12u2
|
||||
libnorm1 1.5.9+dfsg-2
|
||||
libnpth0 1.6-3
|
||||
libnsl2 1.3.0-2
|
||||
libnspr4 2:4.35-1
|
||||
libnss3 2:3.87.1-1+deb12u1
|
||||
libnuma1 2.0.16-1
|
||||
libogg0 1.3.5-3
|
||||
libopenjp2-7 2.5.0-2+deb12u1
|
||||
libopenmpt0 0.6.9-1
|
||||
libopus0 1.3.1-3
|
||||
libp11-kit0 0.24.1-2
|
||||
libpam-modules 1.5.2-6+deb12u1
|
||||
libpam-modules-bin 1.5.2-6+deb12u1
|
||||
libpam-runtime 1.5.2-6+deb12u1
|
||||
libpam0g 1.5.2-6+deb12u1
|
||||
libpango-1.0-0 1.50.12+ds-1
|
||||
libpangocairo-1.0-0 1.50.12+ds-1
|
||||
libpangoft2-1.0-0 1.50.12+ds-1
|
||||
libpaper1 1.1.29
|
||||
libpcre2-8-0 10.42-1
|
||||
libperl5.36 5.36.0-7+deb12u2
|
||||
libpgm-5.3-0 5.3.128~dfsg-2
|
||||
libpixman-1-0 0.42.2-1
|
||||
libpng16-16 1.6.39-2
|
||||
libpoppler126 22.12.0-2+deb12u1
|
||||
libpq5 15.13-0+deb12u1
|
||||
libpsl5 0.21.2-1
|
||||
libqpdf29 11.9.0-1
|
||||
librabbitmq4 0.11.0-1+deb12u1
|
||||
librav1e0 0.5.1-6
|
||||
libreadline8 8.2-1.3
|
||||
librist4 0.2.7+dfsg-1
|
||||
librsvg2-2 2.54.7+dfsg-1~deb12u1
|
||||
librtmp1 2.4+20151223.gitfa8646d.1-2+b2
|
||||
libsasl2-2 2.1.28+dfsg-10
|
||||
libsasl2-modules-db 2.1.28+dfsg-10
|
||||
libseccomp2 2.5.4-1+deb12u1
|
||||
libselinux1 3.4-1+b6
|
||||
libsemanage-common 3.4-1
|
||||
libsemanage2 3.4-1+b5
|
||||
libsepol2 3.4-2.1
|
||||
libshine3 3.1.1-2
|
||||
libsm6 2:1.2.3-1
|
||||
libsmartcols1 2.38.1-5+deb12u3
|
||||
libsnappy1v5 1.1.9-3
|
||||
libsodium23 1.0.18-1
|
||||
libsoxr0 0.1.3-4
|
||||
libspeex1 1.2.1-2
|
||||
libsqlite3-0 3.40.1-2+deb12u1
|
||||
libsrt1.5-gnutls 1.5.1-1+deb12u1
|
||||
libss2 1.47.0-2
|
||||
libssh-gcrypt-4 0.10.6-0+deb12u1
|
||||
libssh2-1 1.10.0-3+b1
|
||||
libssl3 3.0.17-1~deb12u1
|
||||
libstdc++6 12.2.0-14+deb12u1
|
||||
libsvtav1enc1 1.4.1+dfsg-1
|
||||
libswresample4 7:5.1.6-0+deb12u1
|
||||
libsystemd0 252.38-1~deb12u1
|
||||
libtasn1-6 4.19.0-2+deb12u1
|
||||
libtesseract5 5.3.0-2
|
||||
libthai-data 0.1.29-1
|
||||
libthai0 0.1.29-1
|
||||
libtheora0 1.1.1+dfsg.1-16.1+b1
|
||||
libtiff6 4.5.0-6+deb12u2
|
||||
libtinfo6 6.4-4
|
||||
libtirpc-common 1.3.3+ds-1
|
||||
libtirpc3 1.3.3+ds-1
|
||||
libtwolame0 0.4.0-2
|
||||
libudev1 252.38-1~deb12u1
|
||||
libudfread0 1.1.2-1
|
||||
libunistring2 1.0-2
|
||||
libuuid1 2.38.1-5+deb12u3
|
||||
libv4l-0 1.22.1-5+b2
|
||||
libv4lconvert0 1.22.1-5+b2
|
||||
libva-drm2 2.17.0-1
|
||||
libva-x11-2 2.17.0-1
|
||||
libva2 2.17.0-1
|
||||
libvdpau1 1.5-2
|
||||
libvorbis0a 1.3.7-1
|
||||
libvorbisenc2 1.3.7-1
|
||||
libvorbisfile3 1.3.7-1
|
||||
libvpx7 1.12.0-1+deb12u4
|
||||
libwebp7 1.2.4-0.2+deb12u1
|
||||
libwebpdemux2 1.2.4-0.2+deb12u1
|
||||
libwebpmux3 1.2.4-0.2+deb12u1
|
||||
libx11-6 2:1.8.4-2+deb12u2
|
||||
libx11-data 2:1.8.4-2+deb12u2
|
||||
libx11-xcb1 2:1.8.4-2+deb12u2
|
||||
libx264-164 2:0.164.3095+gitbaee400-3
|
||||
libx265-199 3.5-2+b1
|
||||
libxau6 1:1.0.9-1
|
||||
libxcb-dri3-0 1.15-1
|
||||
libxcb-render0 1.15-1
|
||||
libxcb-shm0 1.15-1
|
||||
libxcb1 1.15-1
|
||||
libxdmcp6 1:1.1.2-3
|
||||
libxext6 2:1.3.4-1+b1
|
||||
libxfixes3 1:6.0.0-2
|
||||
libxml2 2.9.14+dfsg-1.3~deb12u2
|
||||
libxrender1 1:0.9.10-1.1
|
||||
libxslt1.1 1.1.35-1+deb12u1
|
||||
libxt6 1:1.2.1-1.1
|
||||
libxvidcore4 2:1.3.7-1
|
||||
libxxhash0 0.8.1-1
|
||||
libzbar0 0.23.92-7+deb12u1
|
||||
libzmq5 4.3.4-6
|
||||
libzstd1 1.5.4+dfsg2-5
|
||||
libzvbi-common 0.2.41-1
|
||||
libzvbi0 0.2.41-1
|
||||
login 1:4.13+dfsg1-1+deb12u1
|
||||
logsave 1.47.0-2
|
||||
mariadb-client 1:10.11.11-0+deb12u1
|
||||
mariadb-client-core 1:10.11.11-0+deb12u1
|
||||
mariadb-common 1:10.11.11-0+deb12u1
|
||||
mawk 1.3.4.20200120-3.1
|
||||
media-types 10.0.0
|
||||
mount 2.38.1-5+deb12u3
|
||||
mysql-common 5.8+1.1.0
|
||||
ncurses-base 6.4-4
|
||||
ncurses-bin 6.4-4
|
||||
netbase 6.4
|
||||
ocl-icd-libopencl1 2.3.1-1
|
||||
openssl 3.0.17-1~deb12u1
|
||||
passwd 1:4.13+dfsg1-1+deb12u1
|
||||
perl 5.36.0-7+deb12u2
|
||||
perl-base 5.36.0-7+deb12u2
|
||||
perl-modules-5.36 5.36.0-7+deb12u2
|
||||
pinentry-curses 1.2.1-1
|
||||
pngquant 2.17.0-1
|
||||
poppler-data 0.4.12-1
|
||||
poppler-utils 22.12.0-2+deb12u1
|
||||
postgresql-client 15+248
|
||||
postgresql-client-15 15.13-0+deb12u1
|
||||
postgresql-client-common 248
|
||||
qpdf 11.9.0-1
|
||||
readline-common 8.2-1.3
|
||||
sed 4.9-1
|
||||
sensible-utils 0.0.17+nmu1
|
||||
shared-mime-info 2.2-1
|
||||
sysvinit-utils 3.06-4
|
||||
tar 1.34+dfsg-1.2+deb12u1
|
||||
tesseract-ocr 5.3.0-2
|
||||
tesseract-ocr-deu 1:4.1.0-2
|
||||
tesseract-ocr-eng 1:4.1.0-2
|
||||
tesseract-ocr-fra 1:4.1.0-2
|
||||
tesseract-ocr-ita 1:4.1.0-2
|
||||
tesseract-ocr-osd 1:4.1.0-2
|
||||
tesseract-ocr-spa 1:4.1.0-2
|
||||
tzdata 2025b-0+deb12u1
|
||||
ucf 3.0043+nmu1+deb12u1
|
||||
unpaper 7.0.0-0.1
|
||||
usr-is-merged 37~deb12u1
|
||||
util-linux 2.38.1-5+deb12u3
|
||||
util-linux-extra 2.38.1-5+deb12u3
|
||||
x11-common 1:7.7+23
|
||||
xfonts-encodings 1:1.0.4-2.2
|
||||
xfonts-utils 1:7.7+6
|
||||
zlib1g 1:1.2.13.dfsg-1
|
@@ -1636,7 +1636,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context>
|
||||
@@ -1862,7 +1862,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
<context context-type="linenumber">153</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2134950584701094962" datatype="html">
|
||||
@@ -1918,77 +1918,63 @@
|
||||
<source>Result</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5404910960991552159" datatype="html">
|
||||
<source>Dismiss selected</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">110</context>
|
||||
<context context-type="linenumber">108</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8829078752502782653" datatype="html">
|
||||
<source>Dismiss all</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">111</context>
|
||||
<context context-type="linenumber">109</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="1323591410517879795" datatype="html">
|
||||
<source>Confirm Dismiss All</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4157200209636243740" datatype="html">
|
||||
<source>Dismiss all <x id="PH" equiv-text="tasks.size"/> tasks?</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">153</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3597309129998924778" datatype="html">
|
||||
<source>Error dismissing tasks</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">161</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2132179171926568807" datatype="html">
|
||||
<source>Error dismissing task</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">170</context>
|
||||
<context context-type="linenumber">151</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="9011556615675272238" datatype="html">
|
||||
<source>queued</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">246</context>
|
||||
<context context-type="linenumber">236</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6415892379431855826" datatype="html">
|
||||
<source>started</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">248</context>
|
||||
<context context-type="linenumber">238</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7510279840486540181" datatype="html">
|
||||
<source>completed</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">250</context>
|
||||
<context context-type="linenumber">240</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4083337005045748464" datatype="html">
|
||||
<source>failed</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
|
||||
<context context-type="linenumber">252</context>
|
||||
<context context-type="linenumber">242</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3418677553313974490" datatype="html">
|
||||
@@ -2574,11 +2560,11 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1028</context>
|
||||
<context context-type="linenumber">1025</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1393</context>
|
||||
<context context-type="linenumber">1390</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||
@@ -3190,7 +3176,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">981</context>
|
||||
<context context-type="linenumber">978</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||
@@ -6668,7 +6654,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1392</context>
|
||||
<context context-type="linenumber">1389</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6490688569532630280" datatype="html">
|
||||
@@ -7032,53 +7018,53 @@
|
||||
<source>Error retrieving metadata</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">669</context>
|
||||
<context context-type="linenumber">666</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3456881259945295697" datatype="html">
|
||||
<source>Error retrieving suggestions.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">698</context>
|
||||
<context context-type="linenumber">695</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2194092841814123758" datatype="html">
|
||||
<source>Document "<x id="PH" equiv-text="newValues.title"/>" saved successfully.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">870</context>
|
||||
<context context-type="linenumber">867</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">894</context>
|
||||
<context context-type="linenumber">891</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6626387786259219838" datatype="html">
|
||||
<source>Error saving document "<x id="PH" equiv-text="this.document.title"/>"</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">900</context>
|
||||
<context context-type="linenumber">897</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="448882439049417053" datatype="html">
|
||||
<source>Error saving document</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">950</context>
|
||||
<context context-type="linenumber">947</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8410796510716511826" datatype="html">
|
||||
<source>Do you really want to move the document "<x id="PH" equiv-text="this.document.title"/>" to the trash?</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">982</context>
|
||||
<context context-type="linenumber">979</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="282586936710748252" datatype="html">
|
||||
<source>Documents can be restored prior to permanent deletion.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">983</context>
|
||||
<context context-type="linenumber">980</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||
@@ -7089,7 +7075,7 @@
|
||||
<source>Move to trash</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">985</context>
|
||||
<context context-type="linenumber">982</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||
@@ -7100,14 +7086,14 @@
|
||||
<source>Error deleting document</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1004</context>
|
||||
<context context-type="linenumber">1001</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="619486176823357521" datatype="html">
|
||||
<source>Reprocess confirm</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1024</context>
|
||||
<context context-type="linenumber">1021</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||
@@ -7118,81 +7104,81 @@
|
||||
<source>This operation will permanently recreate the archive file for this document.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1025</context>
|
||||
<context context-type="linenumber">1022</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="302054111564709516" datatype="html">
|
||||
<source>The archive file will be re-generated with the current settings.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1026</context>
|
||||
<context context-type="linenumber">1023</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8251197608401006898" datatype="html">
|
||||
<source>Reprocess operation for "<x id="PH" equiv-text="this.document.title"/>" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1036</context>
|
||||
<context context-type="linenumber">1033</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4409560272830824468" datatype="html">
|
||||
<source>Error executing operation</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1047</context>
|
||||
<context context-type="linenumber">1044</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6030453331794586802" datatype="html">
|
||||
<source>Error downloading document</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1096</context>
|
||||
<context context-type="linenumber">1093</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4458954481601077369" datatype="html">
|
||||
<source>Page Fit</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1173</context>
|
||||
<context context-type="linenumber">1170</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4663705961777238777" datatype="html">
|
||||
<source>PDF edit operation for "<x id="PH" equiv-text="this.document.title"/>" will begin in the background.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1411</context>
|
||||
<context context-type="linenumber">1408</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="9043972994040261999" datatype="html">
|
||||
<source>Error executing PDF edit operation</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1423</context>
|
||||
<context context-type="linenumber">1420</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3740891324955700797" datatype="html">
|
||||
<source>Print failed.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1455</context>
|
||||
<context context-type="linenumber">1452</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6457245677384603573" datatype="html">
|
||||
<source>Error loading document for printing.</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1463</context>
|
||||
<context context-type="linenumber">1460</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="6085793215710522488" datatype="html">
|
||||
<source>An error occurred loading tiff: <x id="PH" equiv-text="err.toString()"/></source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1528</context>
|
||||
<context context-type="linenumber">1525</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||
<context context-type="linenumber">1532</context>
|
||||
<context context-type="linenumber">1529</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4958946940233632319" datatype="html">
|
||||
|
@@ -16,7 +16,6 @@ import {
|
||||
NgbNavItem,
|
||||
} from '@ng-bootstrap/ng-bootstrap'
|
||||
import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
|
||||
import { throwError } from 'rxjs'
|
||||
import { routes } from 'src/app/app-routing.module'
|
||||
import {
|
||||
PaperlessTask,
|
||||
@@ -29,7 +28,6 @@ import { PermissionsGuard } from 'src/app/guards/permissions.guard'
|
||||
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
|
||||
import { PermissionsService } from 'src/app/services/permissions.service'
|
||||
import { TasksService } from 'src/app/services/tasks.service'
|
||||
import { ToastService } from 'src/app/services/toast.service'
|
||||
import { environment } from 'src/environments/environment'
|
||||
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
|
||||
import { PageHeaderComponent } from '../../common/page-header/page-header.component'
|
||||
@@ -125,7 +123,6 @@ describe('TasksComponent', () => {
|
||||
let router: Router
|
||||
let httpTestingController: HttpTestingController
|
||||
let reloadSpy
|
||||
let toastService: ToastService
|
||||
|
||||
beforeEach(async () => {
|
||||
TestBed.configureTestingModule({
|
||||
@@ -160,7 +157,6 @@ describe('TasksComponent', () => {
|
||||
httpTestingController = TestBed.inject(HttpTestingController)
|
||||
modalService = TestBed.inject(NgbModal)
|
||||
router = TestBed.inject(Router)
|
||||
toastService = TestBed.inject(ToastService)
|
||||
fixture = TestBed.createComponent(TasksComponent)
|
||||
component = fixture.componentInstance
|
||||
jest.useFakeTimers()
|
||||
@@ -253,42 +249,6 @@ describe('TasksComponent', () => {
|
||||
expect(dismissSpy).toHaveBeenCalledWith(selected)
|
||||
})
|
||||
|
||||
it('should show an error and re-enable modal buttons when dismissing multiple tasks fails', () => {
|
||||
component.selectedTasks = new Set([tasks[0].id, tasks[1].id])
|
||||
const error = new Error('dismiss failed')
|
||||
const toastSpy = jest.spyOn(toastService, 'showError')
|
||||
const dismissSpy = jest
|
||||
.spyOn(tasksService, 'dismissTasks')
|
||||
.mockReturnValue(throwError(() => error))
|
||||
|
||||
let modal: NgbModalRef
|
||||
modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1]))
|
||||
|
||||
component.dismissTasks()
|
||||
expect(modal).not.toBeUndefined()
|
||||
|
||||
modal.componentInstance.confirmClicked.emit()
|
||||
|
||||
expect(dismissSpy).toHaveBeenCalledWith(new Set([tasks[0].id, tasks[1].id]))
|
||||
expect(toastSpy).toHaveBeenCalledWith('Error dismissing tasks', error)
|
||||
expect(modal.componentInstance.buttonsEnabled).toBe(true)
|
||||
expect(component.selectedTasks.size).toBe(0)
|
||||
})
|
||||
|
||||
it('should show an error when dismissing a single task fails', () => {
|
||||
const error = new Error('dismiss failed')
|
||||
const toastSpy = jest.spyOn(toastService, 'showError')
|
||||
const dismissSpy = jest
|
||||
.spyOn(tasksService, 'dismissTasks')
|
||||
.mockReturnValue(throwError(() => error))
|
||||
|
||||
component.dismissTask(tasks[0])
|
||||
|
||||
expect(dismissSpy).toHaveBeenCalledWith(new Set([tasks[0].id]))
|
||||
expect(toastSpy).toHaveBeenCalledWith('Error dismissing task', error)
|
||||
expect(component.selectedTasks.size).toBe(0)
|
||||
})
|
||||
|
||||
it('should support dismiss all tasks', () => {
|
||||
let modal: NgbModalRef
|
||||
modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1]))
|
||||
|
@@ -24,7 +24,6 @@ import { PaperlessTask } from 'src/app/data/paperless-task'
|
||||
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
|
||||
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
|
||||
import { TasksService } from 'src/app/services/tasks.service'
|
||||
import { ToastService } from 'src/app/services/toast.service'
|
||||
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
|
||||
import { PageHeaderComponent } from '../../common/page-header/page-header.component'
|
||||
import { LoadingComponentWithPermissions } from '../../loading-component/loading.component'
|
||||
@@ -73,7 +72,6 @@ export class TasksComponent
|
||||
tasksService = inject(TasksService)
|
||||
private modalService = inject(NgbModal)
|
||||
private readonly router = inject(Router)
|
||||
private readonly toastService = inject(ToastService)
|
||||
|
||||
public activeTab: TaskTab
|
||||
public selectedTasks: Set<number> = new Set()
|
||||
@@ -156,19 +154,11 @@ export class TasksComponent
|
||||
modal.componentInstance.confirmClicked.pipe(first()).subscribe(() => {
|
||||
modal.componentInstance.buttonsEnabled = false
|
||||
modal.close()
|
||||
this.tasksService.dismissTasks(tasks).subscribe({
|
||||
error: (e) => {
|
||||
this.toastService.showError($localize`Error dismissing tasks`, e)
|
||||
modal.componentInstance.buttonsEnabled = true
|
||||
},
|
||||
})
|
||||
this.tasksService.dismissTasks(tasks)
|
||||
this.clearSelection()
|
||||
})
|
||||
} else {
|
||||
this.tasksService.dismissTasks(tasks).subscribe({
|
||||
error: (e) =>
|
||||
this.toastService.showError($localize`Error dismissing task`, e),
|
||||
})
|
||||
this.tasksService.dismissTasks(tasks)
|
||||
this.clearSelection()
|
||||
}
|
||||
}
|
||||
|
@@ -41,3 +41,9 @@
|
||||
min-width: 140px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-group-xs {
|
||||
> .btn {
|
||||
border-radius: 0.15rem;
|
||||
}
|
||||
}
|
||||
|
@@ -1212,7 +1212,7 @@ describe('DocumentDetailComponent', () => {
|
||||
it('should support keyboard shortcuts', () => {
|
||||
initNormally()
|
||||
|
||||
const hasNextSpy = jest.spyOn(component, 'hasNext').mockReturnValue(true)
|
||||
jest.spyOn(component, 'hasNext').mockReturnValue(true)
|
||||
const nextSpy = jest.spyOn(component, 'nextDoc')
|
||||
document.dispatchEvent(
|
||||
new KeyboardEvent('keydown', { key: 'arrowright', ctrlKey: true })
|
||||
@@ -1226,32 +1226,21 @@ describe('DocumentDetailComponent', () => {
|
||||
)
|
||||
expect(prevSpy).toHaveBeenCalled()
|
||||
|
||||
const isDirtySpy = jest
|
||||
.spyOn(openDocumentsService, 'isDirty')
|
||||
.mockReturnValue(true)
|
||||
jest.spyOn(openDocumentsService, 'isDirty').mockReturnValue(true)
|
||||
const saveSpy = jest.spyOn(component, 'save')
|
||||
document.dispatchEvent(
|
||||
new KeyboardEvent('keydown', { key: 's', ctrlKey: true })
|
||||
)
|
||||
expect(saveSpy).toHaveBeenCalled()
|
||||
|
||||
hasNextSpy.mockReturnValue(true)
|
||||
jest.spyOn(openDocumentsService, 'isDirty').mockReturnValue(true)
|
||||
jest.spyOn(component, 'hasNext').mockReturnValue(true)
|
||||
const saveNextSpy = jest.spyOn(component, 'saveEditNext')
|
||||
document.dispatchEvent(
|
||||
new KeyboardEvent('keydown', { key: 's', ctrlKey: true, shiftKey: true })
|
||||
)
|
||||
expect(saveNextSpy).toHaveBeenCalled()
|
||||
|
||||
saveSpy.mockClear()
|
||||
saveNextSpy.mockClear()
|
||||
isDirtySpy.mockReturnValue(true)
|
||||
hasNextSpy.mockReturnValue(false)
|
||||
document.dispatchEvent(
|
||||
new KeyboardEvent('keydown', { key: 's', ctrlKey: true, shiftKey: true })
|
||||
)
|
||||
expect(saveNextSpy).not.toHaveBeenCalled()
|
||||
expect(saveSpy).toHaveBeenCalledWith(true)
|
||||
|
||||
const closeSpy = jest.spyOn(component, 'close')
|
||||
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'escape' }))
|
||||
expect(closeSpy).toHaveBeenCalled()
|
||||
|
@@ -615,10 +615,7 @@ export class DocumentDetailComponent
|
||||
})
|
||||
.pipe(takeUntil(this.unsubscribeNotifier))
|
||||
.subscribe(() => {
|
||||
if (this.openDocumentService.isDirty(this.document)) {
|
||||
if (this.hasNext()) this.saveEditNext()
|
||||
else this.save(true)
|
||||
}
|
||||
if (this.openDocumentService.isDirty(this.document)) this.saveEditNext()
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -51,7 +51,7 @@ describe('TasksService', () => {
|
||||
})
|
||||
|
||||
it('calls acknowledge_tasks api endpoint on dismiss and reloads', () => {
|
||||
tasksService.dismissTasks(new Set([1, 2, 3])).subscribe()
|
||||
tasksService.dismissTasks(new Set([1, 2, 3]))
|
||||
const req = httpTestingController.expectOne(
|
||||
`${environment.apiBaseUrl}tasks/acknowledge/`
|
||||
)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { HttpClient } from '@angular/common/http'
|
||||
import { Injectable, inject } from '@angular/core'
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
import { first, takeUntil, tap } from 'rxjs/operators'
|
||||
import { first, takeUntil } from 'rxjs/operators'
|
||||
import {
|
||||
PaperlessTask,
|
||||
PaperlessTaskName,
|
||||
@@ -68,17 +68,14 @@ export class TasksService {
|
||||
}
|
||||
|
||||
public dismissTasks(task_ids: Set<number>) {
|
||||
return this.http
|
||||
this.http
|
||||
.post(`${this.baseUrl}tasks/acknowledge/`, {
|
||||
tasks: [...task_ids],
|
||||
})
|
||||
.pipe(
|
||||
first(),
|
||||
takeUntil(this.unsubscribeNotifer),
|
||||
tap(() => {
|
||||
this.reload()
|
||||
})
|
||||
)
|
||||
.pipe(first())
|
||||
.subscribe((r) => {
|
||||
this.reload()
|
||||
})
|
||||
}
|
||||
|
||||
public cancelPending(): void {
|
||||
|
@@ -161,21 +161,3 @@ class PaperlessNotePermissions(BasePermission):
|
||||
perms = self.perms_map[request.method]
|
||||
|
||||
return request.user.has_perms(perms)
|
||||
|
||||
|
||||
class AcknowledgeTasksPermissions(BasePermission):
|
||||
"""
|
||||
Permissions class that checks for model permissions for acknowledging tasks.
|
||||
"""
|
||||
|
||||
perms_map = {
|
||||
"POST": ["documents.change_paperlesstask"],
|
||||
}
|
||||
|
||||
def has_permission(self, request, view):
|
||||
if not request.user or not request.user.is_authenticated: # pragma: no cover
|
||||
return False
|
||||
|
||||
perms = self.perms_map.get(request.method, [])
|
||||
|
||||
return request.user.has_perms(perms)
|
||||
|
@@ -135,44 +135,6 @@ class TestTasks(DirectoriesMixin, APITestCase):
|
||||
response = self.client.get(self.ENDPOINT + "?acknowledged=false")
|
||||
self.assertEqual(len(response.data), 0)
|
||||
|
||||
def test_acknowledge_tasks_requires_change_permission(self):
|
||||
"""
|
||||
GIVEN:
|
||||
- A regular user initially without change permissions
|
||||
- A regular user with change permissions
|
||||
WHEN:
|
||||
- API call is made to acknowledge tasks
|
||||
THEN:
|
||||
- The first user is forbidden from acknowledging tasks
|
||||
- The second user is allowed to acknowledge tasks
|
||||
"""
|
||||
regular_user = User.objects.create_user(username="test")
|
||||
self.client.force_authenticate(user=regular_user)
|
||||
|
||||
task = PaperlessTask.objects.create(
|
||||
task_id=str(uuid.uuid4()),
|
||||
task_file_name="task_one.pdf",
|
||||
)
|
||||
|
||||
response = self.client.post(
|
||||
self.ENDPOINT + "acknowledge/",
|
||||
{"tasks": [task.id]},
|
||||
)
|
||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||
|
||||
regular_user2 = User.objects.create_user(username="test2")
|
||||
regular_user2.user_permissions.add(
|
||||
Permission.objects.get(codename="change_paperlesstask"),
|
||||
)
|
||||
regular_user2.save()
|
||||
self.client.force_authenticate(user=regular_user2)
|
||||
|
||||
response = self.client.post(
|
||||
self.ENDPOINT + "acknowledge/",
|
||||
{"tasks": [task.id]},
|
||||
)
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
|
||||
def test_tasks_owner_aware(self):
|
||||
"""
|
||||
GIVEN:
|
||||
|
@@ -136,7 +136,6 @@ from documents.models import WorkflowAction
|
||||
from documents.models import WorkflowTrigger
|
||||
from documents.parsers import get_parser_class_for_mime_type
|
||||
from documents.parsers import parse_date_generator
|
||||
from documents.permissions import AcknowledgeTasksPermissions
|
||||
from documents.permissions import PaperlessAdminPermissions
|
||||
from documents.permissions import PaperlessNotePermissions
|
||||
from documents.permissions import PaperlessObjectPermissions
|
||||
@@ -2488,11 +2487,7 @@ class TasksViewSet(ReadOnlyModelViewSet):
|
||||
queryset = PaperlessTask.objects.filter(task_id=task_id)
|
||||
return queryset
|
||||
|
||||
@action(
|
||||
methods=["post"],
|
||||
detail=False,
|
||||
permission_classes=[IsAuthenticated, AcknowledgeTasksPermissions],
|
||||
)
|
||||
@action(methods=["post"], detail=False)
|
||||
def acknowledge(self, request):
|
||||
serializer = AcknowledgeTasksViewSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
Reference in New Issue
Block a user