diff --git a/.circleci/config.yml b/.circleci/config.yml index 3ebc93224a..8284f38fa7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -107,6 +107,53 @@ jobs: - store_artifacts: path: /tmp/circleci-test-results + + build_phraseanet-fpm: + machine: + image: ubuntu-1604:201903-01 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build --target phraseanet-fpm -t ${AWS_ACCOUNT_URL}/phraseanet-fpm:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-fpm" + tag: "${CIRCLE_BRANCH}" + + build_phraseanet-worker: + machine: + image: ubuntu-1604:201903-01 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build --target phraseanet-worker -t ${AWS_ACCOUNT_URL}/phraseanet-worker:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-worker" + tag: "${CIRCLE_BRANCH}" + + build_phraseanet-nginx: + machine: + image: ubuntu-1604:201903-01 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build --target phraseanet-nginx -t ${AWS_ACCOUNT_URL}/phraseanet-nginx:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-nginx" + tag: "${CIRCLE_BRANCH}" + + workflows: version: 2 oldfashion: @@ -114,36 +161,9 @@ workflows: - build newfashion: jobs: - - aws-ecr/build_and_push_image: - account-url: AWS_ACCOUNT_URL - aws-access-key-id: AWS_ACCESS_KEY_ID - aws-secret-access-key: AWS_SECRET_ACCESS_KEY + - build_phraseanet-fpm: context: "AWS London" - create-repo: true - dockerfile: Dockerfile - extra-build-args: "--target phraseanet-fpm" - region: AWS_DEFAULT_REGION - repo: "phraseanet-fpm" - tag: "${CIRCLE_BRANCH}" - - aws-ecr/build_and_push_image: - account-url: AWS_ACCOUNT_URL - aws-access-key-id: AWS_ACCESS_KEY_ID - aws-secret-access-key: AWS_SECRET_ACCESS_KEY + - build_phraseanet-worker: context: "AWS London" - create-repo: true - dockerfile: Dockerfile - extra-build-args: "--target phraseanet-nginx" - region: AWS_DEFAULT_REGION - repo: "phraseanet-nginx" - tag: "${CIRCLE_BRANCH}" - - aws-ecr/build_and_push_image: - account-url: AWS_ACCOUNT_URL - aws-access-key-id: AWS_ACCESS_KEY_ID - aws-secret-access-key: AWS_SECRET_ACCESS_KEY + - build_phraseanet-nginx: context: "AWS London" - create-repo: true - dockerfile: Dockerfile - extra-build-args: "--target phraseanet-worker" - region: AWS_DEFAULT_REGION - repo: "phraseanet-worker" - tag: "${CIRCLE_BRANCH}" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..9754e0bf0b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.circleci +.git +.settings +nodes_modules +vendor + + + + + + + diff --git a/Dockerfile b/Dockerfile index c40dfc4347..ab22c72631 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,10 @@ -FROM php:7.0-fpm-stretch as builder +######################################################################### +# This image contains every build tools that will be used by the builder and +# the app images (usefull in dev mode) +######################################################################### + +FROM php:7.0-fpm-stretch as phraseanet-system RUN apt-get update \ && apt-get install -y \ apt-transport-https \ @@ -23,6 +28,7 @@ RUN apt-get update \ libxslt-dev \ libzmq3-dev \ locales \ + gettext \ mcrypt \ swftools \ unoconv \ @@ -61,9 +67,19 @@ RUN mkdir /entrypoint /var/alchemy \ && mkdir -p /home/app/.composer \ && chown -R app: /home/app /var/alchemy +######################################################################### +# This image is used to build the apps +######################################################################### + +FROM phraseanet-system as builder + WORKDIR /var/alchemy/ +# Files that are needed at build stage + COPY gulpfile.js /var/alchemy/ +COPY www/include /var/alchemy/www/include +COPY www/scripts/apps /var/alchemy/www/scripts/apps COPY Makefile /var/alchemy/ COPY package.json /var/alchemy/ COPY phpunit.xml.dist /var/alchemy/ @@ -73,11 +89,16 @@ COPY composer.json /var/alchemy/ COPY composer.lock /var/alchemy/ RUN make install_composer COPY resources /var/alchemy/resources -COPY www /var/alchemy/www + +# Application build phase + RUN make clean_assets RUN make install_asset_dependencies RUN make install_assets +# Application code + +COPY www /var/alchemy/www ADD ./docker/phraseanet/ / COPY lib /var/alchemy/lib COPY tmp /var/alchemy/tmp @@ -86,6 +107,9 @@ COPY grammar /var/alchemy/grammar COPY templates-profiler /var/alchemy/templates-profiler COPY templates /var/alchemy/templates COPY tests /var/alchemy/tests + +# Create needed folders + RUN mkdir -p /var/alchemy/Phraseanet/logs \ && chmod -R 777 /var/alchemy/Phraseanet/logs \ && mkdir -p /var/alchemy/Phraseanet/cache \ @@ -99,69 +123,11 @@ RUN mkdir -p /var/alchemy/Phraseanet/logs \ && mkdir -p /var/alchemy/Phraseanet/config \ && chmod -R 777 /var/alchemy/Phraseanet/config -# Phraseanet -FROM php:7.0-fpm-stretch as phraseanet-fpm -RUN apt-get update \ - && apt-get install -y \ - apt-transport-https \ - ca-certificates \ - gnupg2 \ - && apt-get update \ - && apt-get install -y --no-install-recommends zlib1g-dev \ - gettext \ - git \ - ghostscript \ - gpac \ - imagemagick \ - libav-tools \ - libfreetype6-dev \ - libicu-dev \ - libjpeg62-turbo-dev \ - libmagickwand-dev \ - libmcrypt-dev \ - libpng-dev \ - librabbitmq-dev \ - libssl-dev \ - libxslt-dev \ - libzmq3-dev \ - locales \ - mcrypt \ - swftools \ - unoconv \ - unzip \ - xpdf \ - && update-locale "LANG=fr_FR.UTF-8 UTF-8" \ - && dpkg-reconfigure --frontend noninteractive locales \ - && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ - && docker-php-ext-install -j$(nproc) gd \ - && docker-php-ext-install zip exif iconv mbstring pcntl sockets xsl intl pdo_mysql gettext bcmath mcrypt \ - && pecl install redis amqp-1.9.3 zmq-beta imagick-beta \ - && docker-php-ext-enable redis amqp zmq imagick \ - && pecl clear-cache \ - && docker-php-source delete \ - && rm -rf /var/lib/apt/lists/* +######################################################################### +# Phraseanet web application image +######################################################################### -RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ - && php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ - && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \ - && php -r "unlink('composer-setup.php');" - -# Node Installation (node + yarn) -# Reference : -# https://linuxize.com/post/how-to-install-node-js-on-ubuntu-18.04/ -# https://yarnpkg.com/lang/en/docs/install/#debian-stable -RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ - && apt install -y nodejs \ - && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt-get update && apt-get install -y --no-install-recommends yarn \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/ - -RUN mkdir /entrypoint /var/alchemy \ - && useradd -u 1000 app \ - && mkdir -p /home/app/.composer \ - && chown -R app: /home/app /var/alchemy +FROM phraseanet-system as phraseanet-fpm COPY --from=builder --chown=app /var/alchemy /var/alchemy/Phraseanet ADD ./docker/phraseanet/ / @@ -169,11 +135,17 @@ WORKDIR /var/alchemy/Phraseanet ENTRYPOINT ["/phraseanet-entrypoint.sh"] CMD ["/boot.sh"] -# phraseanet-worker +######################################################################### +# Phraseanet worker application image +######################################################################### + FROM phraseanet-fpm as phraseanet-worker CMD ["/worker-boot.sh"] +######################################################################### # phraseanet-nginx +######################################################################### + FROM nginx:1.15 as phraseanet-nginx RUN useradd -u 1000 app ADD ./docker/nginx/ / diff --git a/Dockerfile-debug b/Dockerfile-debug deleted file mode 100644 index ac52e11669..0000000000 --- a/Dockerfile-debug +++ /dev/null @@ -1,18 +0,0 @@ -ARG phraseanet -FROM $phraseanet - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - iproute2 \ - && rm -rf /var/lib/apt/lists/* \ - && pecl install xdebug \ - && docker-php-ext-enable xdebug \ - && pecl clear-cache - -ADD ./docker/phraseanet-debug/ / - -RUN chmod +x /entrypoint.sh /usr/local/bin/docker-* - -ENTRYPOINT ["/entrypoint.sh"] - -CMD ["php-fpm"] diff --git a/build.sh b/build.sh index 0f983ccac4..60e95a3b7d 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -xe + # nginx server docker build --target phraseanet-nginx -t local/phraseanet-nginx:$1 . diff --git a/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php b/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php index e30aa03946..106a60b1d8 100644 --- a/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php +++ b/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php @@ -354,7 +354,7 @@ class SubdefsController extends Controller Subdef::TYPE_VIDEO => [ "definitions" => [ "video codec H264" => null, - "144P H264 128 kbps ACC 128kbps" => [ + "144P H264 128 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "128", @@ -362,10 +362,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "256", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "240P H264 256 kbps ACC 128kbps" => [ + "240P H264 256 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "256", @@ -373,10 +373,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "426", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "360P H264 576 kbps ACC 128kbps" => [ + "360P H264 576 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "576", @@ -384,10 +384,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "480", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libtheora", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "480P H264 750 kbps ACC 128kbps" => [ + "480P H264 750 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "750", @@ -395,10 +395,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "854", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "720P H264 1492 kbps ACC 128kbps" => [ + "720P H264 1492 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "1492", @@ -406,10 +406,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1280", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "1080P H264 2420 kbps ACC 128kbps" => [ + "1080P H264 2420 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "2420", @@ -417,11 +417,77 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1920", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", + Subdef::OPTION_DEVICE => ["all"] + ], + "144P H264 128 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "128", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "256", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libx264", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "240P H264 256 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "256", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "426", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libx264", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "360P H264 576 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "576", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "480", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libtheora", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "480P H264 750 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "750", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "854", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libx264", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "720P H264 1492 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "1492", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "1280", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libx264", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "1080P H264 2420 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "2420", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "1920", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libx264", + Video::OPTION_ACODEC => "libfdk_aac", Subdef::OPTION_DEVICE => ["all"] ], "video codec libvpx" => null, - "144P webm 128 kbps ACC 128kbps" => [ + "144P webm 128 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "128", @@ -429,10 +495,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "256", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "240P webm 256 kbps ACC 128kbps" => [ + "240P webm 256 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "256", @@ -440,10 +506,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "426", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "360P webm 576 kbps ACC 128kbps" => [ + "360P webm 576 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "576", @@ -451,10 +517,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "480", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "480P webm 750 kbps ACC 128kbps" => [ + "480P webm 750 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "750", @@ -462,10 +528,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "854", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "720P webm 1492 kbps ACC 128kbps" => [ + "720P webm 1492 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "1492", @@ -473,10 +539,10 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1280", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], - "1080P webm 2420 kbps ACC 128kbps" => [ + "1080P webm 2420 kbps MP3 128kbps" => [ Video::OPTION_AUDIOBITRATE => "128", Video::OPTION_AUDIOSAMPLERATE => "44100", Video::OPTION_BITRATE => "2420", @@ -484,7 +550,73 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1920", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", + Subdef::OPTION_DEVICE => ["all"] + ], + "144P webm 128 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "128", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "256", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "240P webm 256 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "256", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "426", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "360P webm 576 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "576", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "480", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "480P webm 750 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "750", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "854", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "720P webm 1492 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "1492", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "1280", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", + Subdef::OPTION_DEVICE => ["all"] + ], + "1080P webm 2420 kbps AAC 128kbps" => [ + Video::OPTION_AUDIOBITRATE => "128", + Video::OPTION_AUDIOSAMPLERATE => "44100", + Video::OPTION_BITRATE => "2420", + Video::OPTION_GOPSIZE => "25", + Video::OPTION_SIZE => "1920", + Video::OPTION_FRAMERATE => "25", + Video::OPTION_VCODEC => "libvpx", + Video::OPTION_ACODEC => "libfdk_aac", Subdef::OPTION_DEVICE => ["all"] ], ], diff --git a/lib/Alchemy/Phrasea/Controller/Prod/PushController.php b/lib/Alchemy/Phrasea/Controller/Prod/PushController.php index f9ce528e41..6e650aefaa 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/PushController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/PushController.php @@ -193,7 +193,7 @@ class PushController extends Controller 'Validation from %user%', [ '%user%' => $this->getAuthenticatedUser()->getDisplayName(), ])); - $validation_description = $request->request->get('validation_description'); + $validation_description = $request->request->get('message'); $participants = $request->request->get('participants'); diff --git a/lib/Alchemy/Phrasea/Core/Version.php b/lib/Alchemy/Phrasea/Core/Version.php index 19011867d9..c209691c0b 100644 --- a/lib/Alchemy/Phrasea/Core/Version.php +++ b/lib/Alchemy/Phrasea/Core/Version.php @@ -16,7 +16,7 @@ class Version /** * @var string */ - private $number = '4.1.0-alpha.18a'; + private $number = '4.1.0-alpha.19a'; /** * @var string diff --git a/lib/Alchemy/Phrasea/Databox/Record/LegacyRecordRepository.php b/lib/Alchemy/Phrasea/Databox/Record/LegacyRecordRepository.php index 522d49baae..9924b8be94 100644 --- a/lib/Alchemy/Phrasea/Databox/Record/LegacyRecordRepository.php +++ b/lib/Alchemy/Phrasea/Databox/Record/LegacyRecordRepository.php @@ -140,6 +140,7 @@ class LegacyRecordRepository implements RecordRepository 's.rid_parent IN (:storyIds)', 'r.parent_record_id = 0' ) + ->orderBy('s.ord', 'ASC') ->setParameter('storyIds', $storyIds, Connection::PARAM_INT_ARRAY) ; diff --git a/lib/Alchemy/Phrasea/Media/Subdef/Video.php b/lib/Alchemy/Phrasea/Media/Subdef/Video.php index ef0a113564..be673b937a 100644 --- a/lib/Alchemy/Phrasea/Media/Subdef/Video.php +++ b/lib/Alchemy/Phrasea/Media/Subdef/Video.php @@ -33,7 +33,7 @@ class Video extends Audio $this->registerOption(new OptionType\Range($this->translator->trans('Frame Rate'), self::OPTION_FRAMERATE, 1, 200, 20)); $this->registerOption(new OptionType\Enum($this->translator->trans('Video Codec'), self::OPTION_VCODEC, ['libx264', 'libvpx', 'libtheora'], 'libx264')); $this->unregisterOption(self::OPTION_ACODEC); - $this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfaac', 'libvo_aacenc', 'libmp3lame', 'libvorbis'], 'libfaac')); + $this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfaac', 'libvo_aacenc', 'libmp3lame', 'libvorbis', 'libfdk_aac'], 'libmp3lame')); } public function getType() diff --git a/lib/classes/patch/410alpha19a.php b/lib/classes/patch/410alpha19a.php new file mode 100644 index 0000000000..43646981a4 --- /dev/null +++ b/lib/classes/patch/410alpha19a.php @@ -0,0 +1,69 @@ +release; + } + + /** + * {@inheritdoc} + */ + public function concern() + { + return $this->concern; + } + + /** + * {@inheritdoc} + */ + public function require_all_upgrades() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function getDoctrineMigrations() + { + return []; + } + + /** + * {@inheritdoc} + */ + public function apply(base $appbox, Application $app) + { + // remove all and last in default query + $sql = "UPDATE UserSettings SET value = '' WHERE name = 'start_page_query' AND lower(trim(value)) in ('all','last')"; + $stmt = $appbox->get_connection()->prepare($sql); + $stmt->execute(); + $stmt->closeCursor(); + + return true; + } +} diff --git a/package.json b/package.json index fc730f3db4..7525421e67 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.80-d", + "phraseanet-production-client": "^0.34.86-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/resources/www/common/images/icons/basket_feedback_read.png b/resources/www/common/images/icons/basket_feedback_read.png new file mode 100644 index 0000000000..129170a648 Binary files /dev/null and b/resources/www/common/images/icons/basket_feedback_read.png differ diff --git a/resources/www/common/images/icons/basket_feedback_unread.png b/resources/www/common/images/icons/basket_feedback_unread.png new file mode 100644 index 0000000000..31d91d31a4 Binary files /dev/null and b/resources/www/common/images/icons/basket_feedback_unread.png differ diff --git a/resources/www/common/styles/fonts/PhraseanetIcomoon/style.css b/resources/www/common/styles/fonts/PhraseanetIcomoon/style.css index 566f9d5786..bef5e9c08c 100644 --- a/resources/www/common/styles/fonts/PhraseanetIcomoon/style.css +++ b/resources/www/common/styles/fonts/PhraseanetIcomoon/style.css @@ -1,13 +1,3 @@ -@font-face { - font-family: 'icomoon'; - src: url('fonts/icomoon.eot?81kpnc'); - src: url('fonts/icomoon.eot?81kpnc#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?81kpnc') format('truetype'), - url('fonts/icomoon.woff?81kpnc') format('woff'), - url('fonts/icomoon.svg?81kpnc#icomoon') format('svg'); - font-weight: normal; - font-style: normal; -} [class^="icon-"], [class*=" icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ diff --git a/resources/www/lightbox/styles/jquery-mobile/_jquery-validator.scss b/resources/www/lightbox/styles/jquery-mobile/_jquery-validator.scss index 259ade124d..013a7ae0a7 100644 --- a/resources/www/lightbox/styles/jquery-mobile/_jquery-validator.scss +++ b/resources/www/lightbox/styles/jquery-mobile/_jquery-validator.scss @@ -1,30 +1,34 @@ $iconsPath: '../../../assets/common/images/icons/'; - -ul.image_set{ - padding:0; - margin:0; - border:none; - width:100%; - border:none; +$feedbackColor : #8bc34a; +$basketColor : #2196f3 ; +ul.image_set { + padding: 0; + margin: 0; + border: none; + width: 100%; + border: none; list-style-type: none; display: flex; flex-wrap: wrap; } -li.image_box a img{ - position:relative; - border:none; - width: auto!important; - height: 100% !important; + +li.image_box a img { + position: relative; + border: none; + width: auto !important; + height: 100% !important; top: 0 !important; object-fit: contain; } -li.image_box a{ - padding:0; - text-shadow:0; - margin:0; + +li.image_box a { + padding: 0; + text-shadow: 0; + margin: 0; width: 100%; } -li.image_box{ + +li.image_box { width: 18%; position: relative; margin: 0 2.5% 15px 0; @@ -38,19 +42,20 @@ li.image_box{ } .thumb_wrapper { background: #ededed; - width: 100%!important; - height: 160px!important; + width: 100% !important; + height: 160px !important; @media screen and (max-width: 767px) { - height: 130px !important; + height: 130px !important; } } } + @media screen and (max-width: 767px) { - li.image_box{ + li.image_box { width: 32%; margin: 0 2% 15px 0; &:nth-child(5n) { - margin-right: 2% ; + margin-right: 2%; } &:nth-child(3n) { margin-right: 0; @@ -58,35 +63,37 @@ li.image_box{ } } -a.no.active_choice{ - background-color:red; +a.no.active_choice { + background-color: red; color: #fff; } -a.active_choice{ + +a.active_choice { background-color: #53b401; color: #fff; } -.valid_choice{ - position:absolute; - bottom:0; - right:0; - width:16px; - height:16px; - z-index:2; +.valid_choice { + position: absolute; + bottom: 0; + right: 0; + width: 16px; + height: 16px; + z-index: 2; } -.valid_choice.agree{ +.valid_choice.agree { background: #7ed321; border-top-left-radius: 100px; } -.valid_choice.disagree{ + +.valid_choice.disagree { background: #d0021b; border-top-left-radius: 100px; } .thumb_wrapper { - text-align:center; + text-align: center; } @media screen and (orientation: landscape) { @@ -108,3 +115,207 @@ a.active_choice{ .ui-footer .ui-title, .ui-header .ui-title { font-size: 18px; } + +.ui-listview .ui-li-has-thumb .ui-li-thumb, .ui-listview .ui-li-has-thumb > .ui-btn > img:first-child, .ui-listview .ui-li-has-thumb > img:first-child { + top: 50%; + transform: translateY(-50%); +} + +/*user status*/ +.menu-bar-item { + background: #f0f0f0; + padding: 12px 15px; + text-align: left; + position: relative; + .icomoon { + font-size: 17px; + position: absolute; + left: 23px; + top: 50%; + transform: translateY(-50%); + } + .ui-link { + color: #4f4f4f !important; + text-decoration: none !important; + .text { + padding-left: 31px; + color: #4f4f4f !important; + text-decoration: none !important; + font-weight: 700; + font-size: 13px; + } + } +} + +/*new design of lightbox*/ +/*main nav */ +#lightbox-menu { + li { + margin-bottom: 30px; + .ui-li-count { + border-radius: 3px !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; + border: 0; + color: #fff; + text-shadow: none; + padding: 18px 23px; + top: 0; + right: 0; + margin: 0; + font-size: 22px; + min-width: 25px; + background: $feedbackColor; + } + &.ui-first-child { + margin-top: 15px; + } + &.ui-last-child { + a { + &:before { + background: $basketColor; + } + &:hover, &:active, &:focus { + color: $basketColor; + } + } + .ui-li-count { + background: $basketColor; + } + } + + } + a { + padding: 22px 25px; + font-size: 20px; + border-radius: 3px !important; + box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.19); + background-color: #eeeeee; + &:hover, &:active, &:focus { + color: $feedbackColor; + } + &:after { + content: none !important; + } + &:before { + content: ""; + position: absolute; + display: block; + width: 100%; + height: 4px; + bottom: 0; + background: $feedbackColor; + left: 0; + border-radius: 3px; + } + } +} + +.lightbox-bottom-btn { + margin-top: 50px; + .ui-btn { + font-size: 15px; + } +} +#validation, #baskets { + .ui-content { + padding-left: 0; + padding-right: 0; + } +} +.basket-title { + background: $feedbackColor; + padding: 12px 30px; + font-size: 17px; + margin: 0; + text-shadow: none; + color: #fff; + font-weight: 700; + #baskets & { + background: $basketColor; + } + span { + float: right; + } +} + +.feed-list { + li { + height: 71px; + padding-left: 109px!important; + padding-right: 80px!important; + border-color: #d4d4d4!important; + text-overflow: inherit!important; + white-space: inherit!important; + } + .lightbox-img { + width: 90px; + height: 90px; + background-color: #ededed; + position: absolute; + left: 0; + top: 0; + display: flex; + flex-wrap: wrap; + img { + display: flex; + align-items: center; + width: 90px; + max-width: 100%; + max-height: 100%; + object-fit: contain; + } + } + h3 { + display: flex!important; + align-items: center; + height: 71px; + margin: 0!important; + font-size: 15px; + font-weight: bold!important; + text-overflow: inherit!important; + white-space: inherit!important; + a { + position: relative; + color: #313131!important; + width: 100%; + padding-right: 18px; + &:after { + content: "\e96c"; + font-family: icomoon; + position: absolute; + right: 0; + font-size: 20px; + line-height: 1; + top: 50%; + transform: translateY(-50%); + } + } + + } + span { + font-size: 17px; + color: #fff!important; + display: inline-block; + text-shadow: none!important; + top: 0; + width: 52px; + right: 0; + line-height: 25px; + padding: 31px 0px; + margin: 0; + border-radius: 0; + &.validation { + background: $feedbackColor!important; + } + &.baskets { + background: $basketColor!important; + } + } + +} +.lightbox-msg { + font-size: 14px; + color: #313131; + padding: 6px 0 6px 30px; +} diff --git a/templates/mobile/common/menubar.html.twig b/templates/mobile/common/menubar.html.twig new file mode 100644 index 0000000000..d8190dd5fa --- /dev/null +++ b/templates/mobile/common/menubar.html.twig @@ -0,0 +1,17 @@ +{% set configuration = app['conf'].get(['registry', 'custom-links']) %} + +{% if app.getAuthenticator().isAuthenticated() %} + +{% endif %} + diff --git a/templates/mobile/lightbox/basket_element.html.twig b/templates/mobile/lightbox/basket_element.html.twig index 08cfc9bd1b..db4756347e 100644 --- a/templates/mobile/lightbox/basket_element.html.twig +++ b/templates/mobile/lightbox/basket_element.html.twig @@ -26,7 +26,7 @@ #content { position: fixed; - top:50px; + top:90px; bottom: 0; right: 0; left: 0; @@ -40,17 +40,19 @@ {% block content %} {% set record = basket_element.getRecord(app) %} -
-
- {{ 'Back' | trans }} -

{{basket_element.getOrd()}} - {{record.get_title()}}

- {{ 'Home' | trans }} -
-
- + {% if basket_element.getBasket().getValidation() %} + {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanAgree() %} +
+ + + + +
+ {% endif %} +
+ + {{ 'validation:: editer ma note' | trans }} + +
+
+ +
+ {% endif %} +
diff --git a/templates/mobile/lightbox/feed_element.html.twig b/templates/mobile/lightbox/feed_element.html.twig index 9aa5f0aa99..997bd5ad36 100644 --- a/templates/mobile/lightbox/feed_element.html.twig +++ b/templates/mobile/lightbox/feed_element.html.twig @@ -17,7 +17,7 @@ #content { position: fixed; - top:50px; + top:90px; bottom: 0; right: 0; left: 0; @@ -36,9 +36,12 @@

{{feed_element.getOrd()}} - {{record.get_title()}}

Home
+
{{ thumbnail.format100percent(record.get_preview()) }}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/mobile/lightbox/index.html.twig b/templates/mobile/lightbox/index.html.twig index 4d8cc7cd96..67f698664f 100644 --- a/templates/mobile/lightbox/index.html.twig +++ b/templates/mobile/lightbox/index.html.twig @@ -40,18 +40,21 @@

{{module_name}}

{{ 'a propos' | trans }} +
-
+

Phraseanet Version {{ app['phraseanet.version'].getName() }} - {{ app['phraseanet.version'].getNumber() }}

@@ -83,27 +89,38 @@

{{ 'Back' | trans }} -

{{ 'Validations' | trans }}

+

{{ module_name }}

+
-

- {{ 'Voici vos validations en cours' | trans }} -

-
    - {% for basket in baskets_collection %} - {% if basket.getValidation() %} - {% set basket_length = basket.getElements().count() %} -
  • - {% if basket.getElements().first() %} - - {% endif %} -

    {{basket.getName()}}

    -

    {{ basket.getDescription() }}

    - {{ basket_length }} -
  • - {% endif %} - {% endfor %} -
+

+ {{ 'Validations' | trans }} + {{_self.valid_baskets_length(baskets_collection)}} +

+ +
+
    + {% for basket in baskets_collection | sort | reverse%} + {% if basket.getValidation() %} + {% set basket_length = basket.getElements().count() %} +
  • + {% if basket.getElements().first() %} + + {% endif %} +

    {{basket.getName()}}

    + {#

    {{ basket.getDescription() }}

    #} + {{ basket_length }} +
  • + {% endif %} + {% endfor %} +
+
@@ -113,27 +130,38 @@
{{ 'Back' | trans }} -

{{ 'Paniers' | trans }}

+

{{module_name}}

+
-

+

+ {{ 'Paniers' | trans }} + {{_self.baskets_length(baskets_collection)}} +

+ -
    - {% for basket in baskets_collection %} - {% if basket.getValidation() is empty %} - {% set basket_length = basket.getElements().count() %} -
  • - {% if basket.getElements().first() %} - - {% endif %} -

    {{ basket.getName() }}

    -

    {{ basket.getDescription() }}

    - {{basket_length}} -
  • - {% endif %} - {% endfor %} -
+
+
    + {% for basket in baskets_collection | sort | reverse %} + {% if basket.getValidation() is empty %} + {% set basket_length = basket.getElements().count() %} +
  • + {% if basket.getElements().first() %} + + {% endif %} +

    {{ basket.getName() }}

    + {#

    {{ basket.getDescription() }}

    #} + {{basket_length}} +
  • + {% endif %} + {% endfor %} +
+
diff --git a/templates/mobile/lightbox/sc_note.html.twig b/templates/mobile/lightbox/sc_note.html.twig index fe3ed24cd8..e1c783d245 100644 --- a/templates/mobile/lightbox/sc_note.html.twig +++ b/templates/mobile/lightbox/sc_note.html.twig @@ -1,21 +1,19 @@ {% for validationDatas in basket_element.getValidationDatas() %} -
  • + {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} + +
  • - {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} - {% if validationDatas.getAgreement() == true %}{% endif %} + {% if validationDatas.getAgreement() == true %}{% endif %} {% if validationDatas.getAgreement() == false and validationDatas.getAgreement() is not null %} {{ validationDatas.getAgreement() }}{% endif %} - {% endif %}

    {{ validationDatas.getParticipant().getUser().getDisplayName() }}

    - {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} - {% if validationDatas.getNote() != '' %} + {% if validationDatas.getNote() != '' %}

    {{ 'validation:: note' | trans }} : {{ validationDatas.getNote()|nl2br }}

    {% endif %} - {% endif %} -
  • + {% endif %} {% endfor %} diff --git a/templates/mobile/lightbox/validate.html.twig b/templates/mobile/lightbox/validate.html.twig index fbaa154a2a..f45998a029 100644 --- a/templates/mobile/lightbox/validate.html.twig +++ b/templates/mobile/lightbox/validate.html.twig @@ -32,6 +32,9 @@

    {{basket.getName()}}

    {{ 'Home' | trans }}
    +

    diff --git a/templates/web/lightbox/basket_content_report.html.twig b/templates/web/lightbox/basket_content_report.html.twig index 224a604eac..7a9940354e 100644 --- a/templates/web/lightbox/basket_content_report.html.twig +++ b/templates/web/lightbox/basket_content_report.html.twig @@ -17,32 +17,31 @@

    {% for validationDatas in basket_element.getValidationDatas()%} -
    - {% if validationDatas.getAgreement() == true %} - {% set imguser = '' %} - {% set styleuser = '' %} - {% elseif validationDatas.getAgreement() is null %} - {% set imguser = ' ' %} - {% set styleuser = 'margin-left:18px;' %} - {% else %} - {% set imguser = '' %} - {% set styleuser = '' %} - {% endif %} + {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} -
    - {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} - {{imguser|raw}} - {% endif %} -
    -
    -

    {{validationDatas.getParticipant().getUser().getDisplayName()}}

    - {% if validationDatas.getNote() != '' %} - {% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %} -

    {{validationDatas.getNote()|nl2br}}

    +
    + {% if validationDatas.getAgreement() == true %} + {% set imguser = '' %} + {% set styleuser = '' %} + {% elseif validationDatas.getAgreement() is null %} + {% set imguser = ' ' %} + {% set styleuser = 'margin-left:18px;' %} + {% else %} + {% set imguser = '' %} + {% set styleuser = '' %} {% endif %} - {% endif %} + +
    + {{imguser|raw}} +
    +
    +

    {{validationDatas.getParticipant().getUser().getDisplayName()}}

    + {% if validationDatas.getNote() != '' %} +

    {{validationDatas.getNote()|nl2br}}

    + {% endif %} +
    -
    + {% endif %} {% endfor %}
    diff --git a/templates/web/prod/WorkZone/Macros.html.twig b/templates/web/prod/WorkZone/Macros.html.twig index de3d0f4316..abd96a7641 100644 --- a/templates/web/prod/WorkZone/Macros.html.twig +++ b/templates/web/prod/WorkZone/Macros.html.twig @@ -16,9 +16,10 @@ {% if not basket.isRead() %} - + + {% else %} + {% endif %} - {{basket.getName()|e}} @@ -26,11 +27,9 @@ diff --git a/yarn.lock b/yarn.lock index ebc0ac35a3..a7d490caab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7565,10 +7565,10 @@ phantomjs-prebuilt@^2.1.3: request-progress "^2.0.1" which "^1.2.10" -phraseanet-common@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/phraseanet-common/-/phraseanet-common-0.4.2.tgz#740de9bf254116adc506c9703015ab1533f89864" - integrity sha512-uyKULVCV9df161A970mWnZtdxAb/ZWCuUdnSTn0T9AGvwsWvKf2p6+pgEVtBQ81LIGn1m5UlhiF7dUlc6nT7iQ== +phraseanet-common@^0.4.5-d: + version "0.4.5-d" + resolved "https://registry.yarnpkg.com/phraseanet-common/-/phraseanet-common-0.4.5-d.tgz#193da1ab062f98e99729b7f98a7bbe32c495c7f3" + integrity sha512-7mmPDg0pFnFYyY1eazmUcDa18SGXp90zEBYTNzVan6goPPBjUmA0YwzBiuvDnxlcwMX8x0kDIrOouOBfWG5E1w== dependencies: es6-promise "^4.1.1" humane-js "^3.2.2" @@ -7577,10 +7577,10 @@ phraseanet-common@^0.4.1: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.80-d: - version "0.34.80-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.80-d.tgz#1e54bee4306ab11528377cb63c19d8c7491ef0f3" - integrity sha512-ilGs7ndDNztwlyeW9MA2TMiMhZC+P1/lNNeIsIuh+KuJH8M3Y3SWBcmsN2lqu5iM1Xg5FbWJ6iXcCSrLWHTqsw== +phraseanet-production-client@^0.34.86-d: + version "0.34.86-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.86-d.tgz#51e6c6fb17fcd2695cee90fb3d972c781057fd78" + integrity sha512-12o7pcRZAJ/5Ote4DbkaRxLz2GIZBUcZf53FB+GHVFxhds5ia6UNDCPhYP5vX4hhHtO/Y6Mj/BOlOjnoyi+k1g== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" @@ -7611,7 +7611,7 @@ phraseanet-production-client@0.34.80-d: mapbox-gl-circle "^1.6.5" mapbox.js "^2.4.0" nouislider "^9.2.0" - phraseanet-common "^0.4.1" + phraseanet-common "^0.4.5-d" pym.js "^1.3.1" rx "^4.1.0" sprintf-js "^1.1.1"
    - + diff --git a/templates/web/prod/actions/Push.html.twig b/templates/web/prod/actions/Push.html.twig index 720db4c0f6..f0b8640d06 100644 --- a/templates/web/prod/actions/Push.html.twig +++ b/templates/web/prod/actions/Push.html.twig @@ -218,8 +218,8 @@ - - + +