From e0ee90e3af6b86d1f4e0b184ffc927c3257f24ba Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 1 Oct 2019 16:10:46 +0400 Subject: [PATCH 01/17] PHRAS-2761 #comment add status change to quarantine #time 8h --- templates/web/prod/upload/lazaret.html.twig | 33 ++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/templates/web/prod/upload/lazaret.html.twig b/templates/web/prod/upload/lazaret.html.twig index 29bad734c0..e68d4ee0f7 100644 --- a/templates/web/prod/upload/lazaret.html.twig +++ b/templates/web/prod/upload/lazaret.html.twig @@ -114,7 +114,7 @@ $('button.empty-lazaret', scope).bind('click', function(){ var that = $(this); - + if(!confirm("{{ "Empty quarantine will remove all items, are you sure you want to continue ?" | trans }}")) { return false; } @@ -344,6 +344,36 @@

{{ border_checker_from_fqcn(check.getCheckClassname()).getMessage(app['translator']) }}

{% endfor %} + +
+ {% set collection = file.getCollection(app) %} +
+
{{ 'upload:: Status :' | trans }} :
+ + + {% for bit, status in collection.get_databox().getStatusStructure() %} + + + + + {% endfor %} + +
+ {% if status['img_off'] is not empty %} + + {% endif %} + {{ status['labels_off_i18n'][app['locale']]|default('off') }} + + + + {{ status['labels_on_i18n'][app['locale']]|default('on') }} + {% if status['img_on'] is not empty %} + + {% endif %} +
+
+
+
{% endif %} + {% endmacro %} From ce67d5f62d2521cb7b3ac49f2112f8a21c46257f Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 8 Oct 2019 16:40:07 +0400 Subject: [PATCH 02/17] PHRAS-2785 #comment Port41 of PHRAS-2758 #time 1h --- .../SearchEngine/Elastic/Search/FacetsResponse.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php index 55503d50d6..42c5a63e25 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php @@ -46,22 +46,23 @@ class FacetsResponse if (!isset($bucket['key']) || !isset($bucket['doc_count'])) { $this->throwAggregationResponseError(); } + $key = array_key_exists('key_as_string', $bucket) ? $bucket['key_as_string'] : $bucket['key']; if($tf) { // the field is one of the hardcoded tech fields $value = [ - 'value' => $valueFormatter($bucket['key']), - 'raw_value' => $bucket['key'], + 'value' => $valueFormatter($key), + 'raw_value' => $key, 'count' => $bucket['doc_count'], - 'query' => sprintf($tf['query'], $this->escaper->escapeWord($bucket['key'])) + 'query' => sprintf($tf['query'], $this->escaper->escapeWord($key)) ]; } else { // the field is a normal field $value = [ - 'value' => $bucket['key'], - 'raw_value' => $bucket['key'], + 'value' => $key, + 'raw_value' => $key, 'count' => $bucket['doc_count'], - 'query' => sprintf('field.%s:%s', $this->escaper->escapeWord($name), $this->escaper->escapeWord($bucket['key'])) + 'query' => sprintf('field.%s:%s', $this->escaper->escapeWord($name), $this->escaper->escapeWord($key)) ]; } From a4631cb4346f00f017615535b16f774cc589c9d4 Mon Sep 17 00:00:00 2001 From: Jean-Yves Gaulier Date: Tue, 8 Oct 2019 15:30:19 +0200 Subject: [PATCH 03/17] PHRAS-2751_geoloc-search-403err_master fix : geoloc search should work again (missed method during PHRAS-2707) --- .../SearchEngine/Elastic/AST/KeyValue/GeolocationKey.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/AST/KeyValue/GeolocationKey.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/AST/KeyValue/GeolocationKey.php index 9d8942e8f7..4ab7998d2b 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/AST/KeyValue/GeolocationKey.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/AST/KeyValue/GeolocationKey.php @@ -58,6 +58,11 @@ class GeolocationKey implements Key $this->key = $key; } + public function getFieldType(QueryContext $context) + { + return $this->type; + } + public function getIndexField(QueryContext $context, $raw = false) { return $this->key; From f6faaee857e963af0e898db46db03c2a3dc1dfa3 Mon Sep 17 00:00:00 2001 From: Xavier Rousset Date: Wed, 9 Oct 2019 17:03:58 +0200 Subject: [PATCH 04/17] PHRAS-2791 | 4.1 | Serve a permalink instead of direct url in case of specific subdef is selected --- composer.lock | 403 ++++++++++++++++++++------------------------------ 1 file changed, 162 insertions(+), 241 deletions(-) diff --git a/composer.lock b/composer.lock index eb4523a2a5..482cce9daf 100644 --- a/composer.lock +++ b/composer.lock @@ -1,9 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], + "hash": "e5bed7b0b8cb8b45ffffc4965a7689db", "content-hash": "f3b1fc0a30bf14b05e57ce673550d9c0", "packages": [ { @@ -70,7 +71,7 @@ "source": "https://github.com/alchemy-fr/tcpdf-clone/tree/6.0.039", "issues": "https://github.com/alchemy-fr/tcpdf-clone/issues" }, - "time": "2013-10-13T16:11:17+00:00" + "time": "2013-10-13 16:11:17" }, { "name": "alchemy/binary-driver", @@ -127,21 +128,15 @@ "binary", "driver" ], - "time": "2016-03-02T13:49:15+00:00" + "time": "2016-03-02 13:49:15" }, { "name": "alchemy/embed-bundle", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/alchemy-fr/embed-bundle.git", - "reference": "c585ccf18e53a9a6f2b696ddbbc39521732dfdde" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/alchemy-fr/embed-bundle/zipball/c585ccf18e53a9a6f2b696ddbbc39521732dfdde", - "reference": "c585ccf18e53a9a6f2b696ddbbc39521732dfdde", - "shasum": "" + "reference": "cbaa5e34b7b6ccbe128f8c804649c8a3ecd1e621" }, "require-dev": { "phpunit/phpunit": "^4.7", @@ -177,11 +172,7 @@ } ], "description": "Embed resources bundle", - "support": { - "source": "https://github.com/alchemy-fr/embed-bundle/tree/2.0.7", - "issues": "https://github.com/alchemy-fr/embed-bundle/issues" - }, - "time": "2019-09-02T12:28:19+00:00" + "time": "2019-10-09 14:34:23" }, { "name": "alchemy/geonames-api-consumer", @@ -219,7 +210,7 @@ "keywords": [ "geonames" ], - "time": "2014-02-05T15:29:39+00:00" + "time": "2014-02-05 15:29:39" }, { "name": "alchemy/ghostscript", @@ -271,7 +262,7 @@ "ghostscript", "pdf" ], - "time": "2013-06-25T09:12:58+00:00" + "time": "2013-06-25 09:12:58" }, { "name": "alchemy/mediavorus", @@ -333,7 +324,7 @@ "keywords": [ "metadata" ], - "time": "2019-01-22T11:23:34+00:00" + "time": "2019-01-22 11:23:34" }, { "name": "alchemy/oauth2php", @@ -356,7 +347,7 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "time": "2019-01-17T14:34:10+00:00" + "time": "2019-01-17 14:34:10" }, { "name": "alchemy/phlickr", @@ -379,7 +370,7 @@ } }, "notification-url": "https://packagist.org/downloads/", - "time": "2014-12-15T14:27:57+00:00" + "time": "2014-12-15 14:27:57" }, { "name": "alchemy/phpexiftool", @@ -452,7 +443,7 @@ "exiftool", "metadata" ], - "time": "2019-02-13T13:06:43+00:00" + "time": "2019-02-13 13:06:43" }, { "name": "alchemy/queue-bundle", @@ -500,7 +491,7 @@ } ], "description": "Symfony bundle for alchemy/queue-component", - "time": "2016-10-04T14:19:39+00:00" + "time": "2016-10-04 14:19:39" }, { "name": "alchemy/queue-component", @@ -545,7 +536,7 @@ "MIT" ], "description": "Message queue component", - "time": "2016-10-05T10:41:36+00:00" + "time": "2016-10-05 10:41:36" }, { "name": "alchemy/rest-bundle", @@ -597,7 +588,7 @@ } ], "description": "Simple REST utility bundle", - "time": "2016-05-16T09:37:34+00:00" + "time": "2016-05-16 09:37:34" }, { "name": "alchemy/symfony-cors", @@ -644,7 +635,7 @@ } ], "description": "A library that adds CORS services to Silex/Symfony Applications", - "time": "2015-12-17T15:34:43+00:00" + "time": "2015-12-17 15:34:43" }, { "name": "alchemy/task-manager", @@ -707,7 +698,7 @@ "parallel", "process" ], - "time": "2016-11-30T13:34:30+00:00" + "time": "2016-11-30 13:34:30" }, { "name": "alchemy/worker-bundle", @@ -756,7 +747,7 @@ } ], "description": "Symfony bundle for alchemy/worker-component", - "time": "2016-12-06T10:39:58+00:00" + "time": "2016-12-06 10:39:58" }, { "name": "alchemy/worker-component", @@ -802,7 +793,7 @@ "MIT" ], "description": "Message queue worker component", - "time": "2016-11-14T16:41:16+00:00" + "time": "2016-11-14 16:41:16" }, { "name": "alchemy/zippy", @@ -864,7 +855,7 @@ "tar", "zip" ], - "time": "2016-02-15T22:46:40+00:00" + "time": "2016-02-15 22:46:40" }, { "name": "aws/aws-sdk-php", @@ -927,7 +918,7 @@ "s3", "sdk" ], - "time": "2016-07-25T18:03:20+00:00" + "time": "2016-07-25 18:03:20" }, { "name": "beberlei/assert", @@ -982,7 +973,7 @@ "assertion", "validation" ], - "time": "2017-01-24T15:14:39+00:00" + "time": "2017-01-24 15:14:39" }, { "name": "behat/transliterator", @@ -1022,7 +1013,7 @@ "slug", "transliterator" ], - "time": "2015-09-28T16:26:35+00:00" + "time": "2015-09-28 16:26:35" }, { "name": "box/spout", @@ -1090,7 +1081,7 @@ "write", "xlsx" ], - "time": "2017-09-25T19:44:35+00:00" + "time": "2017-09-25 19:44:35" }, { "name": "cocur/slugify", @@ -1154,7 +1145,7 @@ "slug", "slugify" ], - "time": "2016-08-09T20:10:17+00:00" + "time": "2016-08-09 20:10:17" }, { "name": "czproject/git-php", @@ -1196,7 +1187,7 @@ "keywords": [ "git" ], - "time": "2019-02-09T13:11:36+00:00" + "time": "2019-02-09 13:11:36" }, { "name": "dailymotion/sdk", @@ -1229,7 +1220,7 @@ "dailymotion", "sdk" ], - "time": "2015-11-20T11:18:32+00:00" + "time": "2015-11-20 11:18:32" }, { "name": "data-uri/data-uri", @@ -1274,7 +1265,7 @@ "data-uri", "uri" ], - "time": "2014-08-22T15:01:57+00:00" + "time": "2014-08-22 15:01:57" }, { "name": "dflydev/doctrine-orm-service-provider", @@ -1336,7 +1327,7 @@ "pimple", "silex" ], - "time": "2015-09-07T12:16:54+00:00" + "time": "2015-09-07 12:16:54" }, { "name": "doctrine/annotations", @@ -1404,7 +1395,7 @@ "docblock", "parser" ], - "time": "2015-08-31T12:32:49+00:00" + "time": "2015-08-31 12:32:49" }, { "name": "doctrine/cache", @@ -1416,7 +1407,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b", "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", "shasum": "" }, @@ -1474,7 +1465,7 @@ "cache", "caching" ], - "time": "2016-10-29T11:16:17+00:00" + "time": "2016-10-29 11:16:17" }, { "name": "doctrine/collections", @@ -1540,7 +1531,7 @@ "collections", "iterator" ], - "time": "2015-04-14T22:21:58+00:00" + "time": "2015-04-14 22:21:58" }, { "name": "doctrine/common", @@ -1613,7 +1604,7 @@ "persistence", "spl" ], - "time": "2016-11-30T16:50:46+00:00" + "time": "2016-11-30 16:50:46" }, { "name": "doctrine/dbal", @@ -1684,7 +1675,7 @@ "persistence", "queryobject" ], - "time": "2017-01-23T23:17:10+00:00" + "time": "2017-01-23 23:17:10" }, { "name": "doctrine/inflector", @@ -1751,7 +1742,7 @@ "singularize", "string" ], - "time": "2015-11-06T14:35:42+00:00" + "time": "2015-11-06 14:35:42" }, { "name": "doctrine/instantiator", @@ -1805,7 +1796,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2015-06-14 21:17:01" }, { "name": "doctrine/lexer", @@ -1859,7 +1850,7 @@ "lexer", "parser" ], - "time": "2014-09-09T13:34:57+00:00" + "time": "2014-09-09 13:34:57" }, { "name": "doctrine/migrations", @@ -1933,7 +1924,7 @@ "database", "migrations" ], - "time": "2016-12-25T22:54:00+00:00" + "time": "2016-12-25 22:54:00" }, { "name": "doctrine/orm", @@ -2009,7 +2000,7 @@ "database", "orm" ], - "time": "2016-12-18T15:42:34+00:00" + "time": "2016-12-18 15:42:34" }, { "name": "elasticsearch/elasticsearch", @@ -2063,7 +2054,7 @@ "elasticsearch", "search" ], - "time": "2016-11-30T17:15:05+00:00" + "time": "2016-11-30 17:15:05" }, { "name": "evenement/evenement", @@ -2103,7 +2094,7 @@ "keywords": [ "event-dispatcher" ], - "time": "2012-05-30T15:01:08+00:00" + "time": "2012-05-30 15:01:08" }, { "name": "facebook/graph-sdk", @@ -2161,7 +2152,7 @@ "facebook", "sdk" ], - "time": "2017-08-16T17:28:07+00:00" + "time": "2017-08-16 17:28:07" }, { "name": "firebase/php-jwt", @@ -2204,7 +2195,7 @@ ], "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", - "time": "2015-07-22T18:31:08+00:00" + "time": "2015-07-22 18:31:08" }, { "name": "gedmo/doctrine-extensions", @@ -2282,7 +2273,7 @@ "tree", "uploadable" ], - "time": "2015-02-24T21:41:37+00:00" + "time": "2015-02-24 21:41:37" }, { "name": "goodby/csv", @@ -2339,7 +2330,7 @@ "export", "import" ], - "time": "2015-06-29T10:28:19+00:00" + "time": "2015-06-29 10:28:19" }, { "name": "google/apiclient", @@ -2398,7 +2389,7 @@ "keywords": [ "google" ], - "time": "2017-11-03T01:19:53+00:00" + "time": "2017-11-03 01:19:53" }, { "name": "google/apiclient-services", @@ -2435,7 +2426,7 @@ "keywords": [ "google" ], - "time": "2017-11-25T00:23:12+00:00" + "time": "2017-11-25 00:23:12" }, { "name": "google/auth", @@ -2480,7 +2471,7 @@ "google", "oauth2" ], - "time": "2017-10-10T17:01:45+00:00" + "time": "2017-10-10 17:01:45" }, { "name": "google/recaptcha", @@ -2525,7 +2516,7 @@ "recaptcha", "spam" ], - "time": "2017-03-09T18:44:34+00:00" + "time": "2017-03-09 18:44:34" }, { "name": "guzzle/guzzle", @@ -2621,7 +2612,7 @@ "web service" ], "abandoned": "guzzlehttp/guzzle", - "time": "2015-03-18T18:23:50+00:00" + "time": "2015-03-18 18:23:50" }, { "name": "guzzlehttp/guzzle", @@ -2686,7 +2677,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2017-06-22 18:50:49" }, { "name": "guzzlehttp/promises", @@ -2737,7 +2728,7 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "time": "2016-12-20 10:07:11" }, { "name": "guzzlehttp/psr7", @@ -2802,7 +2793,7 @@ "uri", "url" ], - "time": "2017-03-20T17:10:46+00:00" + "time": "2017-03-20 17:10:46" }, { "name": "guzzlehttp/ringphp", @@ -2853,7 +2844,7 @@ } ], "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", - "time": "2015-05-20T03:37:09+00:00" + "time": "2015-05-20 03:37:09" }, { "name": "guzzlehttp/streams", @@ -2903,7 +2894,7 @@ "Guzzle", "stream" ], - "time": "2014-10-12T19:18:40+00:00" + "time": "2014-10-12 19:18:40" }, { "name": "hoa/compiler", @@ -2983,7 +2974,7 @@ "trace", "uniform" ], - "time": "2015-10-29T21:35:12+00:00" + "time": "2015-10-29 21:35:12" }, { "name": "hoa/console", @@ -3055,7 +3046,7 @@ "tput", "window" ], - "time": "2015-07-27T07:52:10+00:00" + "time": "2015-07-27 07:52:10" }, { "name": "hoa/core", @@ -3123,7 +3114,7 @@ "protocol" ], "abandoned": "hoa/consistency", - "time": "2015-11-09T06:51:06+00:00" + "time": "2015-11-09 06:51:06" }, { "name": "hoa/dispatcher", @@ -3183,7 +3174,7 @@ "kit", "library" ], - "time": "2015-11-09T06:52:08+00:00" + "time": "2015-11-09 06:52:08" }, { "name": "hoa/file", @@ -3243,7 +3234,7 @@ "link", "temporary" ], - "time": "2015-11-09T06:55:20+00:00" + "time": "2015-11-09 06:55:20" }, { "name": "hoa/iterator", @@ -3296,7 +3287,7 @@ "iterator", "library" ], - "time": "2015-10-29T21:37:16+00:00" + "time": "2015-10-29 21:37:16" }, { "name": "hoa/math", @@ -3358,7 +3349,7 @@ "sampler", "set" ], - "time": "2015-10-26T15:22:52+00:00" + "time": "2015-10-26 15:22:52" }, { "name": "hoa/regex", @@ -3412,7 +3403,7 @@ "library", "regex" ], - "time": "2015-08-13T06:48:47+00:00" + "time": "2015-08-13 06:48:47" }, { "name": "hoa/router", @@ -3464,7 +3455,7 @@ "library", "router" ], - "time": "2015-10-21T14:12:51+00:00" + "time": "2015-10-21 14:12:51" }, { "name": "hoa/stream", @@ -3522,7 +3513,7 @@ "stream", "wrapper" ], - "time": "2015-10-26T12:21:43+00:00" + "time": "2015-10-26 12:21:43" }, { "name": "hoa/ustring", @@ -3581,7 +3572,7 @@ "string", "unicode" ], - "time": "2015-11-09T06:44:33+00:00" + "time": "2015-11-09 06:44:33" }, { "name": "hoa/visitor", @@ -3636,7 +3627,7 @@ "visit", "visitor" ], - "time": "2015-08-17T06:30:58+00:00" + "time": "2015-08-17 06:30:58" }, { "name": "igorw/get-in", @@ -3681,7 +3672,7 @@ "assoc-array", "hash-map" ], - "time": "2014-12-15T23:03:51+00:00" + "time": "2014-12-15 23:03:51" }, { "name": "imagine/imagine", @@ -3740,7 +3731,7 @@ "support": { "source": "https://github.com/alchemy-fr/Imagine/tree/alchemy-0.6.2" }, - "time": "2015-01-13T18:12:26+00:00" + "time": "2015-01-13 18:12:26" }, { "name": "ircmaxell/password-compat", @@ -3782,7 +3773,7 @@ "hashing", "password" ], - "time": "2014-11-20T16:49:30+00:00" + "time": "2014-11-20 16:49:30" }, { "name": "ircmaxell/security-lib", @@ -3828,7 +3819,7 @@ ], "description": "A Base Security Library", "homepage": "https://github.com/ircmaxell/SecurityLib", - "time": "2015-03-20T14:31:23+00:00" + "time": "2015-03-20 14:31:23" }, { "name": "jms/metadata", @@ -3879,7 +3870,7 @@ "xml", "yaml" ], - "time": "2016-12-05T10:18:33+00:00" + "time": "2016-12-05 10:18:33" }, { "name": "jms/parser-lib", @@ -3914,7 +3905,7 @@ "Apache2" ], "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-18T18:08:43+00:00" + "time": "2012-11-18 18:08:43" }, { "name": "jms/serializer", @@ -3984,7 +3975,7 @@ "serialization", "xml" ], - "time": "2014-03-18T08:39:00+00:00" + "time": "2014-03-18 08:39:00" }, { "name": "jms/translation-bundle", @@ -4060,7 +4051,7 @@ "support": { "source": "https://github.com/alchemy-fr/JMSTranslationBundle/tree/rebase-2015-10-20" }, - "time": "2015-11-04T15:09:44+00:00" + "time": "2015-11-04 15:09:44" }, { "name": "justinrainbow/json-schema", @@ -4126,7 +4117,7 @@ "json", "schema" ], - "time": "2016-05-10T20:38:51+00:00" + "time": "2016-05-10 20:38:51" }, { "name": "league/flysystem", @@ -4209,7 +4200,7 @@ "sftp", "storage" ], - "time": "2017-01-30T17:41:17+00:00" + "time": "2017-01-30 17:41:17" }, { "name": "league/flysystem-aws-s3-v2", @@ -4256,7 +4247,7 @@ } ], "description": "Flysystem adapter for AWS S3 SDK v2", - "time": "2015-10-15T15:55:48+00:00" + "time": "2015-10-15 15:55:48" }, { "name": "league/fractal", @@ -4317,7 +4308,7 @@ "league", "rest" ], - "time": "2016-12-02T14:55:48+00:00" + "time": "2016-12-02 14:55:48" }, { "name": "media-alchemyst/media-alchemyst", @@ -4391,7 +4382,7 @@ "video", "video processing" ], - "time": "2019-01-25T12:09:11+00:00" + "time": "2019-01-25 12:09:11" }, { "name": "monolog/monolog", @@ -4469,7 +4460,7 @@ "logging", "psr-3" ], - "time": "2016-11-26T00:15:39+00:00" + "time": "2016-11-26 00:15:39" }, { "name": "mrclay/minify", @@ -4509,7 +4500,7 @@ ], "description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers", "homepage": "http://code.google.com/p/minify/", - "time": "2013-07-23T19:58:28+00:00" + "time": "2013-07-23 19:58:28" }, { "name": "neutron/process-manager", @@ -4548,7 +4539,7 @@ "homepage": "http://www.lickmychip.com/" } ], - "time": "2014-02-13T20:27:33+00:00" + "time": "2014-02-13 20:27:33" }, { "name": "neutron/recaptcha", @@ -4592,7 +4583,7 @@ } ], "description": "ReCaptcha Client", - "time": "2013-02-14T13:42:00+00:00" + "time": "2013-02-14 13:42:00" }, { "name": "neutron/signal-handler", @@ -4635,7 +4626,7 @@ "keywords": [ "signal" ], - "time": "2014-01-15T17:24:13+00:00" + "time": "2014-01-15 17:24:13" }, { "name": "neutron/silex-filesystem-provider", @@ -4679,7 +4670,7 @@ "silex", "temporary-filesystem" ], - "time": "2012-11-08T21:07:08+00:00" + "time": "2012-11-08 21:07:08" }, { "name": "neutron/silex-imagine-provider", @@ -4726,7 +4717,7 @@ "imagine", "silex" ], - "time": "2013-05-03T18:48:51+00:00" + "time": "2013-05-03 18:48:51" }, { "name": "neutron/temporary-filesystem", @@ -4766,7 +4757,7 @@ } ], "description": "Symfony filesystem extension to handle temporary files", - "time": "2016-03-05T10:22:50+00:00" + "time": "2016-03-05 10:22:50" }, { "name": "nikic/php-parser", @@ -4811,7 +4802,7 @@ "parser", "php" ], - "time": "2015-09-19T14:15:08+00:00" + "time": "2015-09-19 14:15:08" }, { "name": "ocramius/proxy-manager", @@ -4874,7 +4865,7 @@ "proxy pattern", "service proxies" ], - "time": "2015-08-09T04:28:19+00:00" + "time": "2015-08-09 04:28:19" }, { "name": "pagerfanta/pagerfanta", @@ -4941,7 +4932,7 @@ "paginator", "paging" ], - "time": "2016-11-28T09:17:04+00:00" + "time": "2016-11-28 09:17:04" }, { "name": "paragonie/random-lib", @@ -5003,7 +4994,7 @@ "random-numbers", "random-strings" ], - "time": "2017-10-06T23:34:21+00:00" + "time": "2017-10-06 23:34:21" }, { "name": "paragonie/random_compat", @@ -5051,7 +5042,7 @@ "pseudorandom", "random" ], - "time": "2016-11-07T23:38:38+00:00" + "time": "2016-11-07 23:38:38" }, { "name": "paragonie/sodium_compat", @@ -5133,7 +5124,7 @@ "secret-key cryptography", "side-channel resistant" ], - "time": "2019-03-20T17:19:05+00:00" + "time": "2019-03-20 17:19:05" }, { "name": "php-ffmpeg/php-ffmpeg", @@ -5202,7 +5193,7 @@ "video", "video processing" ], - "time": "2014-08-26T08:46:56+00:00" + "time": "2014-08-26 08:46:56" }, { "name": "php-mp4box/php-mp4box", @@ -5253,7 +5244,7 @@ "gpac", "mp4box" ], - "time": "2013-06-25T10:13:06+00:00" + "time": "2013-06-25 10:13:06" }, { "name": "php-unoconv/php-unoconv", @@ -5303,7 +5294,7 @@ "keywords": [ "unoconv" ], - "time": "2013-06-25T10:09:59+00:00" + "time": "2013-06-25 10:09:59" }, { "name": "php-xpdf/php-xpdf", @@ -5355,7 +5346,7 @@ "pdf", "xpdf" ], - "time": "2016-07-04T07:30:16+00:00" + "time": "2016-07-04 07:30:16" }, { "name": "phpcollection/phpcollection", @@ -5403,7 +5394,7 @@ "sequence", "set" ], - "time": "2015-05-17T12:39:23+00:00" + "time": "2015-05-17 12:39:23" }, { "name": "phpexiftool/exiftool", @@ -5436,7 +5427,7 @@ "exiftool", "metadatas" ], - "time": "2016-01-25T11:10:14+00:00" + "time": "2016-01-25 11:10:14" }, { "name": "phpoption/phpoption", @@ -5486,7 +5477,7 @@ "php", "type" ], - "time": "2015-07-25T16:39:46+00:00" + "time": "2015-07-25 16:39:46" }, { "name": "phpseclib/phpseclib", @@ -5578,7 +5569,7 @@ "x.509", "x509" ], - "time": "2017-10-23T05:04:54+00:00" + "time": "2017-10-23 05:04:54" }, { "name": "pimple/pimple", @@ -5624,7 +5615,7 @@ "container", "dependency injection" ], - "time": "2013-11-22T08:30:29+00:00" + "time": "2013-11-22 08:30:29" }, { "name": "psr/cache", @@ -5670,7 +5661,7 @@ "psr", "psr-6" ], - "time": "2016-08-06T20:24:11+00:00" + "time": "2016-08-06 20:24:11" }, { "name": "psr/http-message", @@ -5720,7 +5711,7 @@ "request", "response" ], - "time": "2016-08-06T14:39:51+00:00" + "time": "2016-08-06 14:39:51" }, { "name": "psr/log", @@ -5767,7 +5758,7 @@ "psr", "psr-3" ], - "time": "2016-10-10T12:19:37+00:00" + "time": "2016-10-10 12:19:37" }, { "name": "ramsey/uuid", @@ -5849,7 +5840,7 @@ "identifier", "uuid" ], - "time": "2016-11-22T19:21:44+00:00" + "time": "2016-11-22 19:21:44" }, { "name": "react/promise", @@ -5892,7 +5883,7 @@ "promise", "promises" ], - "time": "2016-12-22T14:09:01+00:00" + "time": "2016-12-22 14:09:01" }, { "name": "roave/security-advisories", @@ -6017,7 +6008,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2017-01-24T18:32:04+00:00" + "time": "2017-01-24 18:32:04" }, { "name": "seld/jsonlint", @@ -6063,7 +6054,7 @@ "parser", "validator" ], - "time": "2016-11-14T17:59:58+00:00" + "time": "2016-11-14 17:59:58" }, { "name": "silex/silex", @@ -6141,7 +6132,7 @@ "microframework" ], "abandoned": "symfony/flex", - "time": "2016-01-06T14:59:35+00:00" + "time": "2016-01-06 14:59:35" }, { "name": "silex/web-profiler", @@ -6187,7 +6178,7 @@ "description": "A WebProfiler for Silex", "homepage": "http://silex.sensiolabs.org/", "abandoned": true, - "time": "2016-01-10T11:39:13+00:00" + "time": "2016-01-10 11:39:13" }, { "name": "simple-bus/doctrine-orm-bridge", @@ -6241,7 +6232,7 @@ "doctrine", "event bus" ], - "time": "2015-04-29T12:27:27+00:00" + "time": "2015-04-29 12:27:27" }, { "name": "simple-bus/jms-serializer-bridge", @@ -6290,7 +6281,7 @@ "message", "serialization" ], - "time": "2015-07-29T07:48:42+00:00" + "time": "2015-07-29 07:48:42" }, { "name": "simple-bus/message-bus", @@ -6340,7 +6331,7 @@ "message", "message bus" ], - "time": "2016-02-12T08:35:53+00:00" + "time": "2016-02-12 08:35:53" }, { "name": "simple-bus/serialization", @@ -6388,7 +6379,7 @@ "messages", "serialization" ], - "time": "2015-05-08T13:34:17+00:00" + "time": "2015-05-08 13:34:17" }, { "name": "sorien/silex-dbal-profiler", @@ -6436,7 +6427,7 @@ "profiler", "silex" ], - "time": "2016-10-26T11:08:02+00:00" + "time": "2016-10-26 11:08:02" }, { "name": "sorien/silex-pimple-dumper", @@ -6478,7 +6469,7 @@ "plugin", "silex" ], - "time": "2015-11-11T07:16:28+00:00" + "time": "2015-11-11 07:16:28" }, { "name": "swftools/swftools", @@ -6532,7 +6523,7 @@ "flash", "swf" ], - "time": "2013-07-03T13:11:36+00:00" + "time": "2013-07-03 13:11:36" }, { "name": "swiftmailer/swiftmailer", @@ -6586,7 +6577,7 @@ "mail", "mailer" ], - "time": "2016-12-29T10:02:40+00:00" + "time": "2016-12-29 10:02:40" }, { "name": "symfony/polyfill-apcu", @@ -6639,7 +6630,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-intl-icu", @@ -6697,7 +6688,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-mbstring", @@ -6756,7 +6747,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-php54", @@ -6814,7 +6805,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-php55", @@ -6870,7 +6861,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-php56", @@ -6926,7 +6917,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-php70", @@ -6985,7 +6976,7 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/polyfill-util", @@ -7037,7 +7028,7 @@ "polyfill", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2016-11-14 01:06:16" }, { "name": "symfony/security-acl", @@ -7098,7 +7089,7 @@ ], "description": "Symfony Security Component - ACL (Access Control List)", "homepage": "https://symfony.com", - "time": "2015-12-28T09:39:46+00:00" + "time": "2015-12-28 09:39:46" }, { "name": "symfony/symfony", @@ -7233,7 +7224,7 @@ "keywords": [ "framework" ], - "time": "2017-01-12T20:27:46+00:00" + "time": "2017-01-12 20:27:46" }, { "name": "themattharris/tmhoauth", @@ -7275,7 +7266,7 @@ "oauth", "twitter" ], - "time": "2014-08-06T22:29:35+00:00" + "time": "2014-08-06 22:29:35" }, { "name": "twig/extensions", @@ -7327,7 +7318,7 @@ "i18n", "text" ], - "time": "2016-10-25T17:34:14+00:00" + "time": "2016-10-25 17:34:14" }, { "name": "twig/twig", @@ -7388,7 +7379,7 @@ "keywords": [ "templating" ], - "time": "2017-01-11T19:36:15+00:00" + "time": "2017-01-11 19:36:15" }, { "name": "vierbergenlars/php-semver", @@ -7436,7 +7427,7 @@ "semver", "versioning" ], - "time": "2013-09-20T10:41:27+00:00" + "time": "2013-09-20 10:41:27" }, { "name": "webmozart/assert", @@ -7486,7 +7477,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2016-11-23 20:04:58" }, { "name": "webmozart/json", @@ -7535,7 +7526,7 @@ } ], "description": "A robust JSON decoder/encoder with support for schema validation.", - "time": "2016-01-14T12:11:46+00:00" + "time": "2016-01-14 12:11:46" }, { "name": "webmozart/path-util", @@ -7581,7 +7572,7 @@ } ], "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "time": "2015-12-17T08:42:14+00:00" + "time": "2015-12-17 08:42:14" }, { "name": "willdurand/negotiation", @@ -7633,7 +7624,7 @@ "header", "negotiation" ], - "time": "2016-10-14T09:17:47+00:00" + "time": "2016-10-14 09:17:47" }, { "name": "zend/gdata", @@ -7674,7 +7665,7 @@ "gdata", "zend" ], - "time": "2013-01-30T15:31:21+00:00" + "time": "2013-01-30 15:31:21" }, { "name": "zendframework/zend-code", @@ -7726,7 +7717,7 @@ "code", "zf2" ], - "time": "2016-04-20T17:26:42+00:00" + "time": "2016-04-20 17:26:42" }, { "name": "zendframework/zend-eventmanager", @@ -7780,7 +7771,7 @@ "events", "zf2" ], - "time": "2016-02-18T20:53:00+00:00" + "time": "2016-02-18 20:53:00" } ], "packages-dev": [ @@ -7828,77 +7819,7 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2016-07-18T14:02:57+00:00" - }, - { - "name": "php-amqplib/php-amqplib", - "version": "v2.6.3", - "source": { - "type": "git", - "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "fa2f0d4410a11008cb36b379177291be7ee9e4f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/fa2f0d4410a11008cb36b379177291be7ee9e4f6", - "reference": "fa2f0d4410a11008cb36b379177291be7ee9e4f6", - "shasum": "" - }, - "require": { - "ext-bcmath": "*", - "ext-mbstring": "*", - "php": ">=5.3.0" - }, - "replace": { - "videlalvaro/php-amqplib": "self.version" - }, - "require-dev": { - "phpunit/phpunit": "^4.8", - "scrutinizer/ocular": "^1.1", - "squizlabs/php_codesniffer": "^2.5" - }, - "suggest": { - "ext-sockets": "Use AMQPSocketConnection" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "PhpAmqpLib\\": "PhpAmqpLib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Alvaro Videla", - "role": "Original Maintainer" - }, - { - "name": "John Kelly", - "email": "johnmkelly86@gmail.com", - "role": "Maintainer" - }, - { - "name": "Raúl Araya", - "email": "nubeiro@gmail.com", - "role": "Maintainer" - } - ], - "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", - "homepage": "https://github.com/php-amqplib/php-amqplib/", - "keywords": [ - "message", - "queue", - "rabbitmq" - ], - "time": "2016-04-11T14:30:01+00:00" + "time": "2016-07-18 14:02:57" }, { "name": "phpdocumentor/reflection-common", @@ -7952,7 +7873,7 @@ "reflection", "static analysis" ], - "time": "2015-12-27T11:43:31+00:00" + "time": "2015-12-27 11:43:31" }, { "name": "phpdocumentor/reflection-docblock", @@ -7997,7 +7918,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30T07:12:33+00:00" + "time": "2016-09-30 07:12:33" }, { "name": "phpdocumentor/type-resolver", @@ -8044,7 +7965,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-11-25T06:54:22+00:00" + "time": "2016-11-25 06:54:22" }, { "name": "phpspec/prophecy", @@ -8107,7 +8028,7 @@ "spy", "stub" ], - "time": "2016-11-21T14:58:47+00:00" + "time": "2016-11-21 14:58:47" }, { "name": "phpunit/php-code-coverage", @@ -8169,7 +8090,7 @@ "testing", "xunit" ], - "time": "2015-10-06T15:47:00+00:00" + "time": "2015-10-06 15:47:00" }, { "name": "phpunit/php-file-iterator", @@ -8216,7 +8137,7 @@ "filesystem", "iterator" ], - "time": "2016-10-03T07:40:28+00:00" + "time": "2016-10-03 07:40:28" }, { "name": "phpunit/php-text-template", @@ -8257,7 +8178,7 @@ "keywords": [ "template" ], - "time": "2015-06-21T13:50:34+00:00" + "time": "2015-06-21 13:50:34" }, { "name": "phpunit/php-timer", @@ -8301,7 +8222,7 @@ "keywords": [ "timer" ], - "time": "2016-05-12T18:03:57+00:00" + "time": "2016-05-12 18:03:57" }, { "name": "phpunit/php-token-stream", @@ -8350,7 +8271,7 @@ "keywords": [ "tokenizer" ], - "time": "2016-11-15T14:06:22+00:00" + "time": "2016-11-15 14:06:22" }, { "name": "phpunit/phpunit", @@ -8422,7 +8343,7 @@ "testing", "xunit" ], - "time": "2017-01-26T16:15:36+00:00" + "time": "2017-01-26 16:15:36" }, { "name": "phpunit/phpunit-mock-objects", @@ -8479,7 +8400,7 @@ "xunit" ], "abandoned": true, - "time": "2015-10-02T06:51:40+00:00" + "time": "2015-10-02 06:51:40" }, { "name": "sebastian/comparator", @@ -8543,7 +8464,7 @@ "compare", "equality" ], - "time": "2017-01-29T09:50:25+00:00" + "time": "2017-01-29 09:50:25" }, { "name": "sebastian/diff", @@ -8595,7 +8516,7 @@ "keywords": [ "diff" ], - "time": "2015-12-08T07:14:41+00:00" + "time": "2015-12-08 07:14:41" }, { "name": "sebastian/environment", @@ -8645,7 +8566,7 @@ "environment", "hhvm" ], - "time": "2016-08-18T05:49:44+00:00" + "time": "2016-08-18 05:49:44" }, { "name": "sebastian/exporter", @@ -8712,7 +8633,7 @@ "export", "exporter" ], - "time": "2016-06-17T09:04:28+00:00" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", @@ -8763,7 +8684,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12T03:26:01+00:00" + "time": "2015-10-12 03:26:01" }, { "name": "sebastian/recursion-context", @@ -8816,7 +8737,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11T19:50:13+00:00" + "time": "2015-11-11 19:50:13" }, { "name": "sebastian/version", @@ -8851,7 +8772,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21T13:59:46+00:00" + "time": "2015-06-21 13:59:46" } ], "aliases": [ From df86aac2bad178171f7820d1dce36afcdd013232 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 29 Oct 2019 16:48:14 +0400 Subject: [PATCH 05/17] PHRAS-2766 #comment port 41 Add status change capabilities to quarantine #time 3h --- .../Controller/Prod/LazaretController.php | 73 ++- .../ControllerProvider/Prod/Lazaret.php | 5 + .../Phrasea/Model/Entities/LazaretFile.php | 29 ++ .../Model/Manipulator/LazaretManipulator.php | 2 + package.json | 2 +- .../common/images/icons/icon-right-arrow.svg | 31 ++ templates/web/prod/upload/lazaret.html.twig | 459 ++++++++++++------ 7 files changed, 461 insertions(+), 140 deletions(-) create mode 100644 resources/www/common/images/icons/icon-right-arrow.svg diff --git a/lib/Alchemy/Phrasea/Controller/Prod/LazaretController.php b/lib/Alchemy/Phrasea/Controller/Prod/LazaretController.php index afb91cb23e..7fcddb0b28 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/LazaretController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/LazaretController.php @@ -70,7 +70,7 @@ class LazaretController extends Controller public function getElement($file_id) { $ret = ['success' => false, 'message' => '', 'result' => []]; - + /* @var LazaretFile $lazaretFile */ $lazaretFile = $this->getLazaretFileRepository()->find($file_id); @@ -126,6 +126,16 @@ class LazaretController extends Controller $ret = $lazaretManipulator->add($file_id, $keepAttributes, $attributesToKeep); + try{ + // get the new record + $record = \Collection::getByBaseId($this->app, $request->request->get('bas_id'))->get_databox()->get_record($ret['result']['record_id']); + $postStatus = (array) $request->request->get('status'); + // update status + $this->updateRecordStatus($record, $postStatus); + }catch(\Exception $e){ + $ret['message'] = $this->app->trans('An error occured when wanting to change status!'); + } + return $this->app->json($ret); } @@ -216,6 +226,7 @@ class LazaretController extends Controller return $this->app->json($ret); } + $postStatus = (array) $request->request->get('status'); $path = $this->app['tmp.lazaret.path'] . '/'; $lazaretFileName = $path .$lazaretFile->getFilename(); @@ -233,6 +244,9 @@ class LazaretController extends Controller '' ); + // update status + $this->updateRecordStatus($record, $postStatus); + //Delete lazaret file $manager = $this->getEntityManager(); $manager->remove($lazaretFile); @@ -278,6 +292,35 @@ class LazaretController extends Controller ); } + /** + * @param Request $request + * @param $databox_id + * @param $record_id + * @return \Symfony\Component\HttpFoundation\JsonResponse + */ + public function getDestinationStatus(Request $request, $databox_id, $record_id) + { + if (!$request->isXmlHttpRequest()) { + $this->app->abort(400); + } + $record = new \record_adapter($this->app, (int) $databox_id, (int) $record_id); + $databox = $this->findDataboxById($databox_id); + $statusStructure = $databox->getStatusStructure(); + $recordsStatuses = []; + foreach ($statusStructure as $status) { + // make the key as a string for the json usage in javascript + $bit = "'".$status['bit']."'"; + if (!isset($recordsStatuses[$bit])) { + $recordsStatuses[$bit] = $status; + } + $statusSet = \databox_status::bitIsSet($record->getStatusBitField(), $status['bit']); + if (!isset($recordsStatuses[$bit]['flag'])) { + $recordsStatuses[$bit]['flag'] = (int) $statusSet; + } + } + return $this->app->json(['status' => $recordsStatuses]); + } + /** * @return LazaretFileRepository */ @@ -293,4 +336,32 @@ class LazaretController extends Controller { return $this->app['border-manager']; } + + /** + * Set new status to selected record + * + * @param \record_adapter $record + * @param array $postStatus + * @return array|null + */ + private function updateRecordStatus(\record_adapter $record, array $postStatus) + { + $sbasId = $record->getDataboxId(); + if (isset($postStatus[$sbasId]) && is_array($postStatus[$sbasId])) { + $postStatus = $postStatus[$sbasId]; + $currentStatus = strrev($record->getStatus()); + $newStatus = ''; + foreach (range(0, 31) as $i) { + $newStatus .= isset($postStatus[$i]) ? ($postStatus[$i] ? '1' : '0') : $currentStatus[$i]; + } + $record->setStatus(strrev($newStatus)); + $this->getDataboxLogger($record->getDatabox()) + ->log($record, \Session_Logger::EVENT_STATUS, '', ''); + return [ + 'current_status' => $currentStatus, + 'new_status' => $newStatus, + ]; + } + return null; + } } diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Lazaret.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Lazaret.php index 16081d7f14..53c2804fce 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Lazaret.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Lazaret.php @@ -82,6 +82,11 @@ class Lazaret implements ControllerProviderInterface, ServiceProviderInterface ->assert('file_id', '\d+') ->bind('lazaret_thumbnail'); + $controllers->get('/{databox_id}/{record_id}/status', 'controller.prod.lazaret:getDestinationStatus') + ->assert('databox_id', '\d+') + ->assert('record_id', '\d+') + ->bind('lazaret_destination_status'); + return $controllers; } } diff --git a/lib/Alchemy/Phrasea/Model/Entities/LazaretFile.php b/lib/Alchemy/Phrasea/Model/Entities/LazaretFile.php index 9355acc471..221027e28e 100644 --- a/lib/Alchemy/Phrasea/Model/Entities/LazaretFile.php +++ b/lib/Alchemy/Phrasea/Model/Entities/LazaretFile.php @@ -12,6 +12,7 @@ namespace Alchemy\Phrasea\Model\Entities; use Alchemy\Phrasea\Application; +use Alchemy\Phrasea\Border\Attribute\AttributeInterface; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; use \record_adapter; @@ -474,4 +475,32 @@ class LazaretFile return $merged; } + /** + * @param Application $app + * @return array|null + */ + public function getStatus(Application $app) + { + /**@var LazaretAttribute $atribute*/ + foreach ($this->attributes as $atribute) { + if ($atribute->getName() == AttributeInterface::NAME_STATUS) { + $databox = $this->getCollection($app)->get_databox(); + $statusStructure = $databox->getStatusStructure(); + $recordsStatuses = []; + foreach ($statusStructure as $status) { + $bit = $status['bit']; + if (!isset($recordsStatuses[$bit])) { + $recordsStatuses[$bit] = $status; + } + $statusSet = \databox_status::bitIsSet(bindec($atribute->getValue()), $bit); + if (!isset($recordsStatuses[$bit]['flag'])) { + $recordsStatuses[$bit]['flag'] = (int) $statusSet; + } + } + return $recordsStatuses; + } + } + return null; + } + } diff --git a/lib/Alchemy/Phrasea/Model/Manipulator/LazaretManipulator.php b/lib/Alchemy/Phrasea/Model/Manipulator/LazaretManipulator.php index fff97be4bd..3c86fe91e3 100644 --- a/lib/Alchemy/Phrasea/Model/Manipulator/LazaretManipulator.php +++ b/lib/Alchemy/Phrasea/Model/Manipulator/LazaretManipulator.php @@ -226,6 +226,8 @@ class LazaretManipulator $this->entityManager->remove($lazaretFile); $this->entityManager->flush(); + $ret['result']['record_id'] = $record->getRecordId(); + $ret['success'] = true; } catch (\Exception $e) { $ret['message'] = $this->app->trans('An error occured'); diff --git a/package.json b/package.json index 84823d0938..aabd465c41 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.72-d", + "phraseanet-production-client": "0.34.74-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/resources/www/common/images/icons/icon-right-arrow.svg b/resources/www/common/images/icons/icon-right-arrow.svg new file mode 100644 index 0000000000..c3fabe9a03 --- /dev/null +++ b/resources/www/common/images/icons/icon-right-arrow.svg @@ -0,0 +1,31 @@ + + + + 5609DDD5-6B9C-411B-B926-EEA284949013 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/web/prod/upload/lazaret.html.twig b/templates/web/prod/upload/lazaret.html.twig index e68d4ee0f7..b79d30ba65 100644 --- a/templates/web/prod/upload/lazaret.html.twig +++ b/templates/web/prod/upload/lazaret.html.twig @@ -35,7 +35,7 @@
    {% for file in lazaretFiles %}
  • - {{ _self.lazaretElement(app, file) }} + {{ _self.lazaretElement(app, file) }}
  • {% endfor %}
@@ -48,56 +48,56 @@ - {% macro lazaretElement(app, file) %} {% import "common/thumbnail.html.twig" as thumb %} {% set records = file.getRecordsToSubstitute(app, true) %}
+
{{ "Last uploaded version" | trans }}
    -
  • +
  • @@ -344,34 +425,63 @@

    {{ border_checker_from_fqcn(check.getCheckClassname()).getMessage(app['translator']) }}

    {% endfor %}
    +
    + {% set collection = file.getCollection(app) %} + + + +
    +
    + Reset status +
    {{ 'upload:: Status :' | trans }}
    + diff --git a/www/scripts/models/field.js b/www/scripts/models/field.js index 1b171cd2d6..cf895456c1 100644 --- a/www/scripts/models/field.js +++ b/www/scripts/models/field.js @@ -26,7 +26,8 @@ define([ "type": "string", "thumbtitle": "0", "tbranch": "", - "publish_cterms": false, + "generate_cterms": false, + "gui_editable": true, "separator": "", "required": false, "report": true, diff --git a/www/scripts/tests/specs/models.js b/www/scripts/tests/specs/models.js index fce8e3e5ee..aaa15c61c4 100644 --- a/www/scripts/tests/specs/models.js +++ b/www/scripts/tests/specs/models.js @@ -44,8 +44,12 @@ define([ this.field.get('tbranch').should.equal(""); }); - it("should default publish_cterms property to '0'", function () { - this.field.get('publish_cterms').should.equal("0"); + it("should default generate_cterms property to '1'", function () { + this.field.get('generate_cterms').should.equal("1"); + }); + + it("should default gui_editable property to '1'", function () { + this.field.get('gui_editable').should.equal("1"); }); it("should default separator property to 'empty'", function () { From 9d312655748665db651e444a1934e7705b762a1e Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Mon, 4 Nov 2019 11:20:49 +0400 Subject: [PATCH 09/17] PHRAS-2792 #time 4h --- .../www/common/images/icons/to_be_denied.png | Bin 0 -> 4198 bytes .../www/common/images/icons/to_be_validated.png | Bin 0 -> 595 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/www/common/images/icons/to_be_denied.png create mode 100644 resources/www/common/images/icons/to_be_validated.png diff --git a/resources/www/common/images/icons/to_be_denied.png b/resources/www/common/images/icons/to_be_denied.png new file mode 100644 index 0000000000000000000000000000000000000000..dda3e8d50fb0aba0c05fac88c6b554fa57fd674a GIT binary patch literal 4198 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 Date: Mon, 4 Nov 2019 10:35:16 +0100 Subject: [PATCH 10/17] PHRAS-2808-2806_disable-cterms_mask-writable-fields_4.1 fix php syntax error during circleci test (ok on devjy ?) todo : implement "gui_editable" in edit ux (hide field when =false) todo : 2 new strings (ckbox labels) to trans --- .../Elastic/Indexer/Record/Hydrator/ThesaurusHydrator.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/ThesaurusHydrator.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/ThesaurusHydrator.php index 64fb4fedc0..6f6c502151 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/ThesaurusHydrator.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Indexer/Record/Hydrator/ThesaurusHydrator.php @@ -98,7 +98,8 @@ class ThesaurusHydrator implements HydratorInterface } } else { - if(($fields[$name])->get_generate_cterms()) { + $field = $fields[$name]; + if($field->get_generate_cterms()) { $this->candidate_terms->insert($field_names[$offset], $values[$offset]); } } From c1c76a6d9ef42b3ff325173eacf94df1549d4978 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Mon, 4 Nov 2019 13:53:57 +0400 Subject: [PATCH 11/17] PHRAS-2792 #comment upgrade phraseanet-production-client --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 84823d0938..cea2ca4d27 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.72-d", + "phraseanet-production-client": "0.34.75-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index 4cfedda66c..4bdc1fcaef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7555,10 +7555,10 @@ phraseanet-common@^0.4.1: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.72-d: - version "0.34.72-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.72-d.tgz#028a5ccd589e696b5433eea9d53d9367966613c8" - integrity sha512-IPaDRqXwyJegoKmzr56bggxTzN4TnmuAqU4O7rDEhh0aqdCiuC8rlH/yzKoLeEIMSrESCw5mBhrI//ccntvv9w== +phraseanet-production-client@0.34.75-d: + version "0.34.75-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.75-d.tgz#713d19541db612d42aa0111820e5368698aeb4ea" + integrity sha512-w/pC65z8UiMOdkCHQ2RIYkSMYzBQ9N3264Xl+F8QKSqwdFxXfu75h2mPj/UROrwJq/LYAc9oWiYfHFWLCmO0qA== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 32ec974341900a445d0507a45550fa3423062d83 Mon Sep 17 00:00:00 2001 From: Jean-Yves Gaulier Date: Mon, 4 Nov 2019 16:01:50 +0100 Subject: [PATCH 12/17] PHRAS-2808-2806_disable-cterms_mask-writable-fields_4.1 fix unit test todo : implement "gui_editable" in edit ux (hide field when =false) todo : 2 new strings (ckbox labels) to trans --- tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php b/tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php index e13f9e4e9a..dde4d2f9c6 100644 --- a/tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php +++ b/tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php @@ -229,6 +229,8 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase 'dces-element' => null, 'vocabulary-type' => 'User', 'vocabulary-restricted' => true, + 'gui_editable' => true, + 'generate_cterms' => true, ]); $response = $this->request("POST", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()), [], [], $body); From 27e100bdbdf043ea7bbb236b6f15aeffd9d25ce5 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 5 Nov 2019 17:20:24 +0400 Subject: [PATCH 13/17] PHRAS-2792 #comment add new icon --- .../www/common/images/icons/to_be_denied.png | Bin 4198 -> 0 bytes .../www/common/images/icons/to_be_denied.svg | 1 + .../www/common/images/icons/to_be_validated.png | Bin 595 -> 0 bytes .../www/common/images/icons/to_be_validated.svg | 1 + 4 files changed, 2 insertions(+) delete mode 100644 resources/www/common/images/icons/to_be_denied.png create mode 100644 resources/www/common/images/icons/to_be_denied.svg delete mode 100644 resources/www/common/images/icons/to_be_validated.png create mode 100644 resources/www/common/images/icons/to_be_validated.svg diff --git a/resources/www/common/images/icons/to_be_denied.png b/resources/www/common/images/icons/to_be_denied.png deleted file mode 100644 index dda3e8d50fb0aba0c05fac88c6b554fa57fd674a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4198 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