From f149f9ccb195d7dafc0e24df967051e9ccf3bef3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Oct 2022 20:34:44 +0000 Subject: [PATCH 01/35] Bump zipp from 3.9.0 to 3.10.0 Bumps [zipp](https://github.com/jaraco/zipp) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: zipp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Pipfile.lock | 201 ++++++++++++++++++++++----------------------------- 1 file changed, 87 insertions(+), 114 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 4493544e2..5cd5c1e5a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -218,7 +218,7 @@ "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==2.1.1" }, "click": { @@ -1301,111 +1301,84 @@ }, "rapidfuzz": { "hashes": [ - "sha256:036f904bcac16d726273eee7ec0636978af31d151f30c95b611240e22592ab79", - "sha256:0429a7a51d1372afaca969ee3170f9975f2fe6e187b485aeef55d3e8d7d934e0", - "sha256:09de4fd3dbcc73f61b85af006372f48fee7d4324de227702b9da0d2572445d26", - "sha256:0c8a5e65cab629ca5bb4b1d2b410f8444384b60364ab528508200acfdf9e659d", - "sha256:0e64ab58b19866ad3df53e651a429871d744f8794cca25c553396b25d679a1ac", - "sha256:0f09ff49b28e557615a9ad4d5eedbfd5b886fccb3ec35d85dd34c51348c4bf98", - "sha256:12e14b0c43e3bc0c679ef09bfcbcaf9397534e03b8854c417086779a79e08bb2", - "sha256:134a467692216e05a8806efe40e3bcae9aa81b9e051b209a4244b639a168c78e", - "sha256:13ce1019ddce7419502fac43b62ac166d3d6d290b727050e3de5bda79a6beb59", - "sha256:16a2edf3ea888c9d3582761a2bbaa734e03f6db25d96e73edd4dcef6883897ee", - "sha256:17ba5fb474515356608cdb8d750f95c12f3e4dc9a0e2c9d7caca3d4cee55048e", - "sha256:2183fc91971c0853f6170225577d24d81b865d416104b433de53e55a6d2a476a", - "sha256:24569412e1aac1ac008548cdcd40da771e14467f4bacab9f9abfe5bbb5dfe8be", - "sha256:254d5a800de54c416fa9b220e442a4861b272c1223139ae3dee0aea1c9f27c9c", - "sha256:2bc3ec87df5eaad59e6e02e6517047fb268a48866f3531c4b8b59c2c78069fe5", - "sha256:2d3652804ae17920eaa965b1e057ee0ea32d5bb02f50147c82a1d350a86fc3f1", - "sha256:30773e23bebe27ddcf7644d6ebb143bf7c9adeb18019a963172174ef522c0831", - "sha256:3b6573607568438dfc3d4341b0b00d326ac2cf86281df97e7f8c0348e2f89b5e", - "sha256:3d50a2ca8cd1cea13afd2ff8e052ba49860c64cc3e617398670fd6a8d11e450f", - "sha256:3f1c030e2d61d77cb14814640618e29cf13e4554340a3baa9191d162a4dfcd9e", - "sha256:40e8d37d67a6e4713ddb6053eb3007a3ca15eddd23f2e4a5039c39e666c10b3a", - "sha256:41c9e2acfa25c7667b70913d63887f76e981badc1e95a2878257d28b96f5a10c", - "sha256:42d18db6f7e1e6ef85a8e673b2fa3352727cc56e60e48e7c9268fe0286ab9f91", - "sha256:475aacad5d5c4f9ad920b4232cc196d79a1777fe1eada9122103c30154d18af4", - "sha256:47e163d6a6676be9a3a7e93d5a2c3c65a43c1530b680903ebdba951e07ee7999", - "sha256:5080ad715e39b8a2d82339cf4170785e9092c7625ec2095ff3590fdb0a532a41", - "sha256:52639268dffc8900892a5e57964228fb187512b0f249de9a45ba37c6f2bc52a5", - "sha256:54264d70af59224d6874fcc5828da50d99668055574fe254849cab96f3b80e43", - "sha256:553e8e3dce321ed33e8b437586e7765d78e6d8fbb236b02768b46e1b2b91b41e", - "sha256:56aa67bf938e8dcc5e940f183538f09041441f1c4c5a86abe748416950db9d27", - "sha256:578934d7524f8378175295e6411b737d35d393d91d4661c739daa8ea2b185836", - "sha256:588dd5f520683af53a9d9d0cabde0987788c0ea9adfda3b058a9c27f448b2b3f", - "sha256:5aff0ac1723f7c8d751869a51e6b12d703fd6e6153228d68d8773f19bd5bd968", - "sha256:5e3164736ed071dc743994b9228ead52b63010aba24b1621de81b3ac39d490b9", - "sha256:5e89f50f5f3be2b851e9714015e1a26c6546e6b42f3df69b86200af8eacf9d8c", - "sha256:61152fa1e3df04b4e748f09338f36ca32f7953829f4e630d26f7f564f4cb527b", - "sha256:64133c9f45cb88b508d52427339b796c76e1790300c7ea4d2ed210f224e0698d", - "sha256:65b8611c9f5385a2986e11e85137cdecf40610e5d5f250d96a9ed32b7e995c4a", - "sha256:6803ef01f4056d61120e37acba8953e6b3149363e85caaba40ee8d49753fe7bd", - "sha256:68d46ad148c9cb8be532b5dd7bc246b067e81d4cfabad19b4cb6ac4031cab124", - "sha256:6b12420d5b769cd7e1478a8085aeea1ad0ffc8f7fedc86c48b8d598e1602f5ad", - "sha256:705ccd8de2b7b5295c6a230a3919fc9db8da9d2a6347c15c871fcb2202abd237", - "sha256:7478341137e65a0227fda4f3e39b3d50e6ec7dd4f767077dd435b412c2f2c129", - "sha256:769cf4099f53507231ba04cbf9ee16bea3c193767efc9bdf5e6c59e67e6b5cea", - "sha256:7750b950a6987bce114b9f36413399712422f4f49b2ad43f4b4ee3af34968b99", - "sha256:7c457f779992a0f5527455cdc17c387268ae9f712d4e29d691704c83c6e58c2d", - "sha256:7dd6a439fb09dc9ba463de3f5c8e20f097225816b33a66380b68c8561a08045c", - "sha256:804c7c67dc316f77b01b9bef5e75f727b73ff1015ff0514972b59dc05eec4d81", - "sha256:86038b9777b2aa0ebf8c586b81cba166ccde7e6d744aad576cd98c1a07be4c53", - "sha256:86c34175830cacac1c16d2182a0f725afbd40042955b7572c8475e3b6a5d8ada", - "sha256:8a11b70ebb2d7317d69bdb1f692a0eda292a4cddfe9ccb760a8d1a9e763811dd", - "sha256:8b402e99593483a8b05a09fb2a20379ecaa9b0d1f1cf32957b42134bd3305731", - "sha256:8b480a78227457a0b65e0b23afbda9c152dee4e1b41ccc058db8c41ea7a82ab0", - "sha256:8bc00bd6b6407dc7a8eb31964bcc38862c25e7f5f5982f912f265eb3c4d83140", - "sha256:8d6fa1d009fcb9a9169548c29d65a1f05c0fcf1ac966f40e35035307d6a17050", - "sha256:9081542fea2baeebda8caa43a54ecd8a152a05ff3271c38ac8eae447377cef54", - "sha256:931a939ba5e5574f769507038fdf400dbbc46aab2866d4e5e96d83a29f081712", - "sha256:984d40ecda0bc0109c4239d782dfe87362d02b286548672f8a2468eabbf48a69", - "sha256:9924497dec6a30b5158ef7cc9c60a87c6c46d9f7b7bb7254d4f157b57b531fb8", - "sha256:a48ff6b6258a32f50f876a6c74fa2f506c1de3b11773d6bf31b6715255807a48", - "sha256:a7f5a77466c4701062469bce29358ca0797db2bc6d8f6c3cd4e13f418cca10bc", - "sha256:a98c63d1f5ec2c15adf5dc81c461c8d88c16395956f4518b78e2e04b3285b1e5", - "sha256:adc7c6cb3dde5c284d84c7c6f4602b1545ba89c6ebb857b337d0428befb344e5", - "sha256:b4f577ded3e40695d5e0796e8b7f4fa78577d873627e0d0692f7060ad73af314", - "sha256:b5c7b0a4929bfd3945d9c2022cff0b683a39accf5594897fa9004cee4f402b06", - "sha256:b5cd1ea9fa396243d34f7bac5bb5787f89310f13fd2b092d11940c6cd7bd0bd8", - "sha256:bafd18a27dbe3197e460809468a7c47d9d29d1ebab6a878d5bb5a71fda2056d6", - "sha256:bd595bd23a4e1c72d5f5ac416ea49b9a3d87e11fb2db4b960378038ce9bb12f7", - "sha256:bd7a1992e91c90197c34ccc674bd64262262627083c99896b79e2c9f5fe28075", - "sha256:bd8f36d8bd399c7d695182e467b4428adb940a157014ab605bbe4d0ab0a1976e", - "sha256:bf5277ff74c9980245697ea227057d0f05b31c96bc73bae2697c1a48d4980e45", - "sha256:bfabc6130752f4f77584b2ecbba2adf6fe469b06c52cb974ba8304f1f63bb24f", - "sha256:c10724490b87fcb86161e5ceb17893626d13363e31efee77aa8e251ee16dcdd5", - "sha256:c1477455b82d6db7336ef769f507a55bba9fe9f1c96dc531d7c2c510630307d6", - "sha256:c288e239fc3aaae3865e43e1f35b606f92ee687a0801e4d46c45d7849aebbe35", - "sha256:c305ea5405f8615e6ecd39cb28acc7a362713ba3c17c7737b591b377d1afd9ec", - "sha256:c77cec595dc80f97a1b32413fb1b618e4da8ba132697e075ad8e4025c4058575", - "sha256:c822853e9d54979eb5fcf9e54c1f90e5c18eeb399571383ac768cff47d6d6ada", - "sha256:cad5088f1adb9161f2def653908328cfa1dc9bc57e7e41ccdc9339d31cc576d1", - "sha256:cc3103e31d27352afe4c5a71702e09185850187d299145d5e98f9fb99a3be498", - "sha256:ced719fcae6f2a348ac596b67f6d7c26ff3d9d2b7378237953ac5e162d8a4e2e", - "sha256:d181889218d80f6beb5ae3838bc23e201d2a1fae688baaa40d82ef9080594315", - "sha256:d1d8192820d8489a8e3ef160cbe38f5ff974db5263c76438cf44e7574743353b", - "sha256:d24181dfdfcc3d9b37333fea2f5bf9f51e034bd9e0ba67a871f18686b797c739", - "sha256:d51b9183ebce60d4795ceaef24b8db2df3ed04307ee787d6adafcc196330a47c", - "sha256:dad6697c6b9e02dd45f73e22646913daad743afd27dadb0b6a430a1573fb4566", - "sha256:dafe8c6e74fea0fdcfec002bc77aee40b4891b14ea513e6092402609ac8dac00", - "sha256:dc0f695b32700b14f404cccaebc25eea6db323418385568297995aee8b5278f8", - "sha256:e2fe220d4b100b00734d9388e33296ac8f585c763548c372ca17b24affa178e0", - "sha256:e459287f0daaee3ee0108123d7e9a1c1c136e94d4382533a93cb509d54dc1ea3", - "sha256:ea4107a5cc00a05c92be47047662000296d2ccc7ba93aaa030cd5ecab8d5ffaf", - "sha256:ea4f0d056a95cfdabde667a1796f9ba5296d2776bce2fd4d4cb5674e0e10671f", - "sha256:ea5bc5bae1cf447b79be04f05e73b6ea39a5df63374f70cc5d6862337462d4d9", - "sha256:ecfe2fe942edabcd1553701237710de296d3eb45472f9128662c95da98e9ed43", - "sha256:eec5ad2f06701e57a2cb483c849704bdf8ea76195918550ab2fc4287970f1c76", - "sha256:f2f91b867d7eca3b99c25e06e7e3a6f84cd4ccb99f390721670ba956f79167c9", - "sha256:f5ed8d4e1545f08bd3745cc47742b3689f1a652b00590caeb32caf3297d01e06", - "sha256:f6e6395404b0239cff7873a18a94839343a44429624f2a70a27b914cc5059580", - "sha256:f71edc8503d08bc5d35187eb72f13b7ec78647f1c14bb90a758ae795b049f788", - "sha256:f72d33b0d76a658d8b692b3e42c45539939bac26ff5b71b516cb20fa6d8ff7f6", - "sha256:f9226824c132d38f2337d2c76e3009acc036f0b05f20e95e82f8195400e1e366", - "sha256:faba219b270b78e9494cfe3d955d7b45c10799c18ee47ec24b1ada93978d491b" + "sha256:028aa9edfa044629a0a9e924a168a01f61c8f570c9ea919e2ed214826ba1cdfb", + "sha256:02a5c8b780af49a4e5f08033450d3f7c696f6c04e57c67ecbb19c9944ea3ce20", + "sha256:07c623741958dd49d8c2c51f7c2e62472f41b8d795cc9c734e441e30de3f8330", + "sha256:129c93a76c4fed176b4eaaf78fecd290932971bca10315dee9feaf94a7b443b1", + "sha256:13ad87a539b13794292fb661b8c4f4c19e6c066400d9db991e3a1441f55fc29b", + "sha256:16426b441d28efb3b1fe10f2b81aa469020655cef068a32de6ec24433590ee5b", + "sha256:1a600b037a56a61111c01809b5e4c4b5aac12edf2769c094fefab02d496a95a4", + "sha256:1e0f6f878c20454a7e7ea2ed30970ae0334852c5e422e7014757821fa33c1588", + "sha256:20f2f0f0746ffc165168ca160c5b1a1485076bdde5b656cf3dbe532ef2ac57ff", + "sha256:2207927f42ae7b7fbcc1a4ff86f202647776200f3d8723603e7acf96af924e9f", + "sha256:22487992f4811c8aef449736f483514f0294d5593f5f9c95cbfb2474dbc363b9", + "sha256:22646f54d44d98d6f462fb3f1ac997ea53aaebdd1344039e8f75090f43e47a89", + "sha256:22e8b127abcf0b10ebf8a9b3351c3c980e5c27cb60a865632d90d6a698060a9a", + "sha256:238fddfb90fab858ced88d064608bff9aed83cec11a7630a4e95b7e49734d8b1", + "sha256:241912c4f7f232c7518384f8cea719cf2ff290f80735355a217e9c690d274f62", + "sha256:25db060ba8082c38f75da482ff15d3b60a4bc59f158b6d29a2c5bccadd2b71b0", + "sha256:2676f7ccd22a67638baff054a8e13924f20d87efb3a873f6ea248a395a80e2c8", + "sha256:27fa0e7d5e5291dc3e48c6512524f2f8e7ba3d397fa712a85a97639e3d6597e9", + "sha256:2c2cd1e01e8aef2bd1b5152e66e0b865f31eb2d00a8d28cbbbb802f42e2dbe43", + "sha256:2e9709a163ec3b890f9a4173261e9ef586046feee74bbece62595bf103421178", + "sha256:2fda8c003d9ae4f3674c783887b31ecb76f4ab58670a8f01b93efd0917c1e503", + "sha256:33cfd01cb7f8a48c8e057198e3814a120323c0360017dd5c4eba07d097b43b39", + "sha256:35737fd5766ca212d98e0598fb4d302f509e1cbf7b6dc42e2eddefd956150815", + "sha256:35b34f33a9f0a86fdba39053b203d8d517da76f3553230a55867c51f0d802b67", + "sha256:3abe9c25f9ba260a6828d24002a15112c5f21c6877c5f8c294ffe4b9d197c6d2", + "sha256:3e8707e98b645f80834e24103e7cd67f1b772999bb979da6d61ca1fcdc07672a", + "sha256:3eae4c6880dbabee9f363950510c09d7e12dea8dbc6ebcd2ff58e594a78d9370", + "sha256:3f7b798807ac9c5f632e8f359adf1393f81d9211e4961eedb5e2d4ce311e0078", + "sha256:45def44f1140c6f5c7a5389645d02e8011d27a6e64f529f33cee687e7c25af07", + "sha256:475a551c43ba23b4ca328c9bbcae39205729f4751280eb9763da08d97d328953", + "sha256:4787d8e9f4b184d383ad000cdd48330ae75ec927c5832067a6b3617c5f6fb677", + "sha256:4f3f0ddfe3176e19c0a3cf6ad29e9ff216ff5fdec035b001ebabad91ef155107", + "sha256:4fc958b21416825c599e228278c69efb480169cd99d1a21787a54f53fbff026c", + "sha256:589464c49a332c644b750f2ebc3737d444427669323ace623bd4948e414a641a", + "sha256:5c6a9ada752149e23051852867596b35afc79015760e23676ac287bcad58e0b6", + "sha256:5e2c0a5a0346ce95a965ed6fa941edcf129cac22bf63314b684a3fe64078c95b", + "sha256:5fa88543c5744d725fc989afd79926c226e1c5f5c00904834851997f367da2b5", + "sha256:651664023726f28f7447e40fa2b8a015514f9db4b58654e9bf7d3729e2606eab", + "sha256:7a67d93fd2e6e5a4e278eade2bbef16ba88d4efcb4eed106f075b0b21427a92f", + "sha256:7e34c996cc245a21f376c3b8eede1296339845f039c8c270297a455d3a1ad71b", + "sha256:7f2db0c684d9999c81084aa370e2e6b266b694e76c7e356bbeb3b282ca524475", + "sha256:7febf074f7de7ebc374100be0036fc592659af911b6efbc1135cdebfe939c57d", + "sha256:800b1498989bfb64118b219eeb42957b3d93ec7d6955dfc742a3cbf3be738f2f", + "sha256:917e3e2ffc0e078cce4a632f65d32a339f18cad22b5536a32c641bf1900e7f96", + "sha256:96fe7da85d8721c3a5c362f6b1e7fd26ad74a76bebc369fb7ae62907cf069940", + "sha256:9836bea98f25a67c296f57cf6de420c88f46e430ee85d25ae5f397968c7adcdf", + "sha256:9c8295dd49582dfb6a29e5f9dfa1691a0edd2e0512377ceb2c8dd11e7fabd38a", + "sha256:9ceb8d6f1bd18a058cb8472c6e8cc84802413a65b029a7832589ba7b76c0eb11", + "sha256:9e239e404dbb9fec308409e174710b5e53ff8bd9647e8875e2ca245b1f762f89", + "sha256:9f849d4889a0f1bc2260b981b1ae8393938e8a2c92666e1757e69f947c6ce868", + "sha256:a9a90ab26b12218d10d5f148e84e8facd62f562bc25d32e2c3cf3c743f7e0e67", + "sha256:ac6ce417174a086a496aefc7caa614640dc33d418a922ee0a184b093d84f2f6c", + "sha256:ac95a2ca4add04f349f8f5c05269d8b194a72ebdfc4f86a725c15d79a420d429", + "sha256:ad279e4892652583671a7ece977dd9b1eb17ae9752fbc9013c950095b044a315", + "sha256:ad5935f4a0ec3a2c3d19021fcd27addce4892ae00f71cc4180009bc4bed930ac", + "sha256:ae0519d01a05c6204c2d27ae49b2231787d9a6efc801d5dbf131b20065fd21e3", + "sha256:b2b81c6cb59b955b82a4853e3fbef7231da87c5522a69daaf9b01bd81d137ec3", + "sha256:b63402c5af2ad744c2c1ab2e7265eb317e75257fd27eb6f087fea76464b065db", + "sha256:b75fe7abf55e7da6d32174b5ac207a465d1bc69d777049c277776472c0b7d82c", + "sha256:c0006c6450d02efdfef8d3f81e6a87790572486046676fe29f4c5da8708ea11b", + "sha256:c1191a1c9f24134c6048770aabaa2f7def8d6d4c919da857d5e7dabdf63308f2", + "sha256:c43579c7a64f21c9b4d4c3106ace46a8ebfb8e704372e6c8cc45807d1b86462f", + "sha256:c62472a70c7f22f1ae9864c02554dbc234a1dfbac24388542bf87437a4169379", + "sha256:c6c4064b2324b86f7a035379928fe1f3aca4ca5ba75ebedc9ea0d821b0e05606", + "sha256:c74b960a1b93ac22e6cbf268ce509fb2c2338a29180c3d844df4a57bfff73273", + "sha256:c9c2b3b00033afdb745cc77b8c2ed858b08bb9a773c9a81a1160ece59a361545", + "sha256:c9fdbe8b1b32a731ee48a21a161358e55067c9cabd36ba0b8d844e5106056920", + "sha256:d0fc1e32353afef426488d2e19cd295f1f504323215275ec0871bdae2b052a70", + "sha256:d5b65d9f2860210087739adadc075bd9215b363d00c3c8e68369560683a4c3df", + "sha256:d6e6972c5bd1ee4f532029616dfe0f5133f7cc688ebc05dbbc03e19b4ec12199", + "sha256:e333bb6a69c515a1fce149002aaf7d8902fddab54db14fe14c89c6da402410d2", + "sha256:ef812c73fff460678defaab3a95ec9b7551ef14d424eb6af7b75e376050119d2", + "sha256:f030223aa618a48d2f8339fd674c4c03db88649313e2c65107e9c04e09edc7f2", + "sha256:f74636ca4a3ce700f4fe2dbe10d224ee4fb52ecab12ea3007a2bc2fcd0d53888", + "sha256:f96973d42caf0e4566882b6e7acbba753199d7acb4db486f14ab553c7b395cd5" ], - "markers": "python_version >= '3.6'", - "version": "==2.11.1" + "markers": "python_version >= '3.7'", + "version": "==2.12.0" }, "redis": { "extras": [ @@ -1537,7 +1510,7 @@ "sha256:f73970f8c4ccb2c32cf350f1b86171af27ed7df79dc0cc529875bc40610b6bbd", "sha256:fe5c2fcbe8f130c8913dad56d2513afb809491ad8a17b5c49b3951cfa070d4a3" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", "version": "==3.6.11" }, "requests": { @@ -1545,7 +1518,7 @@ "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", "version": "==2.28.1" }, "scikit-learn": { @@ -1794,7 +1767,7 @@ "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_full_version < '4.0.0'", "version": "==1.26.12" }, "uvicorn": { @@ -2054,11 +2027,11 @@ }, "zipp": { "hashes": [ - "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb", - "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980" + "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1", + "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8" ], "markers": "python_version < '3.9'", - "version": "==3.9.0" + "version": "==3.10.0" }, "zope.interface": { "hashes": [ @@ -2176,7 +2149,7 @@ "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==2.1.1" }, "click": { @@ -2642,7 +2615,7 @@ "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", "version": "==2.28.1" }, "setuptools": { @@ -2802,7 +2775,7 @@ "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_full_version < '4.0.0'", "version": "==1.26.12" }, "virtualenv": { From 6a00d5e08ab79bb27c0e13ac45a5a68d674dbdb0 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 25 Oct 2022 12:45:15 -0700 Subject: [PATCH 02/35] Implement relative date querying --- .../date-dropdown.component.html | 10 ++- .../date-dropdown.component.scss | 5 ++ .../date-dropdown/date-dropdown.component.ts | 88 +++++++++++++------ .../filter-editor.component.html | 8 +- .../filter-editor/filter-editor.component.ts | 80 ++++++++++++++++- 5 files changed, 160 insertions(+), 31 deletions(-) diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html index 6e5a7d928..0327ee963 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html @@ -1,10 +1,18 @@
diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index d5295f697..734242be1 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -57,6 +57,9 @@ const TEXT_FILTER_MODIFIER_NOTNULL = 'not null' const TEXT_FILTER_MODIFIER_GT = 'greater' const TEXT_FILTER_MODIFIER_LT = 'less' +const RELATIVE_DATE_QUERY_REGEXP_CREATED = /created:\[([^\]]+)\]/g +const RELATIVE_DATE_QUERY_REGEXP_ADDED = /added:\[([^\]]+)\]/g + @Component({ selector: 'app-filter-editor', templateUrl: './filter-editor.component.html', @@ -197,6 +200,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { dateCreatedAfter: string dateAddedBefore: string dateAddedAfter: string + dateCreatedQuery: string + dateAddedQuery: string _unmodifiedFilterRules: FilterRule[] = [] _filterRules: FilterRule[] = [] @@ -228,6 +233,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.dateAddedAfter = null this.dateCreatedBefore = null this.dateCreatedAfter = null + this.dateCreatedQuery = null + this.dateAddedQuery = null this.textFilterModifier = TEXT_FILTER_MODIFIER_EQUALS value.forEach((rule) => { @@ -245,7 +252,30 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.textFilterTarget = TEXT_FILTER_TARGET_ASN break case FILTER_FULLTEXT_QUERY: - this._textFilter = rule.value + let queryArgs = rule.value.split(',') + queryArgs.forEach((arg) => { + if (arg.match(RELATIVE_DATE_QUERY_REGEXP_CREATED)) { + ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_CREATED)].forEach( + (match) => { + if (match[1]?.length) { + this.dateCreatedQuery = match[1] + } + } + ) + queryArgs.splice(queryArgs.indexOf(arg), 1) + } + if (arg.match(RELATIVE_DATE_QUERY_REGEXP_ADDED)) { + ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_ADDED)].forEach( + (match) => { + if (match[1]?.length) { + this.dateAddedQuery = match[1] + } + } + ) + queryArgs.splice(queryArgs.indexOf(arg), 1) + } + }) + this._textFilter = queryArgs.join(',') this.textFilterTarget = TEXT_FILTER_TARGET_FULLTEXT_QUERY break case FILTER_FULLTEXT_MORELIKE: @@ -471,6 +501,52 @@ export class FilterEditorComponent implements OnInit, OnDestroy { value: this.dateAddedAfter, }) } + if (this.dateAddedQuery || this.dateCreatedQuery) { + let queryArgs: Array = [] + if (this.dateCreatedQuery) + queryArgs.push(`created:[${this.dateCreatedQuery}]`) + if (this.dateAddedQuery) queryArgs.push(`added:[${this.dateAddedQuery}]`) + const existingRule = filterRules.find( + (fr) => fr.rule_type == FILTER_FULLTEXT_QUERY + ) + if (existingRule) { + let existingRuleArgs = existingRule.value.split(',') + if (this.dateCreatedQuery) { + queryArgs = existingRuleArgs + .filter((arg) => !arg.includes('created:')) + .concat(queryArgs) + } + if (this.dateAddedQuery) { + queryArgs = existingRuleArgs + .filter((arg) => !arg.includes('added:')) + .concat(queryArgs) + } + existingRule.value = queryArgs.join(',') + } else { + filterRules.push({ + rule_type: FILTER_FULLTEXT_QUERY, + value: queryArgs.join(','), + }) + } + } + if (!this.dateAddedQuery && !this.dateCreatedQuery) { + const existingRule = filterRules.find( + (fr) => fr.rule_type == FILTER_FULLTEXT_QUERY + ) + if ( + existingRule?.value.includes('created:') || + existingRule?.value.includes('added:') + ) { + // remove any existing date query + existingRule.value = existingRule.value + .replace(RELATIVE_DATE_QUERY_REGEXP_CREATED, '') + .replace(RELATIVE_DATE_QUERY_REGEXP_ADDED, '') + if (existingRule.value.replace(',', '').trim() === '') { + // if its empty now, remove it entirely + filterRules.splice(filterRules.indexOf(existingRule), 1) + } + } + } return filterRules } @@ -584,6 +660,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { target != TEXT_FILTER_TARGET_FULLTEXT_MORELIKE ) { this._textFilter = '' + this.dateAddedQuery = '' + this.dateCreatedQuery = '' } this.textFilterTarget = target this.textFilterInput.nativeElement.focus() From b52cb193e16d604f36e39077c9bdca35be149dd1 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 25 Oct 2022 13:34:36 -0700 Subject: [PATCH 03/35] Remove relative date query strings from dropdown --- .../date-dropdown.component.html | 6 +- .../date-dropdown/date-dropdown.component.ts | 62 +++++------- .../filter-editor.component.html | 4 +- .../filter-editor/filter-editor.component.ts | 97 ++++++++++++++----- 4 files changed, 98 insertions(+), 71 deletions(-) diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html index 0327ee963..c99c71cda 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html @@ -7,13 +7,13 @@ diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index 734242be1..0c4cc37cb 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -44,6 +44,7 @@ import { DocumentService } from 'src/app/services/rest/document.service' import { PaperlessDocument } from 'src/app/data/paperless-document' import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path' import { StoragePathService } from 'src/app/services/rest/storage-path.service' +import { RelativeDate } from '../../common/date-dropdown/date-dropdown.component' const TEXT_FILTER_TARGET_TITLE = 'title' const TEXT_FILTER_TARGET_TITLE_CONTENT = 'title-content' @@ -59,6 +60,24 @@ const TEXT_FILTER_MODIFIER_LT = 'less' const RELATIVE_DATE_QUERY_REGEXP_CREATED = /created:\[([^\]]+)\]/g const RELATIVE_DATE_QUERY_REGEXP_ADDED = /added:\[([^\]]+)\]/g +const RELATIVE_DATE_QUERYSTRINGS = [ + { + relativeDate: RelativeDate.LAST_7_DAYS, + dateQuery: '-1 week to now', + }, + { + relativeDate: RelativeDate.LAST_MONTH, + dateQuery: '-1 month to now', + }, + { + relativeDate: RelativeDate.LAST_3_MONTHS, + dateQuery: '-3 month to now', + }, + { + relativeDate: RelativeDate.LAST_YEAR, + dateQuery: '-1 year to now', + }, +] @Component({ selector: 'app-filter-editor', @@ -200,8 +219,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { dateCreatedAfter: string dateAddedBefore: string dateAddedAfter: string - dateCreatedQuery: string - dateAddedQuery: string + dateCreatedRelativeDate: RelativeDate + dateAddedRelativeDate: RelativeDate _unmodifiedFilterRules: FilterRule[] = [] _filterRules: FilterRule[] = [] @@ -233,8 +252,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.dateAddedAfter = null this.dateCreatedBefore = null this.dateCreatedAfter = null - this.dateCreatedQuery = null - this.dateAddedQuery = null + this.dateCreatedRelativeDate = null + this.dateAddedRelativeDate = null this.textFilterModifier = TEXT_FILTER_MODIFIER_EQUALS value.forEach((rule) => { @@ -258,7 +277,10 @@ export class FilterEditorComponent implements OnInit, OnDestroy { ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_CREATED)].forEach( (match) => { if (match[1]?.length) { - this.dateCreatedQuery = match[1] + this.dateCreatedRelativeDate = + RELATIVE_DATE_QUERYSTRINGS.find( + (qS) => qS.dateQuery == match[1] + )?.relativeDate } } ) @@ -268,7 +290,10 @@ export class FilterEditorComponent implements OnInit, OnDestroy { ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_ADDED)].forEach( (match) => { if (match[1]?.length) { - this.dateAddedQuery = match[1] + this.dateAddedRelativeDate = + RELATIVE_DATE_QUERYSTRINGS.find( + (qS) => qS.dateQuery == match[1] + )?.relativeDate } } ) @@ -501,26 +526,45 @@ export class FilterEditorComponent implements OnInit, OnDestroy { value: this.dateAddedAfter, }) } - if (this.dateAddedQuery || this.dateCreatedQuery) { + if ( + this.dateAddedRelativeDate !== null || + this.dateCreatedRelativeDate !== null + ) { let queryArgs: Array = [] - if (this.dateCreatedQuery) - queryArgs.push(`created:[${this.dateCreatedQuery}]`) - if (this.dateAddedQuery) queryArgs.push(`added:[${this.dateAddedQuery}]`) const existingRule = filterRules.find( (fr) => fr.rule_type == FILTER_FULLTEXT_QUERY ) + let existingRuleArgs = existingRule?.value.split(',') + if (this.dateCreatedRelativeDate !== null) { + queryArgs.push( + `created:[${ + RELATIVE_DATE_QUERYSTRINGS.find( + (qS) => qS.relativeDate == this.dateCreatedRelativeDate + ).dateQuery + }]` + ) + if (existingRule) { + queryArgs = existingRuleArgs + .filter((arg) => !arg.match(RELATIVE_DATE_QUERY_REGEXP_CREATED)) + .concat(queryArgs) + } + } + if (this.dateAddedRelativeDate !== null) { + queryArgs.push( + `added:[${ + RELATIVE_DATE_QUERYSTRINGS.find( + (qS) => qS.relativeDate == this.dateAddedRelativeDate + ).dateQuery + }]` + ) + if (existingRule) { + queryArgs = existingRuleArgs + .filter((arg) => !arg.match(RELATIVE_DATE_QUERY_REGEXP_ADDED)) + .concat(queryArgs) + } + } + if (existingRule) { - let existingRuleArgs = existingRule.value.split(',') - if (this.dateCreatedQuery) { - queryArgs = existingRuleArgs - .filter((arg) => !arg.includes('created:')) - .concat(queryArgs) - } - if (this.dateAddedQuery) { - queryArgs = existingRuleArgs - .filter((arg) => !arg.includes('added:')) - .concat(queryArgs) - } existingRule.value = queryArgs.join(',') } else { filterRules.push({ @@ -529,13 +573,16 @@ export class FilterEditorComponent implements OnInit, OnDestroy { }) } } - if (!this.dateAddedQuery && !this.dateCreatedQuery) { + if ( + this.dateCreatedRelativeDate == null && + this.dateAddedRelativeDate == null + ) { const existingRule = filterRules.find( (fr) => fr.rule_type == FILTER_FULLTEXT_QUERY ) if ( - existingRule?.value.includes('created:') || - existingRule?.value.includes('added:') + existingRule?.value.match(RELATIVE_DATE_QUERY_REGEXP_CREATED) || + existingRule?.value.match(RELATIVE_DATE_QUERY_REGEXP_ADDED) ) { // remove any existing date query existingRule.value = existingRule.value @@ -660,8 +707,6 @@ export class FilterEditorComponent implements OnInit, OnDestroy { target != TEXT_FILTER_TARGET_FULLTEXT_MORELIKE ) { this._textFilter = '' - this.dateAddedQuery = '' - this.dateCreatedQuery = '' } this.textFilterTarget = target this.textFilterInput.nativeElement.focus() From 84b3fee0f98aeef4573930c0b1527cabb7927855 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 25 Oct 2022 13:43:13 -0700 Subject: [PATCH 04/35] Fix losing search when adding relative date --- .../document-list/filter-editor/filter-editor.component.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index 0c4cc37cb..e5163c7e0 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -300,8 +300,10 @@ export class FilterEditorComponent implements OnInit, OnDestroy { queryArgs.splice(queryArgs.indexOf(arg), 1) } }) - this._textFilter = queryArgs.join(',') - this.textFilterTarget = TEXT_FILTER_TARGET_FULLTEXT_QUERY + if (queryArgs.length) { + this._textFilter = queryArgs.join(',') + this.textFilterTarget = TEXT_FILTER_TARGET_FULLTEXT_QUERY + } break case FILTER_FULLTEXT_MORELIKE: this._moreLikeId = +rule.value From 8652b7ddb08e769a9b22f9ae5dbe2b27cb5c52a2 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:31:01 -0700 Subject: [PATCH 05/35] Fix switch from title_content search --- .../filter-editor/filter-editor.component.ts | 33 ++++++++++++++----- src-ui/src/styles.scss | 4 +++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index e5163c7e0..14643875f 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -271,8 +271,9 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.textFilterTarget = TEXT_FILTER_TARGET_ASN break case FILTER_FULLTEXT_QUERY: - let queryArgs = rule.value.split(',') - queryArgs.forEach((arg) => { + let allQueryArgs = rule.value.split(',') + let textQueryArgs = [] + allQueryArgs.forEach((arg) => { if (arg.match(RELATIVE_DATE_QUERY_REGEXP_CREATED)) { ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_CREATED)].forEach( (match) => { @@ -284,9 +285,7 @@ export class FilterEditorComponent implements OnInit, OnDestroy { } } ) - queryArgs.splice(queryArgs.indexOf(arg), 1) - } - if (arg.match(RELATIVE_DATE_QUERY_REGEXP_ADDED)) { + } else if (arg.match(RELATIVE_DATE_QUERY_REGEXP_ADDED)) { ;[...arg.matchAll(RELATIVE_DATE_QUERY_REGEXP_ADDED)].forEach( (match) => { if (match[1]?.length) { @@ -297,11 +296,12 @@ export class FilterEditorComponent implements OnInit, OnDestroy { } } ) - queryArgs.splice(queryArgs.indexOf(arg), 1) + } else { + textQueryArgs.push(arg) } }) - if (queryArgs.length) { - this._textFilter = queryArgs.join(',') + if (textQueryArgs.length) { + this._textFilter = textQueryArgs.join(',') this.textFilterTarget = TEXT_FILTER_TARGET_FULLTEXT_QUERY } break @@ -533,9 +533,24 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.dateCreatedRelativeDate !== null ) { let queryArgs: Array = [] - const existingRule = filterRules.find( + let existingRule = filterRules.find( (fr) => fr.rule_type == FILTER_FULLTEXT_QUERY ) + + // if had a title / content search and added a relative date we need to carry it over... + if ( + !existingRule && + this._textFilter?.length > 0 && + (this.textFilterTarget == TEXT_FILTER_TARGET_TITLE_CONTENT || + this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) + ) { + existingRule = filterRules.find( + (fr) => + fr.rule_type == FILTER_TITLE_CONTENT || fr.rule_type == FILTER_TITLE + ) + existingRule.rule_type = FILTER_FULLTEXT_QUERY + } + let existingRuleArgs = existingRule?.value.split(',') if (this.dateCreatedRelativeDate !== null) { queryArgs.push( diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss index f096e7a33..4efbf4937 100644 --- a/src-ui/src/styles.scss +++ b/src-ui/src/styles.scss @@ -372,6 +372,10 @@ textarea, &:hover, &:focus { background-color: var(--bs-body-bg); } + + &:focus { + color: var(--bs-body-color); + } } .dropdown-menu { From dc1da7cb2403635162cc8d937f90b3b6b7ec0f38 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 26 Oct 2022 10:39:09 -0700 Subject: [PATCH 06/35] Retain saved view filters when changing a saved view --- .../app/services/document-list-view.service.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 1dea011c0..5f0c7a237 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -171,15 +171,15 @@ export class DocumentListViewService { this.reduceSelectionToFilter() if (!this.router.routerState.snapshot.url.includes('/view/')) { - this.router.navigate([], { - queryParams: { view: view.id }, - }) + this.router.navigate(['view', view.id]) } } loadFromQueryParams(queryParams: ParamMap) { const paramsEmpty: boolean = queryParams.keys.length == 0 - let newState: ListViewState = this.listViewStates.get(null) + let newState: ListViewState = this.listViewStates.get( + this._activeSavedViewId + ) if (!paramsEmpty) newState = paramsToViewState(queryParams) if (newState == undefined) newState = this.defaultListViewState() // if nothing in local storage @@ -225,7 +225,10 @@ export class DocumentListViewService { let base = ['/documents'] this.router.navigate(base, { queryParams: paramsFromViewState(activeListViewState), - replaceUrl: !this.router.routerState.snapshot.url.includes('?'), // in case navigating from params-less /documents + replaceUrl: !( + this.router.routerState.snapshot.url.includes('?') || + this.router.routerState.snapshot.url.includes('/view/') + ), // in case navigating from params-less /documents or /view }) } else if (this._activeSavedViewId) { this.router.navigate([], { @@ -288,9 +291,9 @@ export class DocumentListViewService { } set sortField(field: string) { - this._activeSavedViewId = null this.activeListViewState.sortField = field this.reload() + this._activeSavedViewId = null this.saveDocumentListView() } @@ -299,9 +302,9 @@ export class DocumentListViewService { } set sortReverse(reverse: boolean) { - this._activeSavedViewId = null this.activeListViewState.sortReverse = reverse this.reload() + this._activeSavedViewId = null this.saveDocumentListView() } From 1b55717cc7129d279d343a91c27c9d9f3a40d01a Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 26 Oct 2022 12:48:22 -0700 Subject: [PATCH 07/35] Allow independent saved view control --- .../document-list.component.html | 2 +- .../document-list/document-list.component.ts | 35 ++++++++++++++++--- .../services/document-list-view.service.ts | 8 +---- src-ui/src/styles.scss | 4 +++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index ca725b175..5cec94919 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -67,7 +67,7 @@ - +
diff --git a/src-ui/src/app/components/document-list/document-list.component.ts b/src-ui/src/app/components/document-list/document-list.component.ts index a0c6899f8..3c1e6775f 100644 --- a/src-ui/src/app/components/document-list/document-list.component.ts +++ b/src-ui/src/app/components/document-list/document-list.component.ts @@ -9,7 +9,11 @@ import { import { ActivatedRoute, convertToParamMap, Router } from '@angular/router' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { filter, first, map, Subject, switchMap, takeUntil } from 'rxjs' -import { FilterRule, isFullTextFilterRule } from 'src/app/data/filter-rule' +import { + FilterRule, + filterRulesDiffer, + isFullTextFilterRule, +} from 'src/app/data/filter-rule' import { FILTER_FULLTEXT_MORELIKE } from 'src/app/data/filter-rule-type' import { PaperlessDocument } from 'src/app/data/paperless-document' import { PaperlessSavedView } from 'src/app/data/paperless-saved-view' @@ -54,15 +58,36 @@ export class DocumentListComponent implements OnInit, OnDestroy { displayMode = 'smallCards' // largeCards, smallCards, details unmodifiedFilterRules: FilterRule[] = [] + private unmodifiedSavedView: PaperlessSavedView private unsubscribeNotifier: Subject = new Subject() + get savedViewIsModified(): boolean { + if (!this.list.activeSavedViewId || !this.unmodifiedSavedView) return false + else { + return ( + this.unmodifiedSavedView.sort_field !== this.list.sortField || + this.unmodifiedSavedView.sort_reverse !== this.list.sortReverse || + filterRulesDiffer( + this.unmodifiedSavedView.filter_rules, + this.list.filterRules + ) + ) + } + } + get isFiltered() { return this.list.filterRules?.length > 0 } getTitle() { - return this.list.activeSavedViewTitle || $localize`Documents` + let title = this.list.activeSavedViewTitle + if (title && this.savedViewIsModified) { + title += '*' + } else if (!title) { + title = $localize`Documents` + } + return title } getSortFields() { @@ -122,7 +147,7 @@ export class DocumentListComponent implements OnInit, OnDestroy { this.router.navigate(['404']) return } - + this.unmodifiedSavedView = view this.list.activateSavedViewWithQueryParams( view, convertToParamMap(this.route.snapshot.queryParams) @@ -165,7 +190,8 @@ export class DocumentListComponent implements OnInit, OnDestroy { this.savedViewService .patch(savedView) .pipe(first()) - .subscribe((result) => { + .subscribe((view) => { + this.unmodifiedSavedView = view this.toastService.showInfo( $localize`View "${this.list.activeSavedViewTitle}" saved successfully.` ) @@ -179,6 +205,7 @@ export class DocumentListComponent implements OnInit, OnDestroy { .getCached(viewID) .pipe(first()) .subscribe((view) => { + this.unmodifiedSavedView = view this.list.activateSavedView(view) this.list.reload() }) diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 5f0c7a237..3eb036710 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -225,10 +225,7 @@ export class DocumentListViewService { let base = ['/documents'] this.router.navigate(base, { queryParams: paramsFromViewState(activeListViewState), - replaceUrl: !( - this.router.routerState.snapshot.url.includes('?') || - this.router.routerState.snapshot.url.includes('/view/') - ), // in case navigating from params-less /documents or /view + replaceUrl: !this.router.routerState.snapshot.url.includes('?'), // in case navigating from params-less /documents }) } else if (this._activeSavedViewId) { this.router.navigate([], { @@ -279,7 +276,6 @@ export class DocumentListViewService { ) { this.activeListViewState.sortField = 'created' } - this._activeSavedViewId = null this.activeListViewState.filterRules = filterRules this.reload() this.reduceSelectionToFilter() @@ -293,7 +289,6 @@ export class DocumentListViewService { set sortField(field: string) { this.activeListViewState.sortField = field this.reload() - this._activeSavedViewId = null this.saveDocumentListView() } @@ -304,7 +299,6 @@ export class DocumentListViewService { set sortReverse(reverse: boolean) { this.activeListViewState.sortReverse = reverse this.reload() - this._activeSavedViewId = null this.saveDocumentListView() } diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss index f096e7a33..27b495d8f 100644 --- a/src-ui/src/styles.scss +++ b/src-ui/src/styles.scss @@ -393,6 +393,10 @@ textarea, background-color: var(--bs-primary); color: var(--pngx-primary-text-contrast); } + + &.disabled, &:disabled { + opacity: 50%; + } } } From c414de9c35d4ec0b6d495a35432d0402067ca89c Mon Sep 17 00:00:00 2001 From: Sblop <17447438+Sblop@users.noreply.github.com> Date: Fri, 28 Oct 2022 15:41:23 +0200 Subject: [PATCH 08/35] Update settings.py Django gives a system error on MariaDB on VARCHARs longer than 255 chars. This was a limitation in older versions of mysql. Meaning: You cannot run Paperless-NGX on older version were this limitation were present, meaning Django plays it extremely safe by giving an error. This fixes this problem. --- src/paperless/settings.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 1fb6ba913..358535e87 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -347,6 +347,11 @@ if os.getenv("PAPERLESS_DBHOST"): if os.getenv("PAPERLESS_DBENGINE") == "mariadb": engine = "django.db.backends.mysql" options = {"read_default_file": "/etc/mysql/my.cnf", "charset": "utf8mb4"} + #Silence Django erros on old MariaDB versions where VARCHAR were limited to 255 chars. + #https://docs.djangoproject.com/en/4.1/ref/checks/#database + #https://mariadb.com/kb/en/innodb-system-variables/#innodb_large_prefix + SILENCED_SYSTEM_CHECKS = ["mysql.W003"] + else: # Default to PostgresDB engine = "django.db.backends.postgresql_psycopg2" options = {"sslmode": os.getenv("PAPERLESS_DBSSLMODE", "prefer")} From 932a285b82199d26b13ddb7a5e20569569aba8eb Mon Sep 17 00:00:00 2001 From: Sblop <17447438+Sblop@users.noreply.github.com> Date: Fri, 28 Oct 2022 22:38:37 +0200 Subject: [PATCH 09/35] Update settings.py --- src/paperless/settings.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 358535e87..0d0da6cd0 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -347,9 +347,10 @@ if os.getenv("PAPERLESS_DBHOST"): if os.getenv("PAPERLESS_DBENGINE") == "mariadb": engine = "django.db.backends.mysql" options = {"read_default_file": "/etc/mysql/my.cnf", "charset": "utf8mb4"} - #Silence Django erros on old MariaDB versions where VARCHAR were limited to 255 chars. - #https://docs.djangoproject.com/en/4.1/ref/checks/#database - #https://mariadb.com/kb/en/innodb-system-variables/#innodb_large_prefix + + # Silence Django erros on old MariaDB versions where VARCHAR were limited to 255 chars. + # https://docs.djangoproject.com/en/4.1/ref/checks/#database + # https://mariadb.com/kb/en/innodb-system-variables/#innodb_large_prefix SILENCED_SYSTEM_CHECKS = ["mysql.W003"] else: # Default to PostgresDB From cda0a19b992d030e609f1b94f2712c29ae762b89 Mon Sep 17 00:00:00 2001 From: Sblop <17447438+Sblop@users.noreply.github.com> Date: Fri, 28 Oct 2022 22:51:17 +0200 Subject: [PATCH 10/35] Update settings.py Comment too long. --- src/paperless/settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 0d0da6cd0..5547d6c33 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -348,7 +348,8 @@ if os.getenv("PAPERLESS_DBHOST"): engine = "django.db.backends.mysql" options = {"read_default_file": "/etc/mysql/my.cnf", "charset": "utf8mb4"} - # Silence Django erros on old MariaDB versions where VARCHAR were limited to 255 chars. + # Silence Django error on old MariaDB versions. + # VARCHAR can support > 255 in modern versions # https://docs.djangoproject.com/en/4.1/ref/checks/#database # https://mariadb.com/kb/en/innodb-system-variables/#innodb_large_prefix SILENCED_SYSTEM_CHECKS = ["mysql.W003"] From 89e0f8e3ef552b6da7d55b58964f5ad6abf5d908 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 28 Oct 2022 23:55:43 -0700 Subject: [PATCH 11/35] fix filterable dropdown corner radius --- src-ui/src/styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss index 4efbf4937..0b5ec4049 100644 --- a/src-ui/src/styles.scss +++ b/src-ui/src/styles.scss @@ -583,7 +583,7 @@ a.badge { border-radius: 0.15rem; } - > .btn:not(:first-child) { + > .btn:not(:first-child):not(:nth-child(2)) { border-top-left-radius: 0; border-bottom-left-radius: 0; } From a9abffaddcaf78bf79710148b19c0cd7bc3d6935 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 29 Oct 2022 00:56:48 -0700 Subject: [PATCH 12/35] Support keyboard esc and X button for filter editor text field --- .../filter-editor.component.html | 7 ++++++- .../filter-editor.component.scss | 4 ++++ .../filter-editor/filter-editor.component.ts | 20 +++++++++++++------ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html index a101d242a..99004854c 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html @@ -11,7 +11,12 @@ - + + diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.scss b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.scss index 0e8796b3d..82ad7e7a5 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.scss +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.scss @@ -21,3 +21,7 @@ input[type="text"] { min-width: 120px; } + +.z-10 { + z-index: 10; +} diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index 14643875f..44f524149 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -709,15 +709,23 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.updateRules() } - textFilterEnter() { - const filterString = ( - this.textFilterInput.nativeElement as HTMLInputElement - ).value - if (filterString.length) { - this.updateTextFilter(filterString) + textFilterKeyup(event: KeyboardEvent) { + if (event.key == 'Enter') { + const filterString = ( + this.textFilterInput.nativeElement as HTMLInputElement + ).value + if (filterString.length) { + this.updateTextFilter(filterString) + } + } else if (event.key == 'Escape') { + this.resetTextField() } } + resetTextField() { + this.updateTextFilter('') + } + changeTextFilterTarget(target) { if ( this.textFilterTarget == TEXT_FILTER_TARGET_FULLTEXT_MORELIKE && From bd64684fa465077313222204e8ead1370b1f5e33 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 29 Oct 2022 09:44:26 -0700 Subject: [PATCH 13/35] support esc and x button for main search bar --- .../components/app-frame/app-frame.component.html | 7 ++++++- .../components/app-frame/app-frame.component.scss | 15 ++++++++------- .../components/app-frame/app-frame.component.ts | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index 3700105f3..41bd50970 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -16,7 +16,12 @@ + [formControl]="searchField" [ngbTypeahead]="searchAutoComplete" (keyup)="searchFieldKeyup($event)" (selectItem)="itemSelected($event)" i18n-placeholder> +
    diff --git a/src-ui/src/app/components/app-frame/app-frame.component.scss b/src-ui/src/app/components/app-frame/app-frame.component.scss index 755f20696..0bd96f33e 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.scss +++ b/src-ui/src/app/components/app-frame/app-frame.component.scss @@ -243,17 +243,18 @@ main { form { position: relative; + + > svg { + position: absolute; + left: 0.6rem; + top: 0.5rem; + color: rgba(255, 255, 255, 0.6); + } } - svg { - position: absolute; - left: 0.6rem; - top: 0.5rem; - color: rgba(255, 255, 255, 0.6); - } &:focus-within { - svg { + form > svg { display: none; } diff --git a/src-ui/src/app/components/app-frame/app-frame.component.ts b/src-ui/src/app/components/app-frame/app-frame.component.ts index b189409a8..d637a32b6 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.ts @@ -93,6 +93,20 @@ export class AppFrameComponent implements OnInit, ComponentCanDeactivate { searchField = new FormControl('') + get searchFieldEmpty(): boolean { + return this.searchField.value.trim().length == 0 + } + + resetSearchField() { + this.searchField.reset('') + } + + searchFieldKeyup(event: KeyboardEvent) { + if (event.key == 'Escape') { + this.resetSearchField() + } + } + get openDocuments(): PaperlessDocument[] { return this.openDocumentsService.getOpenDocuments() } From 28f7b0dc13358dfcaef711a7b2128fcb7d3520be Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 29 Oct 2022 14:07:12 -0700 Subject: [PATCH 14/35] Use check badge for dropdowns --- .../common/date-dropdown/date-dropdown.component.html | 6 ++++-- .../filterable-dropdown/filterable-dropdown.component.html | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html index c99c71cda..dc8ae8688 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html @@ -1,8 +1,10 @@