From 948c24b16288ac0c237893c4b34d4a4a0a2e979a Mon Sep 17 00:00:00 2001
From: lewa <lene.wasskog@nibio.no>
Date: Tue, 20 Aug 2024 13:26:03 +0200
Subject: [PATCH] feat(observations): Download excel, display message for empty
 result [VIPSUTV-710]

---
 .gitignore                                    |   3 +-
 VIPSWeb/locale/bg/LC_MESSAGES/django.po       |  34 +---------
 VIPSWeb/locale/bs/LC_MESSAGES/django.po       |  34 +---------
 VIPSWeb/locale/de/LC_MESSAGES/django.po       |  34 +---------
 VIPSWeb/locale/fi/LC_MESSAGES/django.po       |  34 +---------
 VIPSWeb/locale/nb/LC_MESSAGES/django.mo       | Bin 4284 -> 3770 bytes
 VIPSWeb/locale/nb/LC_MESSAGES/django.po       |  58 ++++++++----------
 VIPSWeb/locale/vi/LC_MESSAGES/django.po       |  34 +---------
 VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.mo  | Bin 3522 -> 3276 bytes
 VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.po  |  46 ++++----------
 VIPSWeb/views.py                              |  15 ++++-
 observations/locale/bg/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/bg/LC_MESSAGES/djangojs.po         |  12 ++--
 observations/locale/bs/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/bs/LC_MESSAGES/djangojs.po         |  12 ++--
 observations/locale/de/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/de/LC_MESSAGES/djangojs.po         |  12 ++--
 observations/locale/fi/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/fi/LC_MESSAGES/djangojs.po         |  12 ++--
 observations/locale/nb/LC_MESSAGES/django.mo  | Bin 1637 -> 0 bytes
 observations/locale/nb/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/nb/LC_MESSAGES/djangojs.mo         | Bin 637 -> 0 bytes
 .../locale/nb/LC_MESSAGES/djangojs.po         |  12 ++--
 observations/locale/vi/LC_MESSAGES/django.po  |  30 +++++----
 .../locale/vi/LC_MESSAGES/djangojs.po         |  12 ++--
 .../locale/zh_Hans/LC_MESSAGES/django.po      |  30 +++++----
 .../locale/zh_Hans/LC_MESSAGES/djangojs.po    |  12 ++--
 .../static/observations/js/observationList.js |  26 +++++++-
 .../templates/observations/index.html         |   4 ++
 29 files changed, 259 insertions(+), 357 deletions(-)
 delete mode 100755 observations/locale/nb/LC_MESSAGES/django.mo
 delete mode 100644 observations/locale/nb/LC_MESSAGES/djangojs.mo

diff --git a/.gitignore b/.gitignore
index 7cc7775e..b54f20c9 100755
--- a/.gitignore
+++ b/.gitignore
@@ -23,4 +23,5 @@ venv
 ipmd/.$IPMD_DSS_Metadata_structure.drawio.bkp
 .DS_Store
 .idea
-makefile
\ No newline at end of file
+makefile
+/static
\ No newline at end of file
diff --git a/VIPSWeb/locale/bg/LC_MESSAGES/django.po b/VIPSWeb/locale/bg/LC_MESSAGES/django.po
index 89518f80..d6868ec0 100755
--- a/VIPSWeb/locale/bg/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/bg/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2014-05-14 09:31+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,38 +30,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 1.6.5\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr ""
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr ""
diff --git a/VIPSWeb/locale/bs/LC_MESSAGES/django.po b/VIPSWeb/locale/bs/LC_MESSAGES/django.po
index b7eb4e1b..8fd8d1ad 100755
--- a/VIPSWeb/locale/bs/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/bs/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2015-02-13 11:26+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -19,38 +19,6 @@ msgstr ""
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Poedit 1.7.4\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr ""
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr ""
diff --git a/VIPSWeb/locale/de/LC_MESSAGES/django.po b/VIPSWeb/locale/de/LC_MESSAGES/django.po
index 59c5aa13..5d566efd 100755
--- a/VIPSWeb/locale/de/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr ""
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr ""
diff --git a/VIPSWeb/locale/fi/LC_MESSAGES/django.po b/VIPSWeb/locale/fi/LC_MESSAGES/django.po
index 8c9df78c..a8d6ee75 100755
--- a/VIPSWeb/locale/fi/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/fi/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr ""
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr ""
diff --git a/VIPSWeb/locale/nb/LC_MESSAGES/django.mo b/VIPSWeb/locale/nb/LC_MESSAGES/django.mo
index 41949b2b6ec954889301e56ec83cfd4515556de7..6e6787af22a0b68014df65a1b893ccb2cb96cb74 100755
GIT binary patch
delta 902
zcmdm^xJ$PFo)F7a1_lNORR#tI83qOh7e)pKQw9cx943$`1A_xI0|Ore1A`+o0|O5O
z1495a1A_nq14Aq`0|P4q14ABEzJ!^9fs=uOp_!S1ft`VYp_iF~L5zWcVJb5Ng9rly
z!y0A=25trhhJ(xu3>*v$3}=}c82A|&>KU#vGcZUnFfcrWTJRrgFb@mFKp_^0#WE}m
z45ADS44Nzu1MQ*WAuJ3GEDQ_`i7X5Zf(#4{X)Fv31`G@g6)X^ktYm>$xDm?V#lpa#
z%)r2Kh=qYciJ_i>;Ta19gF6EQ11BrQfIwCThGqr^hGbR-hF=T}49{5^7(OyEFg#*o
zU@&4}V7S5#b~yt(2gCw#4hDumMg|6X4oFB9azf|^P6h@c1_p+HPKW~*aYFR1=7i|m
z&B?&PRnNe{a2P6aj+22wih+UQ9w#KIesVG}urV+&uyR2(@^C>yK!ytvB1T*gd3&h5
z8&o`u3lc)fQ1umD5Qp?Z<ri{6%wNaFz))|_z`(GJ3*y30To9N2hAL#{W?+zJU|<m7
zhNKT2ZUzQt1_p*8ZiofbxEUB0GcYi$=4N2vXJlaT=Yi1iybKJ+3=9nUd=Q5&=7U7#
z20jJ`Mo6-Pk@es>6J}swV1^2T;t~|kiVP4-<QX8LqQt<!puoVupaN9~qCg1_M1v9<
zKLf;<Tnr2hvLHby2E{cfErSxTI0M8(ASqDDN;0^Cm=NFbGB7a6fqcsV2_8`DhR8xl
zQ0@SwY*20hrC?B^g~%{4O#Z;EKRJv=ZgM-z6_$Y1;*!ZTSzR}=9cP(*mCJClHMipA
eEbe<e!P$u^sp(mVcNC=-O`gQ#y7>#w31$F~cu({I

delta 1419
zcmdlbyGOD9o)F7a1_lNOT?PgQ83qQ17DfgJTLuP(H%uT=28IXB3=I4X3=9vM85sB&
z7#Kb>GcfRgq*xdj1Q-|?cv%=26d4#8<X9LOL>L$t99S3_SQ!`?LRlc{qgfajI2jli
zvRD`xgcukYN>~^e*cliY+F2MF#26Ur8Tz3bm$5J~a5FG4>}FwL;9y{2IL-pG_yP+9
zg9HNu!vhwG#Xq4Iu(3i6=3#}1i?K2=h%zuRD6>KwVhI)ZV`X5FWME*3W@TVtVPIe=
zg{rFp>#t{En83=wAjrVLFpHIe!GM8*VGS$9M|W8vF8$96aS%HjgfGCxz@W^)z#zfK
zz@Wsyz+l71z~Iinz!1*{F=sg&14A<d1H(=>28Le@3=FpH3=AI`7#J)#7#NHg7#OrT
zAs&n6WME*gXJBB+<z!$8WMp6{<z!&s1^Ju{5_DIg^b;;f(0%4&U{GLSU|{2BU=U_t
zU{L3VILw+GVxS8*#DO8)5OZR<85p=gK@XKL<z`@zVqjos<%Wdx0&WI|dNz=cp$ay0
zLxS)yHzY`Jax*Z1<ex$1-$KRzazlcciwB}!o(JMUQyvBeX$A%c4<3mA6drIKGZgYb
z9MZu9v3N2M1A{pO1H*hChI(+KyUqjg$rm1o5B@?8VC97vD8$Rapvu6&pvTL=;LO0l
z5W)*_zzkjnhQ$mF3~PBA82A|(7y|hqbRs_kgE0dGL!kh~Axi}yX=RfD0|O%{@iH(l
zFoWrOh|56<4#d}FfCMFo4Z>Os5C^F-K!P5WkU+Tvl+r<|9GnxNxkrP6fdQ0hK)C^w
z&~z9ezL#Zy1UtwBpmYN=7ZiOUS_u^Ypj0mp;(@Xglm?|_P__YOIZ)yR1*;q=?inE2
z4yuen9m>##(jZC&lsFk6K@Q@Jg9yi@{L&JIqRirKh1|q~Vg|>Q+|0bp;>jM&>L!Ur
zMfoKPMWw|h3TZi&3MHwz1*t`eC8b5F3c2|ysW}YJsYR)YImHTzc_|9{nK{L&sVS3l
zm=y)xib^v}Ai_zhMMasZle?L(+4+}bq!vMRLgb25i^?*SQ;Qh_Qj1F%0`f}|OY*^H
zm8GVqmLw+Sq!u#-!CW>umBm#dwV))wC^J!^C^ap$C^auRRUxA^H!~%(q!ME8<`pa_
zS$O?(K_1G?&d*LPDw$lsX=LPHnp2ctl9p4Ns!&{(T9lhwl9^ImP@0!r0`^D_gLi&W
zo<e@QLViwGYFTP_amnQQoGLtSMWxv#AmOCL%O)S>eBkAnmjd&APHGWIrX(vhFSWQN
zwTK}&J253SJ?rp}qSPXgXHrWbD$<J%@5sw5PRvd%0{I5!thHROGQlYRNz5xwO)G^t
KY4b;}lgt3>iQ=LF

diff --git a/VIPSWeb/locale/nb/LC_MESSAGES/django.po b/VIPSWeb/locale/nb/LC_MESSAGES/django.po
index 1e9d616c..f1cb3ca4 100755
--- a/VIPSWeb/locale/nb/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/nb/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VIPSWeb\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2024-03-22 09:25+0100\n"
 "Last-Translator: Tor-Einar Skog <tor-einar.skog@nibio.no>\n"
 "Language-Team: \n"
@@ -30,38 +30,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 3.4.2\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr "Risikokart"
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr "Om risikokart"
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr "Septoria referansefuktmodell"
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr "Gulrotflue svermetidspunktmodell"
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr "Korn og oljevekster"
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr "Poteter og grønnsaker"
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr "Frukt og bær"
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr "Andre modeller og tjenester"
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr "Fil ikke funnet"
@@ -230,5 +198,29 @@ msgstr "Modeller fra IPM Decisions"
 msgid "Saddle gall midge"
 msgstr "Salgallmygg"
 
+#~ msgid "Risk maps"
+#~ msgstr "Risikokart"
+
+#~ msgid "About risk maps"
+#~ msgstr "Om risikokart"
+
+#~ msgid "Septoria reference humidity model"
+#~ msgstr "Septoria referansefuktmodell"
+
+#~ msgid "Carrot rust fly temperature model"
+#~ msgstr "Gulrotflue svermetidspunktmodell"
+
+#~ msgid "Cereals and oilseeds"
+#~ msgstr "Korn og oljevekster"
+
+#~ msgid "Potato and vegetables"
+#~ msgstr "Poteter og grønnsaker"
+
+#~ msgid "Fruits and berries"
+#~ msgstr "Frukt og bær"
+
+#~ msgid "Other models and services"
+#~ msgstr "Andre modeller og tjenester"
+
 #~ msgid "Naerstad Late Blight Model"
 #~ msgstr "Nærstads modell"
diff --git a/VIPSWeb/locale/vi/LC_MESSAGES/django.po b/VIPSWeb/locale/vi/LC_MESSAGES/django.po
index d88a318d..fddb5061 100755
--- a/VIPSWeb/locale/vi/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/vi/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr ""
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr "File không tìm thấy"
diff --git a/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.mo b/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.mo
index 5aff4d0b67b3df1fe4431b16e46306c2539c48b3..ea3b4ec465f5f377c42f225e37df0bc01ecdc5b0 100644
GIT binary patch
delta 829
zcmX>keMYkWo)F7a1_lNOWd;TY83qOh6GjFGeFg>wA106}0|N&$0|Ore0|O^B0|O5O
z1A_!J1A_nq1A{6v0|P4q1A`e<-iDchfs=uO!JC<Zft`VYA(WYcL5zWcA(okeft!JW
zp@f-%frEj8p@Er!fuDhap_7?`L4tvyo?#}`;7w2i_d^Xj3Kc)k%)lVZz`$^anSnus
zfq~%@RGgiKfq{jAfkA|Yfx&=*fkBc5VzCzs#G)W5Kbi&Nxnvdw1|<dthISSP26qMq
zhE*&K41x^x3=E%G7#Nxv7#LVs85n*sFfeqmGBA8(U|?uwV_-01U|=X^hq!nJJH&z=
z><kRw85kH2urn~QF)%Rf;DCh8ekgs010sHt1ETK%l>dQ)fq{#Gf#Ev`1A`C)0|OH$
z0|Q$<0|SF7hye<IPKZIuoDd%yK>2P^`Cv|nfl*NLEKZ0)<xuf1sJdC4kf>P5$-tn(
zz`(E?Dt-Y<Ux(_y$H~A@4+`4XoD2-o3=9m6Tnr3;3=9miTo8xka4|4cGB7YyaxpMm
zVPIhR%*DWPih+UQ1UCbNIs*g4WFCk`yLli!KFY(uzz9h;48jZy4B}9>6qE)<7bu;9
zxX|QP4^AYYgeA`aNoXKRUIvIyK?w%L2Vqd$NrD)lkOC!0C>xa6K+yo=f;=O^z`!8K
zz`&pY5&(IIfq{XU0g_l1LFt775^A7C%neGKf((#&k)9mOY&3ZZv)tsX%==jaQj1GA
ipI|x2GI=Ja{NxjyD><J}Z+$Uy_0x5mH!t8)Vg>+FSxeIZ

delta 1071
zcmX>jc}Tkco)F7a1_lNObp{3o83qQ15Jm<DQw9cx9wv||149Bc0|Ore14AM+0|O5O
z1498b1A_nq14At{1A_<y14AD(0|P4q1H)pdx|Pff44e!M3_F+^7=#!Y7!ENrFt9T)
zFkEG3U=U+qV7SZ7z`)JG!0?5cfq{d8p`L+(g@J*efq{XOg@HkWfq_Ai1!9pA3&dc1
z7KnkaP;q}21_n_E28I|Ghy#kC;_WO943Z2C3{zOZMl!5}s@u%Mz+k|@z;KcU;*eh~
zV2c@;SV8=H1_o|c1_osY1_ohP1_mVt1_pCh1_pNq28JkB1_nU}28Knf3=GW-3=CUX
z85n*sFfdrKF)(~&U|=w2XJ9a5U|>+?fOsH+17sirLk0%}!*@_faWF8jF)%P>a6&wk
z52b53A?iCh85r2=85kI5LIoCp1Q-|?HbD8?IT;wZ7#J9ib3%gh5>);vlzsy>@G~bQ
zL_mr`Q6$C%u~?Z4Vv!aX!~s@Z5Odt2;!#`-4D}!vW^q9bDCB|!bvsnSL@ovf6$S=|
zg-`>JLFuzl1Ft~!J>+6wkY-?D_|C<^;0FpxZit0R+zbqr3=9nU+zbp?7#J8{ax*ZT
zVqjp{#{)@koxBY7;KZ_#7vkdGybKJCkaPzpL5T>I(3qhjEDVr@1d1|HI#7frT#!RS
z(FaP5P^I9621<;ebOlPZAaP*^1_pT$1B{ay7*rV;7(j`gmw|ynoPmKs7AygYOOUTX
zTu|-+<pKo;NSXizGbrRhaxg5%07+P&#0-iyDNtf&U|>+2%*t#elv<RUm{Y8fn3tlE
zpP5sfnwm1%gjrG0t*A7!1R|W2T2z#oIysp6poxD;Mrx5lZhlHCR7-JcQCVhkYB57V
zYH<leKz>PLNj})Dvefj{lEkE()Z)z&EC*TmUu@X^ymRH#Nj=Xt?R>s*@8laC3Va*3
zJexNMB($~d*}OTEzj3VAf7-h3$?j>-RxErvuNx#Yr}t^sLWbwlTVKpv{dC=ChNpAp
Xzu4IJbW+cYDQjNz&)K|+Q;8V>BT$|*

diff --git a/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.po b/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.po
index 28ebb88a..59639d50 100644
--- a/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/VIPSWeb/locale/zh_Hans/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 08:59+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2019-06-24 12:21+0200\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -17,38 +17,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 2.0.6\n"
 
-#: VIPSWeb/local_settings.py:211
-msgid "Risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:215
-msgid "About risk maps"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:219
-msgid "Septoria reference humidity model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:223
-msgid "Carrot rust fly temperature model"
-msgstr ""
-
-#: VIPSWeb/local_settings.py:234
-msgid "Cereals and oilseeds"
-msgstr "谷物和油籽"
-
-#: VIPSWeb/local_settings.py:267
-msgid "Potato and vegetables"
-msgstr "土豆和蔬菜"
-
-#: VIPSWeb/local_settings.py:277
-msgid "Fruits and berries"
-msgstr "水果和浆果"
-
-#: VIPSWeb/local_settings.py:292
-msgid "Other models and services"
-msgstr "其他模型和服务"
-
 #: VIPSWeb/templates/404.html:3 VIPSWeb/templates/404.html:5
 msgid "File not found"
 msgstr "找不到文件"
@@ -213,6 +181,18 @@ msgstr ""
 msgid "Saddle gall midge"
 msgstr ""
 
+#~ msgid "Cereals and oilseeds"
+#~ msgstr "谷物和油籽"
+
+#~ msgid "Potato and vegetables"
+#~ msgstr "土豆和蔬菜"
+
+#~ msgid "Fruits and berries"
+#~ msgstr "水果和浆果"
+
+#~ msgid "Other models and services"
+#~ msgstr "其他模型和服务"
+
 #~ msgid "Temporarily down for maintenance"
 #~ msgstr "暂时停机维护"
 
diff --git a/VIPSWeb/views.py b/VIPSWeb/views.py
index d2e71e4f..b94b7e43 100755
--- a/VIPSWeb/views.py
+++ b/VIPSWeb/views.py
@@ -101,8 +101,6 @@ def vipslogicproxy(request, path):
         return HttpResponseNotAllowed("Permitted methods are POST and GET")
     params = request.urlencode()
 
-
-    #print ("Params:" + params)
     try:
         url = "%s://%s/%s" % (settings.VIPSLOGIC_PROTOCOL, settings.VIPSLOGIC_SERVER_NAME,path)
         #print(url)
@@ -112,6 +110,17 @@ def vipslogicproxy(request, path):
     params_encoded = params.encode("ascii")
     response = r(url, params=params_encoded)
     if response.status_code == 200:
-        return HttpResponse(response.text, status=int(response.status_code), content_type=response.headers.get('content-type',"text/plain"))
+        content_type = response.headers.get('content-type')
+        if 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' in content_type: 
+            response_content = response.content
+            content_disposition = response.headers.get('Content-Disposition', '')
+            response = HttpResponse(response_content, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
+            if 'filename=' in content_disposition:
+                filename = content_disposition.split('filename=')[1].strip().strip('"')
+                response['Content-Disposition'] = f'attachment; filename="{filename}"'
+            return response
+        else:
+            # Handle other content types normally
+            return HttpResponse(response.text, status=response.status_code, content_type=content_type)
     else:
         return HttpResponse("[]", status=200, content_type="application/json")
diff --git a/observations/locale/bg/LC_MESSAGES/django.po b/observations/locale/bg/LC_MESSAGES/django.po
index 6986253e..24ae1e29 100644
--- a/observations/locale/bg/LC_MESSAGES/django.po
+++ b/observations/locale/bg/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,7 +30,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -38,27 +38,27 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr ""
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr ""
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -71,7 +71,7 @@ msgid "Illustrations"
 msgstr ""
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr ""
 
@@ -80,7 +80,7 @@ msgid "Observation was not quantified"
 msgstr ""
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -107,12 +107,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr ""
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr ""
 
@@ -140,6 +148,6 @@ msgstr ""
 msgid "View details"
 msgstr ""
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr ""
diff --git a/observations/locale/bg/LC_MESSAGES/djangojs.po b/observations/locale/bg/LC_MESSAGES/djangojs.po
index 30260e9f..55bdd495 100644
--- a/observations/locale/bg/LC_MESSAGES/djangojs.po
+++ b/observations/locale/bg/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,22 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/bs/LC_MESSAGES/django.po b/observations/locale/bs/LC_MESSAGES/django.po
index 5edfce4a..b23165f9 100644
--- a/observations/locale/bs/LC_MESSAGES/django.po
+++ b/observations/locale/bs/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -31,7 +31,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -39,27 +39,27 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr ""
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr ""
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -72,7 +72,7 @@ msgid "Illustrations"
 msgstr ""
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr ""
 
@@ -81,7 +81,7 @@ msgid "Observation was not quantified"
 msgstr ""
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -108,12 +108,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr ""
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr ""
 
@@ -141,6 +149,6 @@ msgstr ""
 msgid "View details"
 msgstr ""
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr ""
diff --git a/observations/locale/bs/LC_MESSAGES/djangojs.po b/observations/locale/bs/LC_MESSAGES/djangojs.po
index 059f918a..520a59f0 100644
--- a/observations/locale/bs/LC_MESSAGES/djangojs.po
+++ b/observations/locale/bs/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,22 +19,22 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/de/LC_MESSAGES/django.po b/observations/locale/de/LC_MESSAGES/django.po
index 6986253e..24ae1e29 100755
--- a/observations/locale/de/LC_MESSAGES/django.po
+++ b/observations/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,7 +30,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -38,27 +38,27 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr ""
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr ""
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -71,7 +71,7 @@ msgid "Illustrations"
 msgstr ""
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr ""
 
@@ -80,7 +80,7 @@ msgid "Observation was not quantified"
 msgstr ""
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -107,12 +107,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr ""
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr ""
 
@@ -140,6 +148,6 @@ msgstr ""
 msgid "View details"
 msgstr ""
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr ""
diff --git a/observations/locale/de/LC_MESSAGES/djangojs.po b/observations/locale/de/LC_MESSAGES/djangojs.po
index 30260e9f..55bdd495 100644
--- a/observations/locale/de/LC_MESSAGES/djangojs.po
+++ b/observations/locale/de/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,22 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/fi/LC_MESSAGES/django.po b/observations/locale/fi/LC_MESSAGES/django.po
index 6986253e..24ae1e29 100644
--- a/observations/locale/fi/LC_MESSAGES/django.po
+++ b/observations/locale/fi/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,7 +30,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -38,27 +38,27 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr ""
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr ""
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -71,7 +71,7 @@ msgid "Illustrations"
 msgstr ""
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr ""
 
@@ -80,7 +80,7 @@ msgid "Observation was not quantified"
 msgstr ""
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -107,12 +107,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr ""
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr ""
 
@@ -140,6 +148,6 @@ msgstr ""
 msgid "View details"
 msgstr ""
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr ""
diff --git a/observations/locale/fi/LC_MESSAGES/djangojs.po b/observations/locale/fi/LC_MESSAGES/djangojs.po
index 30260e9f..55bdd495 100644
--- a/observations/locale/fi/LC_MESSAGES/djangojs.po
+++ b/observations/locale/fi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,22 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/nb/LC_MESSAGES/django.mo b/observations/locale/nb/LC_MESSAGES/django.mo
deleted file mode 100755
index 837e55c3dbf467cf529f30e1cb84d1be06e12cd4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1637
zcmca7#4?qEfq_Aqfq_AWfq~%*0|SF90|UbuMvy22Ljn^611AFmLn0Fc0}BHKLpBow
z13v=;Lje;511kdqLjw~70}lfOLmLwVgD?XF!(=7~25trhhUHLtGZO;?I|Bp5ekKM6
zHU<WU<4|+XLB%gKF);8lFfiO^Vqnl_U|@L3#K6G8z`!8N%)lVVz`!5}rA?V3=K3%*
zFbFU(FhnpjFvu}5Fk~`A?C)TP=$i^vH;<Wtfr){EVHGn2gD3+7!&<1i!^{i}N{kE)
z7nmXb_{;)v7c(owTrO4!Uz(MHfscWKK?y2u$O<vvi521wZzw;U6=Ht^D+2>F0|P@Y
zRDU5<e+4TfT-#Y8;kSg9fkBpmfng;p1A_=CJfP;?f!gzem4QK-fq~&CD<oWG*&yMs
z4W&)lAokd^LHy;+260a$8v_G0%E0j;0f{~aK`0HPK=A^K15jLp_(C88ilrDJ{+ERE
zL4Fr!U|`^4fcOt24010hEr8-5#0SL>DDFV%0u;v}|AXQV6z-t30Sb2p$DAC6g4E)Y
zVg~1;`~onckepbOnx0>jnF<jsW^gVoDoV{OQAkNFNo8<JEJ;<!PgBTGDo!mbODxIE
z&x42+rzRF9XE3;=7AF^F7C^*POA<44iW%H8b4pT+7~G2Ta~V8R6H_wt(iuE+a!QL!
ziogaGGkE4D=ai<TDio!rXTn7l$}>wc@=Hs=E>tKeN-a*!OHO6*$xjCBV(?8YP$<hx
zEmz3PFHuM=OU%qkOv*`R@GH$tN-aWjV=;q2l7o@hAYUaSODdEn7K2SJEKSTS$xO>k
zO+l6}X7DdcPt40K&SeP6%uQ7&P6dZlNIpXt$SH|AImkg%3=vI%21GznepYI7iLPgg
zZdhtjab|v=l>%2#YC(QciLP&PdS;5QQ)zm!Zb-hB0#|^)Zcu7jCP<MkDA27Gj0}uS
zbPddO4a^h_jjc?Kv<-|547hv}i%WDviW2jRa}rDPi>ws5d=m50OB2&mbwg4UbCLK~
z3VBIfzMj6W2+Ixi47i;0^GZ_lN_0ai3sS8VN>VFI^b2wlGxMw!k~0#Eic?E$Lqptj
zEfDHJcBQ2j>AL16=Y!(XO2Hy2vxF-kr?e<BN7pUCD7V;3A+G?;Ew(kXR)8>VHS!b`
zZ50ePt+^s}-Ba^Yiy-a|$WKklEKxAlGto2R0;R}Qg?wlbrxr1Im*$j|!l-Om(u4^x
zxM!v2q@?Dhq=Mox9~M!?S^0UzDTyWdprn~!e0WDTgHvj8c2Q<oYEE$~gG*{jVop|S
z5rccy;T=T^r6pyFIq3{;MTra{nI$EuIq<{@GAFf&AuO{PmNHX|GV{_?L3&d26w*rb
z@)&|kQd1bb6N^g9GK=#v^U@VEv$InbN-}fOvr_ZYQ*$!Y865LUkkSRzP-q$i@z9+O
zPmdtU)I5cxoK%RZ*=3L<S)5u_f~+aE2%aia8A38siovOpAtW=0AvjebF()S#mMFm{
M7J)=TX%ZX=0Ol`{?EnA(

diff --git a/observations/locale/nb/LC_MESSAGES/django.po b/observations/locale/nb/LC_MESSAGES/django.po
index 5250ff7c..28cbdc70 100755
--- a/observations/locale/nb/LC_MESSAGES/django.po
+++ b/observations/locale/nb/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2024-06-06 13:42+0200\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -31,7 +31,7 @@ msgstr "Beskrivelse"
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -39,27 +39,27 @@ msgstr "Organisme"
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr "Kultur"
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr "Observasjonsdato"
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr "Tidsserie"
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr "Sted"
 
@@ -72,7 +72,7 @@ msgid "Illustrations"
 msgstr "Illustrasjoner"
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr "Se alle observasjoner"
 
@@ -81,7 +81,7 @@ msgid "Observation was not quantified"
 msgstr "Observasjonen ble ikke kvantifisert"
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr "Kartvisning ikke tilgjengelig"
 
@@ -108,12 +108,20 @@ msgstr "Vis registreringer uten funn"
 msgid "Filter"
 msgstr "Gjør utvalg"
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr "Ingen observasjoner funnet for angitte søkekriterier"
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr "Last ned som Excel"
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr "Tittel"
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr "Detaljer"
 
@@ -141,7 +149,7 @@ msgstr "Kultur"
 msgid "View details"
 msgstr "Se detaljer"
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr "Antall observasjoner"
 
diff --git a/observations/locale/nb/LC_MESSAGES/djangojs.mo b/observations/locale/nb/LC_MESSAGES/djangojs.mo
deleted file mode 100644
index 5c17154378d12510a2ba65b59e8b05a675d7e137..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 637
zcmca7#4?qEfq{XIfq_AWfq}t?fq{XWfq|h0B*?(Pu!4bsfrWvAVI>0tgBSw?!#V~A
z1_cHNhNBD&46F<c49^%C7?>Cs7~U{2FgP(XFuaF~8!<63h%+!SSTHd#s4y@v1TaC=
zmohOhFfuSOR6}WyH6U|9Gzc?;2&kDLH-YR13%Mj#7Bhedh2qS-<Wz<Hq~g?~vc!_i
z{5%GK1Y4t6Qz0$CG%rOVu|y#!KN+eZCndFrAv2F5peR2pHMvCBGetKnwWv5VKhH`b
zz|q;;(cM)c%rz+3)8CIPD77HJs6^MdI6X5(*QqqUST`i!N`WiDUpFYVEEA+h*Cnwe
z)k-1K)iFrd*I(DgQNhFC%GXmn%HPkG%O|n8L^q@;F|Rl$u_V99O2IAE$49}>(brYM
z#?{x+)5pQl#U;o!IM|NMCowO*G%-C@HzYMN*Gj?1(a${;<PsYnABUVwz5Jqdgc>Ua
zE?-YySA??-^$fV2^Ycnl^Gb9>DhpDr6iQMnO7shI5;OCx6_PU&i;7cAY(qobbS)6-
zK+Z}_Ez)((OU_Tp%uBaYut>@*;R?tpElSMMb;~cxEw)m~D*$tgZH=rIAWU10JOxEt
z1w&11E(Vvx^wc5<sZgAml9~sLisCFpRDjqTsYRL!X{C92sU->phnFhk<Yy=5WR|3s
OFu3NV6s0m`G5`Q@rKRZr

diff --git a/observations/locale/nb/LC_MESSAGES/djangojs.po b/observations/locale/nb/LC_MESSAGES/djangojs.po
index 4fe28cd0..57cb0dec 100644
--- a/observations/locale/nb/LC_MESSAGES/djangojs.po
+++ b/observations/locale/nb/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,23 +18,23 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr "Observasjon(er) funnet på lokalitet"
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr "i"
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr "Dager siden observasjon"
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr "Dager"
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr "Eldre"
 
diff --git a/observations/locale/vi/LC_MESSAGES/django.po b/observations/locale/vi/LC_MESSAGES/django.po
index 9c31f9f7..ac8500b2 100644
--- a/observations/locale/vi/LC_MESSAGES/django.po
+++ b/observations/locale/vi/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,7 +30,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -38,27 +38,27 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr ""
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr ""
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -71,7 +71,7 @@ msgid "Illustrations"
 msgstr ""
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr ""
 
@@ -80,7 +80,7 @@ msgid "Observation was not quantified"
 msgstr ""
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -107,12 +107,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr ""
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 msgid "Details"
 msgstr ""
 
@@ -140,6 +148,6 @@ msgstr ""
 msgid "View details"
 msgstr ""
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 msgid "Number of observations"
 msgstr ""
diff --git a/observations/locale/vi/LC_MESSAGES/djangojs.po b/observations/locale/vi/LC_MESSAGES/djangojs.po
index fd1b1877..cc3cb0bf 100644
--- a/observations/locale/vi/LC_MESSAGES/djangojs.po
+++ b/observations/locale/vi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,22 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/zh_Hans/LC_MESSAGES/django.po b/observations/locale/zh_Hans/LC_MESSAGES/django.po
index 7c83a7a0..ac151a14 100755
--- a/observations/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/observations/locale/zh_Hans/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:11+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: 2016-10-27 11:26+0200\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -29,7 +29,7 @@ msgstr ""
 
 #: observations/templates/observations/detail.html:36
 #: observations/templates/observations/index.html:46
-#: observations/templates/observations/index.html:68
+#: observations/templates/observations/index.html:74
 #: observations/templates/observations/index_old.html:63
 #: observations/templates/observations/timeseries.html:34
 msgid "Organism"
@@ -37,27 +37,27 @@ msgstr "生物"
 
 #: observations/templates/observations/detail.html:38
 #: observations/templates/observations/index.html:50
-#: observations/templates/observations/index.html:69
+#: observations/templates/observations/index.html:75
 #: observations/templates/observations/index_old.html:64
 #: observations/templates/observations/timeseries.html:36
 msgid "Crop"
 msgstr "作物"
 
 #: observations/templates/observations/detail.html:40
-#: observations/templates/observations/index.html:67
+#: observations/templates/observations/index.html:73
 #: observations/templates/observations/index_old.html:62
 msgid "Date of observation"
 msgstr "观测时间"
 
 #: observations/templates/observations/detail.html:43
-#: observations/templates/observations/index.html:71
+#: observations/templates/observations/index.html:77
 #: observations/templates/observations/timeseries.html:23
 #: observations/templates/observations/timeseries.html:28
 msgid "Time series"
 msgstr ""
 
 #: observations/templates/observations/detail.html:47
-#: observations/templates/observations/timeseries.html:38
+#: observations/templates/observations/timeseries.html:39
 msgid "Location"
 msgstr ""
 
@@ -72,7 +72,7 @@ msgid "Illustrations"
 msgstr "观测"
 
 #: observations/templates/observations/detail.html:68
-#: observations/templates/observations/timeseries.html:54
+#: observations/templates/observations/timeseries.html:56
 msgid "View all observations"
 msgstr "查看所有观测"
 
@@ -81,7 +81,7 @@ msgid "Observation was not quantified"
 msgstr "观测没有定量化"
 
 #: observations/templates/observations/detail.html:164
-#: observations/templates/observations/timeseries.html:165
+#: observations/templates/observations/timeseries.html:167
 msgid "Map view not available"
 msgstr ""
 
@@ -108,12 +108,20 @@ msgstr ""
 msgid "Filter"
 msgstr ""
 
-#: observations/templates/observations/index.html:70
+#: observations/templates/observations/index.html:66
+msgid "No observations found for specified search criteria"
+msgstr ""
+
+#: observations/templates/observations/index.html:69
+msgid "Download as Excel"
+msgstr ""
+
+#: observations/templates/observations/index.html:76
 #: observations/templates/observations/index_old.html:65
 msgid "Heading"
 msgstr "标题"
 
-#: observations/templates/observations/index.html:72
+#: observations/templates/observations/index.html:78
 #, fuzzy
 #| msgid "View details"
 msgid "Details"
@@ -145,7 +153,7 @@ msgstr "作物"
 msgid "View details"
 msgstr "看细节"
 
-#: observations/templates/observations/timeseries.html:40
+#: observations/templates/observations/timeseries.html:42
 #, fuzzy
 #| msgid "Date of observation"
 msgid "Number of observations"
diff --git a/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po b/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
index fd1b1877..cc3cb0bf 100644
--- a/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-06-26 09:00+0200\n"
+"POT-Creation-Date: 2024-08-20 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,22 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: observations/static/observations/js/observationList.js:185
+#: observations/static/observations/js/observationList.js:190
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:203
+#: observations/static/observations/js/observationList.js:208
 msgid "in"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:637
+#: observations/static/observations/js/observationList.js:657
 msgid "Days since observation"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:640
+#: observations/static/observations/js/observationList.js:660
 msgid "Days"
 msgstr ""
 
-#: observations/static/observations/js/observationList.js:642
+#: observations/static/observations/js/observationList.js:662
 msgid "Older"
 msgstr ""
diff --git a/observations/static/observations/js/observationList.js b/observations/static/observations/js/observationList.js
index 7ca4bc60..5917232d 100644
--- a/observations/static/observations/js/observationList.js
+++ b/observations/static/observations/js/observationList.js
@@ -155,9 +155,14 @@ var initMap = function(
     }
     
     // Get observations from backend
-    $.getJSON( "/vipslogicproxy/rest/observation/list/filter/" + organizationId + (params.length > 0 ? "?" + params.join("&") : ""), function( data ) {
+    const filterPath =  "/vipslogicproxy/rest/observation/list/filter/" + organizationId;
+    const filterParams = (params.length > 0 ? "?" + params.join("&") : "");
+    const jsonUrl = filterPath + filterParams;
+    const xlsxUrl = filterPath + "/xlsx" + filterParams;
+
+    $.getJSON( jsonUrl, function( data ) {
         allObservations = data;
-        renderObservationTable(data);
+        renderObservationTable(data, xlsxUrl);
         renderObservationFeatures();
 
     });
@@ -296,8 +301,23 @@ var getObservation = function(observationId)
 /**
  * Show the table of observations
  */
-var renderObservationTable = function(data)
+var renderObservationTable = function(data, xlsxUrl)
 {
+    const emptyResult = document.getElementById("emptyResult");
+    const downloadLink = document.getElementById('downloadLink');
+
+    const tableElement = document.getElementById("observationTable");
+    
+    if (data.length === 0) {
+        emptyResult.style.display = "block";
+        downloadLink.style.display = "none";
+        tableElement.style.display = "none";
+        return;
+    } 
+    emptyResult.style.display = "none";
+    downloadLink.style.display = "block";
+    downloadLink.href = xlsxUrl;
+
     var tbody = document.getElementById("observationTableBody");
     var tbodyHTML = [];
     for(var i=0; i<data.length;i++)
diff --git a/observations/templates/observations/index.html b/observations/templates/observations/index.html
index d55ae212..70071e5a 100644
--- a/observations/templates/observations/index.html
+++ b/observations/templates/observations/index.html
@@ -61,6 +61,10 @@
               </div>
             <button type="submit" class="btn btn-primary">{% trans "Filter" %}</button>
         </form>
+        <div style="padding: 10px 0px">
+            <span id="emptyResult">{% trans "No observations found for specified search criteria" %}</span>
+            <a id="downloadLink" href="">{% trans "Download as Excel" %}</a>
+        </div>
         <div class="table-responsive">
             <table class="table table-striped" id="observationTable">
                     <thead>
-- 
GitLab