diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 6db0ccee51..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,217 +0,0 @@ -version: 2.1 -orbs: - aws-ecr: circleci/aws-ecr@6.15.0 - aws-cli: circleci/aws-cli@1.3.1 -executors: - docker_build: - machine: - docker_layer_caching: true -jobs: - build: - working_directory: ~/alchemy-fr/Phraseanet - parallelism: 2 - shell: /bin/bash --login - environment: - CIRCLE_ARTIFACTS: /tmp/circleci-artifacts - CIRCLE_TEST_REPORTS: /tmp/circleci-test-results - docker: - - image: cimg/php:7.0.33-node - - image: circleci/rabbitmq:3.7.7 - steps: - - checkout - - run: php -v - - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS - - run: - working_directory: ~/alchemy-fr/Phraseanet - command: 'sudo apt update && sudo apt install mysql-server && sudo service mysql status || sudo service mysql start;' - # Dependencies - # This would typically go in either a build or a build-and-test job when using workflows - # Restore the dependency cache - - restore_cache: - keys: - # This branch if available - - v2-dep-{{ .Branch }}- - # Default branch if not - - v2-dep-master- - # Any branch if there are none on the default branch - this should be unnecessary if you have your default branch configured correctly - - v2-dep- - # This is based on your 1.0 configuration file or project settings - - run: echo 127.0.0.1 redis elasticsearch db rabbitmq | sudo tee -a /etc/hosts - - run: git clone https://github.com/alanxz/rabbitmq-c - - run: cd rabbitmq-c && git checkout 2ca1774489328cde71195f5fa95e17cf3a80cb8a - - run: cd rabbitmq-c && git submodule init && git submodule update && autoreconf -i && ./configure && make && sudo make install - # disabled because pear.php.net is down cause of security failure - #- run: pecl channel-update pear.php.net - - run: sudo apt -y install openjdk-8-jre-headless python-dev-is-python2 php7.0-amqp php7.0-zmq php7.0-intl php7.0-sqlite3 libmagickwand-dev libmagickcore-dev - - run: printf "\n" | sudo pecl install amqp-1.11.0beta - - run: printf "\n" | sudo pecl install imagick - - run: sudo -- bash -c "echo 'date.timezone = UTC' > /etc/php/7.0/mods-available/timezone.ini" - - run: sudo sed -i 's/^\(session.cache_limiter = \).*/\1""/' /etc/php/7.0/cli/php.ini - - run: sudo -- bash -c 'echo -e "[mysqld]\ndefault-authentication-plugin=mysql_native_password" > /etc/mysql/conf.d/mysql_native_password.cnf' && sudo service mysql restart - - run: npm rebuild node-sass - # This is based on your 1.0 configuration file or project settings - - run: composer install --no-progress --no-interaction --optimize-autoloader - - run: curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash - - run: source ~/.profile && nvm install v10.12.0 && nvm alias default v10.12.0 - # This is based on your 1.0 configuration file or project settings - - run: node -v - - run: npm -v - - run: yarn install - - run: if [[ ! -e elasticsearch-2.3.3 ]]; then wget --no-check-certificate https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-2.3.3.tar.gz && tar -xvf elasticsearch-2.3.3.tar.gz && elasticsearch-2.3.3/bin/plugin install analysis-icu; fi - - run: - command: elasticsearch-2.3.3/bin/elasticsearch - background: true - # Save dependency cache - - save_cache: - key: v2-dep-{{ .Branch }}-{{ epoch }} - paths: - # This is a broad list of cache paths to include many possible development environments - # You can probably delete some of these entries - - vendor/bundle - - ~/virtualenvs - - ~/.m2 - - ~/.ivy2 - - ~/.bundle - - ~/.go_workspace - - ~/.gradle - - ~/.cache/bower - # These cache paths were specified in the 1.0 config - - elasticsearch-2.3.3 - - node_modules - - ~/.composer - # This is based on your 1.0 configuration file or project settings - - run: sudo mysql -u root -e "CREATE USER 'phraseanet'@'localhost' IDENTIFIED WITH mysql_native_password BY 'phraseanet';GRANT ALL PRIVILEGES ON * . * TO 'phraseanet'@'localhost';CREATE DATABASE update39_test;CREATE DATABASE ab_test;CREATE DATABASE db_test;SET @@global.sql_mode=STRICT_ALL_TABLES;SET sql_mode=STRICT_ALL_TABLES;SET @@global.max_allowed_packet=33554432;SET @@global.wait_timeout=999999;" - # This is based on your 1.0 configuration file or project settings - - run: ./bin/developer system:uninstall -v - - run: ./bin/setup system:install -v --email=test@phraseanet.com --password=test --db-host=127.0.0.1 --db-user=phraseanet --db-template=fr-simple --db-password=phraseanet --databox=db_test --appbox=ab_test --server-name=http://127.0.0.1 -y; - - run: ./bin/developer ini:setup-tests-dbs -v - - run: ./bin/console searchengine:index:create -v - - run: ./bin/developer phraseanet:regenerate-sqlite -v - - run: ./bin/developer phraseanet:generate-js-fixtures -v - # Test - # This would typically be a build job when using workflows, possibly combined with build - # This is based on your 1.0 configuration file or project settings - - run: case $CIRCLE_NODE_INDEX in 0) EXIT=0; php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-unit.xml --exclude-group legacy || EXIT=$?; php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-legacy-no-web.xml --group legacy --exclude-group web || EXIT=$?; exit $EXIT;; 1) php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-legacy-web.xml --group web ;; esac - # Teardown - # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each - # Save test results - - store_test_results: - path: /tmp/circleci-test-results - # Save artifacts - - store_artifacts: - path: /tmp/circleci-artifacts - - store_artifacts: - path: /tmp/circleci-test-results - - build_phraseanet-setup: - machine: - image: ubuntu-2004:202201-02 - docker_layer_caching: true - working_directory: ~/alchemy-fr/Phraseanet - steps: - - checkout - - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . - - aws-ecr/ecr-login: - region: AWS_DEFAULT_REGION - - run: docker build --target phraseanet-setup -t ${AWS_ACCOUNT_URL}/phraseanet-setup:${CIRCLE_BRANCH} . - - aws-ecr/push-image: - account-url: AWS_ACCOUNT_URL - repo: "phraseanet-setup" - tag: "${CIRCLE_BRANCH}" - - build_phraseanet-fpm: - machine: - image: ubuntu-2004:202201-02 - docker_layer_caching: true - working_directory: ~/alchemy-fr/Phraseanet - steps: - - checkout - - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . - - 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-2004:202201-02 - docker_layer_caching: true - working_directory: ~/alchemy-fr/Phraseanet - steps: - - checkout - - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . - - 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-2004:202201-02 - 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}" - - build_phraseanet-db: - machine: - image: ubuntu-2004:202201-02 - docker_layer_caching: true - working_directory: ~/alchemy-fr/Phraseanet/ - steps: - - checkout - - aws-ecr/ecr-login: - region: AWS_DEFAULT_REGION - - run: docker build -f ./docker/db/Dockerfile -t ${AWS_ACCOUNT_URL}/phraseanet-db:${CIRCLE_BRANCH} . - - aws-ecr/push-image: - account-url: AWS_ACCOUNT_URL - repo: "phraseanet-db" - tag: "${CIRCLE_BRANCH}" - - build_phraseanet-elasticsearch: - machine: - image: ubuntu-2004:202201-02 - docker_layer_caching: true - working_directory: ~/alchemy-fr/Phraseanet/docker/elasticsearch - steps: - - checkout - - aws-ecr/ecr-login: - region: AWS_DEFAULT_REGION - - run: docker build -f ./docker/elasticsearch/Dockerfile -t ${AWS_ACCOUNT_URL}/phraseanet-elasticsearch:${CIRCLE_BRANCH} . - - aws-ecr/push-image: - account-url: AWS_ACCOUNT_URL - repo: "phraseanet-elasticsearch" - tag: "${CIRCLE_BRANCH}" - -workflows: - version: 2 - oldfashion: - jobs: - - build - newfashion: - jobs: - - build_phraseanet-setup: - context: "AWS London" - - build_phraseanet-fpm: - context: "AWS London" - - build_phraseanet-worker: - context: "AWS London" - - build_phraseanet-nginx: - context: "AWS London" - - build_phraseanet-db: - context: "AWS London" - - build_phraseanet-elasticsearch: - context: "AWS London" diff --git a/.circleci/config_old.yml b/.circleci/config_old.yml new file mode 100644 index 0000000000..eb448747f6 --- /dev/null +++ b/.circleci/config_old.yml @@ -0,0 +1,217 @@ +version: 2.1 +orbs: + aws-ecr: circleci/aws-ecr@6.15.0 + aws-cli: circleci/aws-cli@1.3.1 +executors: + docker_build: + machine: + docker_layer_caching: true +jobs: +# build: +# working_directory: ~/alchemy-fr/Phraseanet +# parallelism: 2 +# shell: /bin/bash --login +# environment: +# CIRCLE_ARTIFACTS: /tmp/circleci-artifacts +# CIRCLE_TEST_REPORTS: /tmp/circleci-test-results +# docker: +# - image: cimg/php:7.0.33-node +# - image: circleci/rabbitmq:3.7.7 +# steps: +# - checkout +# - run: php -v +# - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS +# - run: +# working_directory: ~/alchemy-fr/Phraseanet +# command: 'sudo apt update && sudo apt install mysql-server && sudo service mysql status || sudo service mysql start;' +# # Dependencies +# # This would typically go in either a build or a build-and-test job when using workflows +# # Restore the dependency cache +# - restore_cache: +# keys: +# # This branch if available +# - v2-dep-{{ .Branch }}- +# # Default branch if not +# - v2-dep-master- +# # Any branch if there are none on the default branch - this should be unnecessary if you have your default branch configured correctly +# - v2-dep- +# # This is based on your 1.0 configuration file or project settings +# - run: echo 127.0.0.1 redis elasticsearch db rabbitmq | sudo tee -a /etc/hosts +# - run: git clone https://github.com/alanxz/rabbitmq-c +# - run: cd rabbitmq-c && git checkout 2ca1774489328cde71195f5fa95e17cf3a80cb8a +# - run: cd rabbitmq-c && git submodule init && git submodule update && autoreconf -i && ./configure && make && sudo make install +# # disabled because pear.php.net is down cause of security failure +# #- run: pecl channel-update pear.php.net +# - run: sudo apt -y install openjdk-8-jre-headless python-dev-is-python2 php7.0-amqp php7.0-zmq php7.0-intl php7.0-sqlite3 libmagickwand-dev libmagickcore-dev +# - run: printf "\n" | sudo pecl install amqp-1.11.0beta +# - run: printf "\n" | sudo pecl install imagick +# - run: sudo -- bash -c "echo 'date.timezone = UTC' > /etc/php/7.0/mods-available/timezone.ini" +# - run: sudo sed -i 's/^\(session.cache_limiter = \).*/\1""/' /etc/php/7.0/cli/php.ini +# - run: sudo -- bash -c 'echo -e "[mysqld]\ndefault-authentication-plugin=mysql_native_password" > /etc/mysql/conf.d/mysql_native_password.cnf' && sudo service mysql restart +# - run: npm rebuild node-sass +# # This is based on your 1.0 configuration file or project settings +# - run: composer install --no-progress --no-interaction --optimize-autoloader +# - run: curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash +# - run: source ~/.profile && nvm install v10.12.0 && nvm alias default v10.12.0 +# # This is based on your 1.0 configuration file or project settings +# - run: node -v +# - run: npm -v +# - run: yarn install +# - run: if [[ ! -e elasticsearch-2.3.3 ]]; then wget --no-check-certificate https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-2.3.3.tar.gz && tar -xvf elasticsearch-2.3.3.tar.gz && elasticsearch-2.3.3/bin/plugin install analysis-icu; fi +# - run: +# command: elasticsearch-2.3.3/bin/elasticsearch +# background: true +# # Save dependency cache +# - save_cache: +# key: v2-dep-{{ .Branch }}-{{ epoch }} +# paths: +# # This is a broad list of cache paths to include many possible development environments +# # You can probably delete some of these entries +# - vendor/bundle +# - ~/virtualenvs +# - ~/.m2 +# - ~/.ivy2 +# - ~/.bundle +# - ~/.go_workspace +# - ~/.gradle +# - ~/.cache/bower +# # These cache paths were specified in the 1.0 config +# - elasticsearch-2.3.3 +# - node_modules +# - ~/.composer +# # This is based on your 1.0 configuration file or project settings +# - run: sudo mysql -u root -e "CREATE USER 'phraseanet'@'localhost' IDENTIFIED WITH mysql_native_password BY 'phraseanet';GRANT ALL PRIVILEGES ON * . * TO 'phraseanet'@'localhost';CREATE DATABASE update39_test;CREATE DATABASE ab_test;CREATE DATABASE db_test;SET @@global.sql_mode=STRICT_ALL_TABLES;SET sql_mode=STRICT_ALL_TABLES;SET @@global.max_allowed_packet=33554432;SET @@global.wait_timeout=999999;" +# # This is based on your 1.0 configuration file or project settings +# - run: ./bin/developer system:uninstall -v +# - run: ./bin/setup system:install -v --email=test@phraseanet.com --password=test --db-host=127.0.0.1 --db-user=phraseanet --db-template=fr-simple --db-password=phraseanet --databox=db_test --appbox=ab_test --server-name=http://127.0.0.1 -y; +# - run: ./bin/developer ini:setup-tests-dbs -v +# - run: ./bin/console searchengine:index:create -v +# - run: ./bin/developer phraseanet:regenerate-sqlite -v +# - run: ./bin/developer phraseanet:generate-js-fixtures -v +# # Test +# # This would typically be a build job when using workflows, possibly combined with build +# # This is based on your 1.0 configuration file or project settings +# - run: case $CIRCLE_NODE_INDEX in 0) EXIT=0; php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-unit.xml --exclude-group legacy || EXIT=$?; php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-legacy-no-web.xml --group legacy --exclude-group web || EXIT=$?; exit $EXIT;; 1) php -d memory_limit=-1 bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit-legacy-web.xml --group web ;; esac +# # Teardown +# # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each +# # Save test results +# - store_test_results: +# path: /tmp/circleci-test-results +# # Save artifacts +# - store_artifacts: +# path: /tmp/circleci-artifacts +# - store_artifacts: +# path: /tmp/circleci-test-results + + build_phraseanet-setup: + machine: + image: ubuntu-2004:202201-02 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build --target phraseanet-setup -t ${AWS_ACCOUNT_URL}/phraseanet-setup:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-setup" + tag: "${CIRCLE_BRANCH}" + + build_phraseanet-fpm: + machine: + image: ubuntu-2004:202201-02 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . + - 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-2004:202201-02 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet + steps: + - checkout + - run: git --no-pager log --graph --pretty=format:" %h %s %cn %ad " -n30 > www/gitlog.txt . + - 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-2004:202201-02 + 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}" + + build_phraseanet-db: + machine: + image: ubuntu-2004:202201-02 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet/ + steps: + - checkout + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build -f ./docker/db/Dockerfile -t ${AWS_ACCOUNT_URL}/phraseanet-db:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-db" + tag: "${CIRCLE_BRANCH}" + + build_phraseanet-elasticsearch: + machine: + image: ubuntu-2004:202201-02 + docker_layer_caching: true + working_directory: ~/alchemy-fr/Phraseanet/docker/elasticsearch + steps: + - checkout + - aws-ecr/ecr-login: + region: AWS_DEFAULT_REGION + - run: docker build -f ./docker/elasticsearch/Dockerfile -t ${AWS_ACCOUNT_URL}/phraseanet-elasticsearch:${CIRCLE_BRANCH} . + - aws-ecr/push-image: + account-url: AWS_ACCOUNT_URL + repo: "phraseanet-elasticsearch" + tag: "${CIRCLE_BRANCH}" + +workflows: + version: 2 +# oldfashion: +# jobs: +# - build +# newfashion: +# jobs: +# - build_phraseanet-setup: +# context: "AWS London" +# - build_phraseanet-fpm: +# context: "AWS London" +# - build_phraseanet-worker: +# context: "AWS London" +# - build_phraseanet-nginx: +# context: "AWS London" +# - build_phraseanet-db: +# context: "AWS London" +# - build_phraseanet-elasticsearch: +# context: "AWS London" diff --git a/.dockerignore b/.dockerignore index 0c8887c29d..5f7bf09347 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,6 +19,7 @@ !/bin/developer !/bin/setup !/bin/maintenance +!/bin/report /cache /config/configuration.yml /config/configuration-compiled.php diff --git a/.env b/.env index 1b30e36a9e..ff9d7bef3a 100644 --- a/.env +++ b/.env @@ -30,7 +30,9 @@ # datastores # - "docker-compose.phrasea.yml" : For integrate this stack in the "traefik" of Phrasea stack # +# - "docker-compose.limits.yml" : defines containers cpu and memory limits for all Phraseanet and gateway containers only. # +# - "docker-compose.altenatives.yml": all alternative services, used only on evoluation or transition periods # # 2/ "COMPOSE_PROFILES" value define which profiles you want to use # in docker-compose. @@ -44,10 +46,11 @@ # - "gateway-traefik" : nginx is launched behind a traefik service, the traefik is include in this stack (todo) # or Traefik include in Phrasea Stack. # - "workers" : launch one worker container by kind of Jobs, you can also -# choose to launch only some workers, see worker list below. +# choose to launch only some workers, see worker profile list below. # - "worker" : launch one container worker with all jobs run on it. -# - "db" : launch a mariadb container, because this is the primary -# datastore for production usage, use your own service. +# - "cmd" : launch a container based on worker image, useful for run cmd manualy. +# - "db" : db profile will launch a mariadb container, +# because this is the primary datastore, you should use you own SGDD service for production needs. # - "elastisearch" : launch a elasticsearch container. # - "rabbitmq" : launch a rabbitmq container. # - "redis" : launch a redis container for app cache. @@ -57,6 +60,8 @@ # - "squid" : reverse proxy for dev only. # - "mailhog" : for catching all email emit by app for dev. # - "db-backup" : launch and run a container to cron database backups and backup file's rotation. +# - "mysql8" : launch a mysql8 container (beta), (/!\ do not mix with the "db" profile) +# Because this is the primary datastore, you should use you own SGDD service for production needs. # # Profiles worker list: # - "assetsInjest" @@ -64,6 +69,7 @@ # - "deleteRecord" # - "editRecord" # - "exportMail" +# - "downloadAsync" # - "exposeUpload" # - "exportFtp" # - "mainQueue" @@ -71,7 +77,7 @@ # - "pullAssets" # - "recordsActions" # - "subdefCreation" -# - "subtitle" +# - "subtitle" Not working (fixed in a future version) # - "validationReminder" # - "webhook" # - "writeMetadatas" @@ -88,11 +94,15 @@ # # For development: # - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml:docker-compose.override.yml -# - COMPOSE_PROFILES=app,setup,db,pma,elasticsearch,redis,redis-session,rabbitmq,workers,mailhog,builder,gateway-classic +# - COMPOSE_PROFILES=app,setup,db,pma,elasticsearch,redis,redis-session,rabbitmq,workers,mailhog,builder,gateway-classic,cmd # -# For testing with debug: +# For testing with tools: # - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml -# - COMPOSE_PROFILES=app,setup,db,pma,elasticsearch,rabbitmq,redis,redis-session,worker,workers,mailhog,gateway-classic +# - COMPOSE_PROFILES=app,setup,db,pma,elasticsearch,rabbitmq,redis,redis-session,workers,cmd,mailhog,gateway-classic +# +# # To test with tools and apply resources throttling on Phraseanet containers : +# - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml:docker-compose.limits.yml +# - COMPOSE_PROFILES=app,setup,db,pma,elasticsearch,rabbitmq,redis,redis-session,workers,cmd,mailhog,gateway-classic # # For testing with debug and SSL (the traekik is provide by Phrasea stack): # - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml:docker-compose.under-phrasea.yml @@ -103,10 +113,10 @@ # - COMPOSE_PROFILES=app,setup,workers,gateway-traefik # # Example with all profiles: -# - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml +# - COMPOSE_FILE=docker-compose.yml:docker-compose.datastores.yml:docker-compose.tools.yml:docker-compose.limits.yml # - COMPOSE_PROFILES=app,setup,gateway-classic,db,elasticsearch,redis,redis-session,rabbitmq,pma,mailhog,assetsInjest,createRecord,deleteRecord,editRecord, -# exportMail,exposeUpload,exportFtp,mainQueue,populateIndex,pullAssets,recordsActions,subdefCreation, -# subtitle,validationReminder,webhook,writeMetadatas,shareBasket,scheduler,elk,db-backup,phraseanet-saml-sp +# exportMail,downloadAsync,exposeUpload,exportFtp,mainQueue,populateIndex,pullAssets,recordsActions,subdefCreation, +# validationReminder,webhook,writeMetadatas,shareBasket,scheduler,cmd,elk,db-backup,phraseanet-saml-sp # @@ -133,21 +143,36 @@ PHRASEANET_DOCKER_REGISTRY=local # Docker images tag. # @run -PHRASEANET_DOCKER_TAG=4.1.7-rc3 +PHRASEANET_DOCKER_TAG=4.1.8 # Stack Name # An optionnal Name for the stack # @run STACK_NAME= +# --- Phraseanet containers resources limit settings ------------------------------------------------------------------------------------ + +WORKER_CPU=2 +GATEWAY_CPU=2 +FPM_CPU=2 +WORKER_MEMORY_LIMIT=2048M +GATEWAY_MEMORY_LIMIT=2048M +FPM_MEMORY_LIMIT=2048M +WORKER_MEMORY_RESERVATION=256M +GATEWAY_MEMORY_RESERVATION=256M +FPM_MEMORY_RESERVATION=256M + # --- Phraseanet container network settings ------------------------------------------------------------------------------------ # Phrasea network Name, the name of Phrasea network and see by traefik # @run PHRASEA_NETWORK_NAME=ps_internal - +# @run PHRASEA_DOMAIN=phrasea.local +# @run PHRASEA_GATEWAY_IP=172.30.0.1 +# @run +PHRASEA_COMPOSE_PROJECT_NAME=ps # --- Phraseanet container entrypoint settings ------------------------------------------------------------------------- @@ -167,15 +192,51 @@ PHRASEANET_SETUP=1 # @run PHRASEANET_UPGRADE=0 -# Activate maintenance mode -# show an nginx unavailability mressage -# Avalaible values: "0" | "1" | "2" +# Maintenance mode +# show an nginx unavailability message +# Available values: "0" | "1" # 0 - for no maintenance mode -# 1 - for maintenance mode during setup execution -# 2 - for persisting maintenance mode +# 1 - for persisting maintenance mode +# During an upgrade, the unavailability message is automatically activated with a default message +# "We are performing scheduled maintenance and will be back online in a few minutes." # @run PHRASEANET_MAINTENANCE=0 +# Customize the maintenance message +# this is possible to customize the displayed maintenance message. +# Note: space needs to be encoded with space html character, quote and double quote need to be escaped +# Example : +# PHRASEANET_MAINTENANCE_MESSAGE="
Under maintenance!
More information here
" +# @run +PHRASEANET_MAINTENANCE_MESSAGE= + +# Activate restrictions +# restrictions can be based +# on IP and/or password +# configuration exemple : +# GATEWAY_ALLOWED_IPS=10.0.0.1,10.0.1.1 +# GATEWAY_DENIED_IPS=172.1.0.1,172.1.0.2 +# GATEWAY_USERS="user1:password1,user2:password2" +# @run +GATEWAY_ALLOWED_IPS= +# @run +GATEWAY_DENIED_IPS= +# @run +GATEWAY_USERS= + +# https and reverse proxy (on/off) +# set to on in the case : https behind a proxy +# @run +GATEWAY_FASTCGI_HTTPS=off + +# Content Security Policy (CSP) +# helps to detect and mitigate some types of attacks, including Cross-Site Scripting (XSS). +# CSP default values are included in the "Gateway" container entrypoint. +# Use GATEWAY_CSP env var if you want to define yours and/or override Gateway CSP values. +# GATEWAY_CSP="default-src 'self' 127.0.0.1 https://sockjs-eu.pusher.com:443 wss://ws-eu.pusher.com https://apiws.carrick-skills.com:8443 https://apiws.carrick-flow.com:8443 https://fonts.gstatic.com *.tiles.mapbox.com https://api.mapbox.com https://events.mapbox.com *.axept.io *.matomo.cloud *.newrelic.com *.nr-data.net https://www.googletagmanager.com *.google-analytics.com *.phrasea.io https://apiws.carrick-flow.com:8443 https://apiws.carrick-skills.com:8443 https://maxcdn.bootstrapcdn.com data: ; script-src 'unsafe-inline' 'unsafe-eval' 'self' https://www.gstatic.com *.alchemyasp.com *.axept.io *.matomo.cloud *.newrelic.com https://www.googletagmanager.com https://apiws.carrick-flow.com:8443 https://apiws.carrick-skills.com:8443 https://maxcdn.bootstrapcdn.com data: blob: ; style-src 'self' 'unsafe-inline' https://fonts.gstatic.com https://fonts.googleapis.com https://www.google.com https://www.gstatic.com https://apiws.carrick-flow.com:8443 https://apiws.carrick-skills.com:8443 https://maxcdn.bootstrapcdn.com ; img-src 'self' data: blob: *.tiles.mapbox.com https://axeptio.imgix.net *.cloudfront.net *.phrasea.io *.amazonaws.com https://apiws.carrick-flow.com:8443 https://apiws.carrick-skills.com:8443 https://maxcdn.bootstrapcdn.com https://www.gnu.org/graphics/ ; object-src 'self'; frame-ancestors 'self'" +# @run +GATEWAY_CSP= + # --- RabbitMQ settings ------------------------------------------------------------------------------------------------ # RabbitMQ user account : create an account in RabbitMQ container and use it @@ -191,7 +252,9 @@ RABBITMQ_DEFAULT_PASS=vdh4dpe5Wy3R # @run RABBITMQ_MANAGEMENT_PORT=10811 - +# rabbit hostname, need also for the name of rabbit database dir to avoid random name after dc down/up +# @run +RABBITMQ_HOSTNAME=rabbit_phraseanet # --- Gateway settings (nginx) ----------------------------------------------------------------------------------------- @@ -240,6 +303,12 @@ MAX_INPUT_TIME=60 # @run REQUEST_TERMINATE_TIMEOUT=300s +# Maximum amount of memory a script may consume (128MB) +# http://php.net/memory-limit +FPM_MEMORY_LIMIT=2048M +PHP_CLI_MEMORY_LIMIT=2048M + + # Php Opcache status. See [opcache Php documentation| # https://www.php.net/manual/en/intro.opcache.php]. # Avalaible values: "0" | "1" @@ -260,10 +329,55 @@ PHP_LOG_LEVEL=warning # PHP Handler used to store/retrieve data. # http://php.net/session.save-handler -# session handler can be "files" and path must be than +# session handler can be "files" and path must be than +# @run SESSION_SAVE_HANDLER=redis +# @run SESSION_SAVE_PATH=tcp://redis-session:6379 +# PHP session cookies to be secured +# only works if the application is under ssl protection +# @run +COOKIE_SECURE=false + +# FPM +# Choose how the process manager will control the number of child processes. +# Possible Values: +# static - a fixed number (pm.max_children) of child processes; +# dynamic - the number of child processes are set dynamically based on the +# @run +FPM_PM_TYPE=dynamic + +# FPM +# The number of child processes to be created when pm is set to 'static' and the +# maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +# @run +FPM_MAXCHILDREN=9 + +# FPM +# The number of child processes created on startup. +# Note: Used only when pm is set to 'dynamic' +# @run +FPM_STARTSERVERS=3 + +# FPM +# The desired minimum number of idle server processes. +# Note: Used only when pm is set to 'dynamic' +# Note: Mandatory when pm is set to 'dynamic' +# @run +FPM_MINSPARESERVER=2 + +# FPM +# The desired maximum number of idle server processes. +# Note: Used only when pm is set to 'dynamic' +# Note: Mandatory when pm is set to 'dynamic' +# @run +FPM_MAXSPARESERVER=4 + +# FPM +# The number of requests each child process should execute before respawning. +# @run +FPM_MAX_REQUESTS=1000 # --- MySQL settings --------------------------------------------------------------------------------------------------- @@ -339,22 +453,46 @@ DB_BACKUP_INIT_RESTORE_LATEST=0 # Every day at 03:00 # @run #DB_BACKUP_CRON_TIME=0 3 * * +DB_BACKUP_CRON_TIME= # Make it small # @run DB_BACKUP_GZIP_LEVEL=9 +# --- Pusher settings -------------------------------------------------------------------------------------- + +# Pusher settings used when PHRASEANET_DOWNLOAD_ASYNC=true (configuration.yml: download_async / enabled=true) +# @run +PUSHER_AUTH_KEY + +# pusher secret +# @run +PUSHER_SECRET + +# pusher app_id +# @run +PUSHER_APP_ID + + # --- Application cache settings --------------------------------------------------------------------------------------------------- # Cache setting type can be "redis" or "arraycache" # @run -# @install - PHRASEANET_CACHE_TYPE=redis +# @run PHRASEANET_CACHE_HOST=redis +# @run PHRASEANET_CACHE_PORT=6379 +# PHP session management : this must be related to the SESSION_SAVE_HANDLER parameter. type can be redis, file or native +# @run +PHRASEANET_SESSION_TYPE=redis +# @run +PHRASEANET_SESSION_HOST=redis-session +# @run +PHRASEANET_SESSION_PORT=6379 + # --- Phraseanet general settings -------------------------------------------------------------------------------------- # Variables below are used in the "configuration.yml" file: @@ -376,9 +514,10 @@ PHRASEANET_PROJECT_NAME=Phraseanet # An non declarative variable is generated for other uses needed for deploiment (helm for exemple) # Domain name used by traefik in Phrasea stack # @run -# @install PHRASEANET_HOSTNAME=phraseanet.phrasea.local +# @run PHRASEANET_SCHEME=http +# @run PHRASEANET_APP_PORT=8082 # Variables below used to define the first user / email couple : @@ -394,7 +533,14 @@ PHRASEANET_ADMIN_ACCOUNT_EMAIL=admin@alchemy.fr # @run PHRASEANET_ADMIN_ACCOUNT_PASSWORD=iJRqXU0MwbyJewQLBbra6IWHsWly +# Use Pusher to enable async download. +# @run +PHRASEANET_DOWNLOAD_ASYNC=false +# User Session duration settings +# @run +PHRASEANET_USER_SESSION_IDLE=14400 +PHRASEANET_USER_SESSION_LIFETIME=86400 # --- Phraseanet MySQL settings ---------------------------------------------------------------------------------------- @@ -429,7 +575,7 @@ INSTALL_DATABOX=db_databox1 # Available languages (list of language code separated by comma). # @run -PHRASEANET_AVAILABLE_LANGUAGE=fr,en,de,du +PHRASEANET_AVAILABLE_LANGUAGE=de,en,fr,nl # Default language code. # @run @@ -479,22 +625,34 @@ PHRASEANET_RABBITMQ_VHOST=/ PHRASEANET_RABBITMQ_HEARTBEAT=30 # --- Phraseanet Elasticsearch settings ------------------------------------------------------------------------------------- - -# @setup - +# They env variables are only used during installation process, edit configuration.yml file or use phraseanet admin GUI to modify them +# @install PHRASEANET_ELASTICSEARCH_HOST=elasticsearch +# @install PHRASEANET_ELASTICSEARCH_PORT=9200 +# @install PHRASEANET_ELASTICSEARCH_INDEX=null +# @install PHRASEANET_ELASTICSEARCH_SHARD=3 +# @install PHRASEANET_ELASTICSEARCH_REPLICAS=0 +# @install PHRASEANET_ELASTICSEARCH_MINSCORE=2 +# @install PHRASEANET_ELASTICSEARCH_HIGHLIGHT=true +# @install PHRASEANET_ELASTICSEARCH_MAXRESULTWINDOW=500000 -PHRASEANET_ELASTICSEARCH_POPULATEORDER=MODIFICATION_DATE +# @install +PHRASEANET_ELASTICSEARCH_POPULATEORDER=RECORD_ID +# @install PHRASEANET_ELASTICSEARCH_ACTIVETAB=null +# @install PHRASEANET_ELASTICSEARCH_FACET_BASE=10 +# @install PHRASEANET_ELASTICSEARCH_FACET_COLLECTION=10 +# @install PHRASEANET_ELASTICSEARCH_FACET_DOCTYPE=10 +# @install PHRASEANET_ELASTICSEARCH_FACET_ORIENTATION=10 @@ -625,6 +783,9 @@ PHRASEANET_WORKER_editRecord=2 # @run PHRASEANET_WORKER_exportMail=2 +# @run +PHRASEANET_WORKER_downloadAsync=2 + # @run PHRASEANET_WORKER_exposeUpload=2 @@ -661,7 +822,9 @@ PHRASEANET_WORKER_writeMetadatas=1 # @run PHRASEANET_WORKER_shareBasket=1 - +# PHRASEANET_CMD_MODE=1, set a worker container for run bin/console... or bin/maintenance... manualy +# @run +PHRASEANET_CMD_MODE # --- Phraseanet Locales settings -------------------------------------------------------------------------------------- @@ -735,7 +898,11 @@ PHRASEANET_CAPTION_DIR=./tmp/caption # @run PHRASEANET_WORKER_TMP=./tmp/worker +# @run +PHRASEANET_BACKUP_DIR=./backup +# @run +PHRASEANET_FTP_DIR=./ftp # --- Phraseanet plugin support settings ------------------------------------------------------------------------------- @@ -749,25 +916,25 @@ PHRASEANET_SSH_PRIVATE_KEY= # --- ImageMagick default policy override setting ---------------------------------------------------------------------- # @run -IMAGEMAGICK_POLICY_VERSION=6 +IMAGEMAGICK_POLICY_VERSION=7 # @run -IMAGEMAGICK_POLICY_WIDTH=16KP +IMAGEMAGICK_POLICY_WIDTH=48KP # @run -IMAGEMAGICK_POLICY_HEIGHT=16KP +IMAGEMAGICK_POLICY_HEIGHT=48KPP # @run -IMAGEMAGICK_POLICY_MAP=512MiB +IMAGEMAGICK_POLICY_MAP=2048MiB # @run -IMAGEMAGICK_POLICY_MEMORY=256MiB +IMAGEMAGICK_POLICY_MEMORY=2048MiB # @run -IMAGEMAGICK_POLICY_AREA=128MB +IMAGEMAGICK_POLICY_AREA=4096MB # @run -IMAGEMAGICK_POLICY_DISK=1GiB +IMAGEMAGICK_POLICY_DISK=6GiB # @run IMAGEMAGICK_POLICY_TEMPORARY_PATH=/tmp @@ -786,23 +953,6 @@ NEWRELIC_LICENSE_KEY= # @run NEWRELIC_APP_NAME= - - -# --- Blackfire settings ----------------------------------------------------------------------------------------------- - -# In developpement mode, Enable (or not) the "Blackfire" agent for -# plateform monitoring. -# @run -BLACKFIRE_ENABLED=false - -# @run -BLACKFIRE_SERVER_ID= - -# @run -BLACKFIRE_SERVER_TOKEN= - - - # --- Development purpose ---------------------------------------------------------------------------------------------- # See [Phraseanet development-mode documentation| @@ -844,10 +994,12 @@ PHRASEANET_FTP_DIR=./datas/ftp # # For dev who don't have SSH_AUTH_SOCK (avoid an empty volume name) +# @run SSH_AUTH_SOCK=/dev/null # Kubernet context needs full pod hosname on nginx reverse proxing # This is need for PHraseanet SAML context on K8S +# @run PHRASEANET_K8S_NAMESPACE= # @@ -855,11 +1007,17 @@ PHRASEANET_K8S_NAMESPACE= # simplesamlphp as service provider for Phraseanet # must be associated to a plugin # on docker-compose staxk add the profile phraseanet-saml-sp - +# @run SAML_ALLOW_DEBUG=true +# @run SAML_PHRASEANET_HOST=http://127.0.0.1:8082 +# @run SAML_SP_CONFIG_DIR=./saml-config/ +# @run SAML_SP_AUTHSOURCES= +# @run SAML_SP_CERT_DIR=./saml-cert/ +# @run SAML_IDP_METADATA_CONFIG= +# @run SAML_IDP_METADATA_LOCAL_CONFIG_DIR=./saml-metadata/ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..7d90ec997a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,74 @@ +name: Build and push image and image-layer cache + +on: + workflow_call: + inputs: + image: + required: true + type: string + context: + required: true + type: string + file: + required: true + type: string + target: + required: true + type: string + +env: + PHRASEANET_DOCKER_TAG: ${{ github.head_ref }} + DEFAULT_REGISTRY: ghcr.io/${{ github.repository_owner }} + CACHE_REGISTRY: ghcr.io/${{ github.repository_owner }} + AWS_REGION: eu-west-2 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: Log into GitHub registry ${{ env.DEFAULT_REGISTRY }} + uses: docker/login-action@v2 + with: + registry: ${{ env.DEFAULT_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + with: + mask-password: 'true' + + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 + + - name: Get tag name + if: github.event_name != 'pull_request' + shell: bash + run: echo "PHRASEANET_DOCKER_TAG=${{ github.ref_name }}" >> $GITHUB_ENV + + - name: build ${{ inputs.image }} + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + uses: docker/build-push-action@v6 + with: + context: ${{ inputs.context }} + file: ${{ inputs.file }} + provenance: false + push: true + cache-from: type=registry,ref=${{ env.CACHE_REGISTRY }}/${{ inputs.image }}:build-cache + cache-to: type=registry,mode=max,ref=${{ env.CACHE_REGISTRY }}/${{ inputs.image }}:build-cache + target: ${{ inputs.target }} + tags: | + ${{ env.DEFAULT_REGISTRY }}/${{ inputs.image }}:${{ env.PHRASEANET_DOCKER_TAG }} + ${{ env.ECR_REGISTRY }}/${{ inputs.image }}:${{ env.PHRASEANET_DOCKER_TAG }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..a1e569d451 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,127 @@ +name: CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: + - master + +env: + PHRASEANET_DOCKER_TAG: ${{ github.head_ref }} + REGISTRY: ghcr.io/${{ github.repository_owner }} + CACHE_REGISTRY: ghcr.io/${{ github.repository_owner }} + +jobs: + build-phraseanet-setup: + name: 'build phraseanet-setup' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-setup + context: . + file: ./Dockerfile + target: phraseanet-setup + secrets: inherit + + build-phraseanet-nginx: + name: 'build phraseanet-nginx' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-nginx + context: . + file: ./Dockerfile + target: phraseanet-nginx + secrets: inherit + + build-phraseanet-fpm: + name: 'build phraseanet-fpm' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-fpm + context: . + file: ./Dockerfile + target: phraseanet-fpm + secrets: inherit + + build-phraseanet-worker: + name: 'build phraseanet-worker' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-worker + context: . + file: ./Dockerfile + target: phraseanet-worker + secrets: inherit + + build-phraseanet-db: + name: 'build phraseanet-db' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-db + context: ./docker/db + file: ./docker/db/Dockerfile + target: '' + secrets: inherit + + build-phraseanet-elasticsearch: + name: 'build phraseanet-elasticsearch' + uses: ./.github/workflows/build.yml + with: + image: phraseanet-elasticsearch + context: ./docker/elasticsearch + file: ./docker/elasticsearch/Dockerfile + target: '' + secrets: inherit + + + test: + name: 'unit test' + runs-on: ubuntu-latest + needs: + - build-phraseanet-setup + - build-phraseanet-nginx + - build-phraseanet-fpm + - build-phraseanet-worker + - build-phraseanet-db + - build-phraseanet-elasticsearch + + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: Log into registry ${{ env.REGISTRY }} + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get tag name + if: github.event_name != 'pull_request' + shell: bash + run: echo "PHRASEANET_DOCKER_TAG=${{ github.ref_name }}" >> $GITHUB_ENV + + - name: install + run: | + PHRASEANET_DOCKER_REGISTRY=${{ env.REGISTRY }} PHRASEANET_DOCKER_TAG=${{ env.PHRASEANET_DOCKER_TAG }} docker compose pull + PHRASEANET_DOCKER_REGISTRY=${{ env.REGISTRY }} PHRASEANET_DOCKER_TAG=${{ env.PHRASEANET_DOCKER_TAG }} docker compose up -d + + - name: init tools test + run: | + docker compose exec -T -e PHRASEANET_BASE_URL=http://127.0.0.1 phraseanet docker/phraseanet/setup/init-test-install.sh + + - name: test exclude-group legacy + run: | + docker compose exec -T phraseanet bin/console system:clear-cache + docker compose exec -T phraseanet php -d memory_limit=-1 vendor/phpunit/phpunit/phpunit --exclude-group legacy + + - name: test group legacy and exclude-group web + run: | + docker compose exec -T phraseanet bin/console system:clear-cache + docker compose exec -T phraseanet php -d memory_limit=-1 vendor/phpunit/phpunit/phpunit --group legacy --exclude-group web + + - name: test group web + run: | + docker compose exec -T phraseanet bin/console system:clear-cache + docker compose exec -T phraseanet php -d memory_limit=-1 vendor/phpunit/phpunit/phpunit --group web diff --git a/.gitignore b/.gitignore index b741b4c0de..d33424b147 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,14 @@ # Exclude log folder /logs +# Exclude backup folder +/backup +!/backup/.gitkeep + +# Exclude ftp folder +/ftp +!/ftp/.gitkeep + # Exclude plugin folder /plugins # Excluse assets plugin folder @@ -51,6 +59,7 @@ !/bin/developer !/bin/setup !/bin/maintenance +!/bin/report # Exclude composer composer.phar diff --git a/CHANGELOG.md b/CHANGELOG.md index c2d90cf8e0..9b385d77d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,628 @@ # CHANGELOG +## 4.1.8 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, run by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + +- This a final release of 4.1.8 +- expose-cli : search publication +- expose-cli : label fields override sent to Expose assets description +- expose-cli : refresh token interval is taken into account for access token +- expose-cli: asset description sends webvtt with language tag +- multi metadata source for bin/console `records:rescan-files-metadata` +- auto canceling worker jobs started from 48 hours - cancellation by the record edit worker +- minor fixes + +### Stack (docker compose and helm) + + - Build of Phraseanet image has been updated with a "Phraseanet base image" available on dockerhub + + +## What's Changed +* PHRAS-4058 Admin - workermanager default filter since 3 days by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4507 +* PHRAS-4064 Fix worker plugin install as app by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4508 +* PHRAS-4042 Fix language in webvtt field uploaded to expose by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4510 +* PHRAS-4065 Worker record-actions compute date error by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4511 +* PHRAS-4068 Prod - expose-cli - field mapping - store a field label in expose mapping configuration by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4514 +* PHRAS-4068 Expose fix field mapping bc break by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4517 +* PHRAS-4063 Phraseanet - Keycloack - refresh token implementation for expose-cli by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4512 +* PHRAS-4070 Rescan meta multi sources in bin/console records:rescan-files-metadata by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4516 +* PHRAS-4069 Prod - expose cli - search publication and parent publication by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4515 +* PHRAS-4069 Translation for publication search by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4519 +* PHRAS-4073 Register form - improvement - html sanitization by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4520 +* PHRAS-4067 Admin - dashboard - 500 error by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4513 +* PHRAS-4062 Admin users delete and request improvement by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4509 +* PHRAS-4018 Admin- inspector - delete application by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4521 +* PHRAS-4056 Fix non escaped path error in sed by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4524 +* PHRAS-4077 bin/report : add group by field into download reports by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4525 + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc12...4.1.8 + +___ +## 4.1.8-rc12 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, ran by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - OpenId SSO support + - Bug fix + - Record log doc improvement report + +### Stack (docker compose and helm) + + - Redis native session support + +## What's Changed +* PHRAS-4041:Prod - matomo - Field display - improve rendering of Matomomediametrics by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4497 +* PHRAS-3416 Local for worker jobs by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4499 +* PHRAS-4056 Change imagemagick version and config file path by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4500 +* PHRAS-4049 Memory allocation error - validation reminder worker in a cron job - Allowed memory size by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4495 +* PHRAS-4042 Multilingue webvtt sent to expose by @4rthem in https://github.com/alchemy-fr/Phraseanet/pull/4502 +* PHRAS-4060 Webhook - error - stay in running status by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4506 +* PHRAS-4059 Prod - user account - application cannot be deleted by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4503 +* PHRAS-4053 Redis native session support by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4505 +* PHRAS-4045 Log - stdout - fix error on worker passed to igorw\get_in() by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4496 +* PHRAS-3960 bin/console clean:user - user deletion issue on --usertype=appowner by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4494 +* PHRAS-4057 Log_doc - report mark as "cancel" for running_job entry by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4501 +* PHRAS-4007 Auth provider - add keycloak provider - openid by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4462 + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc11...4.1.8-rc12 +___ +## 4.1.8-rc11 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, ran by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - Fix plugin install in new base image + - Minor fix + +### Stack (docker compose and helm) + + - Build of Phraseanet image has been updated with a "Phraseanet base image" available on dockerhub + +## What's Changed +* PHRAS-4005 fix missing plugin installation by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4490 +* PHRAS-3416 localisation by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4488 +* PHRAS-4033 fix timeline history for writemetadata and subdefinition by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4491 +* PHRAS-4033 fix timeline icone position by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4492 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc10...4.1.8-rc11 +___ +## 4.1.8-rc10 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, ran by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - Prod (GUI), Built subdefinition and write metadata now appear in record history + - Os Version bump in Phraseanet container to Debian 11 + - Minor Fix + +### Stack (docker compose and helm) + + - Build of Phraseanet image has been updated with a "Phraseanet base image" available on dockerhub + +## What's Changed +* PHRAS-4039 Webhook - enrich the webhook answer by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4485 +* PHRAS-4031 Prod - Upload - quarantaine tab - substitued image remains in the interface by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4486 +* PHRAS-4005 - update containers os by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4464 +* PHRAS-4038 : Phraseanet - 403 on two prod pages opened simutaniously by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4484 +* PHRAS-4033 Log_docs - log subdefinition build and write metadata - WorkerRunningJobs by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4482 +* PHRAS-3416 translation for 4.1.8-rc10 by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4487 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc9...4.1.8-rc10 + +___ +## 4.1.8-rc9 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, run by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - Prod GUI, displayed facets improvements + - Fix session duration in redis + - Object inspector improvement + - Fix collation for MYSQL8 + +### Stack (docker compose and helm) + + - Add a new docker compose configuration files `docker-compose-alternatives.yml `to extend testing capabilities + - Add mysql8 profiles in docker-compose, for alternatives SGBD for testing. + +## What's Changed +* PHRAS-3975 : Prod - Facets - Facets' values are truncated at the 20th character-extend by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4459 +* PHRAS-4011 : Moving cmd from console to setup - system:clear-cache system:clear-session by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4460 +* PHRAS-4000 : Write meta in subdefinition - DPI define in subdefinition setting is not written by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4461 +* PHRAS-4012 : bin/console records:writemetadatas by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4463 +* PHRAS-4019: Session expires with the php default value by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4466 +* PHRAS-4022 setup optim by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4467 +* PHRAS-4018: admin - object inspector - more informations about a record by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4465 +* PHRAS-4018_object_inspector_translate by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4468 +* PHRAS-4024: worker - job in error - filling finished column by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4469 +* PHRAS-4025_RecordsActionsWorker-setfield by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4470 +* PHRAS-4019: fix destroy redis session handler by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4471 +* PHRAS-4021: Api - migration script - instance_id - monitor endpoint improvement by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4472 +* PHRAS-4028 Emited webhook content-type application/json by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4474 +* PHRAS-4026 : js error on "change password" by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4475 +* PHRAS-4018: admin inspector log_docs by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4476 +* PHRAS-4010 Add mysql8 as alternative datastore by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4477 +* PHRAS-4010 Fix collation with mysql8 by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4479 +* PHRAS-4028 webhook in POST by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4480 +* PHRAS-4023 hcaptcha in Phraseanet by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4473 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc8...4.1.8-rc9 + +___ +## 4.1.8-rc8 + +### Update instructions + +- Migration patch: + - Migration script for configuration file + + `bin/setup system:upgrade`, ran by setup container with Docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - Phraseanet translator thesaurus based improvement + - Photo editor plugin improvement this is now possible to define crop preset setting by databox + - documentary field can be restricted to a suggested values and thesaurus + +### Stack (docker compose and helm) + + - CSP move source of values source from to gateway container, now .env (docker compose) and values (helm) are only for override them + - Download async add setup to Helm + - Helm deploiement include in this repository is deprecated, the new offical source is here https://github.com/alchemy-fr/alchemy-helm-charts-repo/tree/main/charts/phraseanet + - New optional docker-compose file for limiting phraseanet's containers host resources usage with docker compose + +## What's Changed +* PHRAS-3942 fix typo .env documentation by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4404 +* PHRAS-3943_download-report-tabnames by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4406 +* PHRAS-3946_download-async-one-file by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4408 +* PHRAS-3940 translator-group-jobs by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4409 +* PHRAS-3917 Prod - home redirection when session end - catch more 403 by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4399 +* PHRAS-3770 quarantine-enhancement by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4352 +* PHRAS-3949_photo-editor-cant-save by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4411 +* PHRAS-3950 bin/maintenance clean never connected users by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4412 +* PHRAS-3668 happyscribe autosubtitle by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4405 +* PHRAS-3770: generate translation by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4414 +* PHRAS-3416 phraseanet localization by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4415 +* PHRAS-3668 subtitle notification by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4416 +* PHRAS-3520_stamper-enhance by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4385 +* PHRAS-3668 fix incomplete translation by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4418 +* Phras 3416 phraseanet localization by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4419 +* PHRAS-3945 move pusher configuration by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4413 +* PHRAS-3966 admin - users list - add filter for "users with api application" by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4422 +* PHRAS-3966 admin users filter translation by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4424 +* PHRAS-2069 rescan file metadata command by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4420 +* PHRAS-3945 download async config change by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4423 +* PHRAS-3944_malformed-web-vtt by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4407 +* PHRAS-3958_download-one-asset by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4425 +* PHRAS-3777: Cleanup of old keys in configuration.yml - migration patch by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4427 +* PHRAS-3768_feedback-report-per-record by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4421 +* PHRAS-3777 clean unused setting in configuration.yml by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4429 +* PHRAS-3947: Prod - Editing - restrict field content to thesaurus and or suggested values by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4426 +* PHRAS-3967: Translator - Move translator configuration in config/configuration.yml by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4428 +* PHRAS-3997 translation field content restriction option by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4432 +* PHRAS-3976_quickfix_418RC8PHRAS3768 by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4435 +* PHRAS-3195 : Stop to generate metadata writing event on story creation or representation definition by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4433 +* PHRAS-3520 : patch for stamp by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4434 +* PHRAS-3976 BasketElements table add column and index by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4436 +* PHRAS-3957: editing: search in thesaurus, from the th zone by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4430 +* PHRAS-3980 custom worker by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4438 +* PHRAS-3981_create-field-fails by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4439 +* PHRAS-3980 cmd container by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4440 +* PHRAS-3982_report-feedback-enhance by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4441 +* PHRAS-3978 phraseanet translation by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4442 +* PHRAS-3974_stamper-enhance-2 by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4437 +* PHRAS-3988_feedback-report-same-record by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4444 +* PHRAS-3991: pre upgrade backup WIP by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4445 +* PHRAS-3979: fix bin/maintenance cleaner by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4443 +* PHRAS-3990_feedbackReport-stamper-doc by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4447 +* PHRAS-3996_legacy-download-remove-excel by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4449 +* PHRAS-3995: Admin - worker - job queue - average duration by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4448 +* PHRAS-3997 clear cache before play upgrade by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4451 +* PHRAS-3999: admin - databases - subdefinition - error 400 and 500 when create subdefinition by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4452 +* PHRAS-3994: clean user - email send to customer - date is wrong by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4446 +* PHRAS-3722 : bin/console records:build-subdef by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4450 +* PHRAS-3987_stamper-text-shadow by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4454 +* PHRAS-3993-fix-maintenance-mode : set as function by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4453 +* PHRAS-3416 phraseanet localization by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4455 +* PHRAS-3403 set docker containers resource limits by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4456 +* PHRAS-3955 release 4.1.8 rc8 by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4431 +* PHRAS-4006 : expose-cli should relog if refresh_token expire by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4457 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc7...4.1.8-rc8 + +___ +## 4.1.8-rc7 + +### Update instructions + +- Migration patch: + - Migration script for configuration file, (backup it is recommended). + - Doctrine migration for updating databases scheme, (backup it is recommended). + +`bin/setup system:upgrade`, ran by setup container with docker if env `PHRASEANET_UPGRADE=1 ` + +### Version summary + + - Matomo Media metrics integration. + - Phrasea Expose client improvements. + - CSRF Security fix. + - Substitution is now available for all sub definitions. + - SMTP, TLS 1.0 deprecation, TLS is now the version by default in version 1.2. + - When image contains transparency, background color can be forced to a specific color. + +### Stack (docker compose) + + - It is not possible to define Custom CSP + +### What's Changed + +* PHRAS-3914 Lightbox - mobile fix matomo url by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4377 +* PHRAS-3892 set content security policies (csp) as env vars by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4375 +* PHRAS-3852_tiff-background-color by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4376 +* PHRAS-3909 : Prod - Expose cli - load more publications - add pagination by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4379 +* PHRAS-3416 phraseanet-localization by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4380 +* PHRAS-3913 Prod - Shared Baskets - validation - Need to apply rights twice by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4378 +* PHRAS-3857 Check CSRF token on Prod and Admin forms by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4361 +* PHRAS-3061 Admin - subview definition - missmatch error between value set in form and slider limit by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4389 +* PHRAS-3894 : bin/maintenance clean: - Removing BETA prefix and Memory leak by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4391 +* PHRAS-3921 prod - expose-cli - became compatible with Phrasea V3 keycloak and fix by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4384 +* PHRAS-3929 Compose Set redis version For SAML container by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4390 +* PHRAS-3930 matomo media tracking by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4393 +* PHRAS-3921 expose-cli oauth token uri compatibility v2 v3 and asset title set by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4392 +* PHRAS-3933 prod - 403 "invalide search token" - after "video tools" openning by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4394 +* PHRAS-3922 show the button stop on phraseanet service pull process and feedback reminder by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4397 +* PHRAS-3928_download_async by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4386 +* PHRAS-3939 : fix order create basket by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4401 +* PHRAS-3900 Check TLS version use for email SMTP sending - TLS 1.0 of 1.1 deprecation by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4382 +* PHRAS-3931_phraseanet_local_id_in_api by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4400 +* PHRAS-3934 fix videotools subtitle timeline by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4398 +* PHRAS-3935 : phraseanet_local_id became instance_id by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4396 +* PHRAS-3918_subdef-substituable-setting by @jygaulier in https://github.com/alchemy-fr/Phraseanet/pull/4381 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc6...4.1.8-rc7 + +___ +## 4.1.8-rc6 + +### Update instructions + +- Migration patch: yes, so primary datastore require a backup before performing an update +- Elasticsearch index action : a "drop", "create", "populate" of elasticsearch index can be usefull. + +### Version summary + + - bugfix an minor improvement (todo) + +### Stack (docker compose) + + - PHP setting improvement + - FPM setting improvement + +### What's Changed + +* PHRAS-3893 prod - advanced search - control calendar missing for created_on and updated_on by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4360 +* PHRAS-3785 update composer dependencies for imagine by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4362 +* PHRAS-3252 Prod - Export - The captions are not being sent when doing an export by email by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4363 +* PHRAS-3387 php fpm optimization by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4364 +* PHRAS-3890: Admin - add "auth failure" - display and purge auth failure - only for super U by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4368 +* PHRAS-3903 Admin - object inspector - record index debug tools by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4369 +* PHRAS-3904 Add server port on fastcgi https conf by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4370 +* PHRAS-3416 phraseanet localization by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4371 +* PHRAS-3826 add mask password argument by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4372 +* PHRAS-3889 Worker - metadata write - mime/type whitelist - write metadatas only on whitelisted files by @aynsix in https://github.com/alchemy-fr/Phraseanet/pull/4366 +* PHRAS-3901 release version 4.1.8-rc6 by @nmaillat in https://github.com/alchemy-fr/Phraseanet/pull/4365 +* PHRAS-3910 fix redis php extension build by @moctardiouf in https://github.com/alchemy-fr/Phraseanet/pull/4373 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc5...4.1.8-rc6 + +___ +## 4.1.8-rc5 + +### Update instructions + +- Migration patch: no patch to play, just run upgrade for bump version +- Elasticsearch index action : none + +### Version summary + + - bugfix an minor improvement (todo) + +### Stack (docker compose) + + - Extend csp for GA-4 (todo) + +### What's Changed + +* PHRAS-3882 admin - workers - filter "consumed queue" in https://github.com/alchemy-fr/Phraseanet/pull/4347 +* PHRAS-3884 translation and advanced search field name in https://github.com/alchemy-fr/Phraseanet/pull/4348 +* PHRAS-3416 phraseanet localization in https://github.com/alchemy-fr/Phraseanet/pull/4350 +* PHRAS-3796 bin/setup check:system - download , lazaret, wrong repo is checked in https://github.com/alchemy-fr/Phraseanet/pull/4349 +* PHRAS-3851 Untranslated terms : in Notifications, Detailed View, Map by in https://github.com/alchemy-fr/Phraseanet/pull/4351 +* PHRAS-3416 phraseanet localization in https://github.com/alchemy-fr/Phraseanet/pull/4353 +* PHRAS-3887 google analytics 4 by in https://github.com/alchemy-fr/Phraseanet/pull/4354 +* PHRAS-3884 advanced search sort field by label by in https://github.com/alchemy-fr/Phraseanet/pull/4355 +* PHRAS-3870_record-action-example by in https://github.com/alchemy-fr/Phraseanet/pull/4334 +* PHRAS-3891 CSP policies for matomo cloud and newrelic by in https://github.com/alchemy-fr/Phraseanet/pull/4358 +* PHRAS-3891 adding CSP in https://github.com/alchemy-fr/Phraseanet/pull/4359 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc4...4.1.8-rc5 + +___ +## 4.1.8-rc4 + +### Update instructions + +- Migration patch: no patch to play, just run upgrade for bump version +- Elasticsearch index action : none + +### Version summary + +- bugfix an minor improvement + +### Stack (docker compose) + + - Extend csp for geolocalisation + + + ## What's Changed +* PHRAS-3877 Fix csp for geonames, mapbox , prod in https://github.com/alchemy-fr/Phraseanet/pull/4339 +* PHRAS-3878 fix jq to latest working commit by in https://github.com/alchemy-fr/Phraseanet/pull/4340 +* PHRAS-3881_browse-thesaurus-in-editing in https://github.com/alchemy-fr/Phraseanet/pull/4342 +* PHRAS-3876 Prod - Create - Story Title fix in https://github.com/alchemy-fr/Phraseanet/pull/4343 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc3...4.1.8-rc4 + +___ +## 4.1.8-rc3 + +### Update instructions + +- Migration patch: no patch to play, just run upgrade for bump version +- Elasticsearch index action : none + +### Version summary + +- bugfix an minor improvement + +### Stack (docker compose) + + - no change + +## What's Changed +* PHRAS-3859 fix gateway fastcgi https default value in https://github.com/alchemy-fr/Phraseanet/pull/4329 +* PHRAS-3860 bin/console user:edit in https://github.com/alchemy-fr/Phraseanet/pull/4328 +* PHRAS-3855 Prod - Facettes : color html tags in https://github.com/alchemy-fr/Phraseanet/pull/4330 +* PHRAS-3860 Sync phraseanet root account info in https://github.com/alchemy-fr/Phraseanet/pull/4331 +* PHRAS-3409: Prod - Edit : A user that have no right is bloqued when trying to edit in https://github.com/alchemy-fr/Phraseanet/pull/4332 +* PHRAS-3872 prod- printed pdf - title content encoding in https://github.com/alchemy-fr/Phraseanet/pull/4336 +* PHRAS-3873: prod -advance search - field , leave only label and real field name in https://github.com/alchemy-fr/Phraseanet/pull/4335 +* PHRAS-3869: secure locale cookie in https://github.com/alchemy-fr/Phraseanet/pull/4333 +* PHRAS-3874 Prod - tools - subdefinition tab - use subdefintion label in https://github.com/alchemy-fr/Phraseanet/pull/4337 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc2...4.1.8-rc3 + + +___ +## 4.1.8-rc2 + +### Update instructions : + +- Migration patch: no patch to play, just run upgrade for bump version +- Elasticsearch index action : none + +### Version summary : + +- Docker Nginx vhost, set security headers +- and allow secure cookies + +### Stack (docker compose, helm) + +It is now possible to use secure cookies with an env variable + + - `COOKIE_SECURE` true | false , true activates cookie secure when https is setup + +see .env + +## What's New +* PHRAS-3859 set security headers and allow secure cookies by in https://github.com/alchemy-fr/Phraseanet/pull/4324 +* PHRAS-3859 increased security with headers by in https://github.com/alchemy-fr/Phraseanet/pull/4325 + + +**Full Changelog**: https://github.com/alchemy-fr/Phraseanet/compare/4.1.8-rc1...4.1.8-rc2 + +___ +## 4.1.8-rc1 + +### Update instructions : + +- Migration patch: no patch to play, just run upgrade for bump version +- Elasticsearch index action : none + +### Version summary : + +- Auto-translate keywords using thesaurus : this feature is in beta + this features translating a field content using the thesaurus content + + +### Stack (docker compose, helm) + +It is now possible to define http access restriction based on 3 new environments variables + + - `GATEWAY_ALLOWED_IPS` , limit access to some IP addresses + - `GATEWAY_ALLOWED_IPS`, block access to some IP addresses + - `GATEWAY_USERS` add an http authentication + +see .env for setting example + +### Release notes - Phraseanet - 4.1.8-rc1 + + +### New Features + +``` +PHRAS-3805 Auto-translate keywords using thesaurus +``` + +### Improvements + +``` +PHRAS-3844 docker - gateway container \(nginx\) - http access restriction - IP address - user:password + +PHRAS-3845 prod - expose cli - subdef mapping - adding poster + +PHRAS-3846 Admin - database - add the "field id" in field detail + +PHRAS-3848 prod - order manager - cancel an order +``` + +___ +## 4.1.7 + +### Update instructions : + + - If you come from a 4.1.6 version : Nothing special except for the primary datastore backup before performing an update. + + - If you come from an earlier version : you need to manually perform a "drop", "create", "populate" of elasticsearch index. + +### Version summary : + - General improvement for the report and introducing bin/report for report export automation + - Authentication improvement in supporting multiple IDPs. + - Adding log cleaning feature + + +## Release notes - Phraseanet - 4.1.7 + + +### Stack (docker compose, helm) + + we have bumped minimal version for docker and docker compose. + the dc helper functionality is now compliant with docker compose (see readme). + +### New Features & Improvements + +``` +PHRAS-3297 Send an email to users once a year to get approval for accounts +PHRAS-2872 Phraseanet Authentication uses phrasea auth service as idp +PHRAS-2995 Add phraseanet-service as Oauth service provider for Phraseanet 4.1 +PHRAS-3694 bin/maintenance clean:users, add more parameters +PHRAS-3779 Prod - expose-cli - IDP integration +PHRAS-3728 Multiple SAML Idp support +PHRAS-3812 Docker-compose RabbitMQ define hostname and database name +PHRAS-3783 Prod - Order manager - Adding Download Expiration date +PHRAS-3804 Home - Acceptio Cookies consent provider integration - GDPR +PHRAS-3823 Report - bin/report a command line report generator +PHRAS-3828 bin/report and GUI Export databox content +PHRAS-1718 Bump recaptcha version +PHRAS-1974 Autodelete inactive users after a given period +PHRAS-3813 bin/maintenance clean databox's logs table +PHRAS-3819 Bin/maintenance clean webhook's log - WebhookEvents +PHRAS-3152 Bin/maintenance Cleaner for table "LazaretSessions" +PHRAS-3462 Bin/maintenance clean:apilog and clean:WorkerRunningJob - applicationbox +PHRAS-473 Prod - Advanced search - display fields labels and other improvements +PHRAS-2759 Report - Adding a feature in Report to display all documents sent by email +PHRAS-3318 Authentication : Saml Authentication in docker and kubernetes context +PHRAS-3596 Prod - Expose client - Filtering Expose publications and other GUI improvements +PHRAS-3598 Webhook - Emit improvement - Count and Log errors - stop to notify endpoint in error. +PHRAS-3683 Docker Compose - dc functionality improvement - support space in env value +PHRAS-3794 Install - elasticsearch configuration - \`populate\_order\` became \`MODIFICATION\_DATE\` by default +PHRAS-3798 bin/setup - system:config set - filtering sensitive credentials on stdout +PHRAS-3738 Admin - worker - job tab - Adding filter on databox , date, record_id +PHRAS-3754 Admin - user detail - more tab Record ACL, publications and baskets +PHRAS-3761 Admin - worker manager - jobs - running process - computation of current duration +PHRAS-3793 Shared baskets - Update record_right when a share expires +PHRAS-3802 Home - forgotten password - change end user message +PHRAS-3807 Border manager - lazaret - more default file extension lib/conf.d/configuration.yml +PHRAS-3816 Improvement of db index on WorkerRunningJob table +PHRAS-3821 Docker - Faster start for fpm and worker container +PHRAS-3822 Prod : Improve Image Watermarking +PHRAS-3825 Admin - worker manager - queue - add filter "Hide empty queues" +PHRAS-3826 ci - ci refactoring - migrate to github action +PHRAS-3827 Admin - users list - keep selection and page when validate or back in users edit +PHRAS-3739 Add JQ (php extension) to the stack +PHRAS-3764 Missing string - Check spelling for the pop up "empty collection" +PHRAS-3778 Docker - logs output optim for fpm, workers, scheduler, gateway +PHRAS-3830 Prod - advanced search - operator for field type number +PHRAS-3832 Report - download record list - improvement +PHRAS-3833 Report - export databox action and others fixes +PHRAS-3838 Prod - Expose - v2 - flatten assets break +PHRAS-3765 Oauth2 : allow to pass client custom parameters into session +``` + +### Bugs + + +``` +PHRAS-3702 Migration patch error 4.1.6-rc3 to 4.1.6-rc4 bin/setup system:upgrade always fail on basket table +PHRAS-2948 Quarantine checker - fix checker deactivation +PHRAS-3273 Prod - mapbox user pref - map\_zoom generates an error when is memorized by mapboxgl and read by mapboxJS +PHRAS-3569 Prod - video tools - sometimes an ERROR occurs about a record file type +PHRAS-3664 Prod - record moving between collections action : no retry on indexation failure +PHRAS-3757 Phraseanet - Phrasea Uploader - multivalued fields are merge in one value +PHRAS-3758 Prod - Baskets - Unable to start a feedback from the Action menu +PHRAS-3782 Preview "train" keyboard navigation crashes on page-1 +PHRAS-3785 Stamp is KO, resulting err500 in download +PHRAS-3791 SAML AUTHENTICATION : Log out generates an 500 error +PHRAS-3795 Prod - fix 404 on GET assets/common/css/fonts/icomoon.woff +PHRAS-3800 Prod - xss injection with filename +PHRAS-3806 ps-auth : Flushing rights when changing group is not working +PHRAS-3808 Prod - video tools - Hiding "video tools" menu item when user doesn't have this right +PHRAS-3811 docker-compose fix typo in writeMetadatas service profiles +PHRAS-3814 Share basket fix migration patch +PHRAS-3815 Prod - share basket - wrong object in sent email +PHRAS-3818 Prod- Expose cli - several fix +PHRAS-3824 xss on preview +PHRAS-3829 Prod - basket content - Design is broken for screen "set order" +PHRAS-3831 Admin - submit xml setting return an 500 error +PHRAS-3836 Admin - status bits name - fix character encoding +PHRAS-3837 Docker - fix image build +PHRAS-3820 Migration - fix migration patch 4.0 to 4.1.7 +PHRAS-3817 Webhook - created subdef - permalink is empty +PHRAS-3314 Prod - Expose - Publication with huge amount of assets - loading assets is very long - wrong UX +``` + +___ ## 4.1.6 ### Update instructions @@ -119,7 +742,7 @@ PHRAS-2646 Error in 4.1 a feedback with null or empty in Name PHRAS-3666 Prod - Print - PDF - Generated pdf can't be printed even if no password is defined ``` - +___ ## 4.1.6-rc2 ### Update instructions @@ -159,6 +782,7 @@ PHRAS-3651 prod-facets : tech facets "no value" wrongly translated, some always PHRAS-3655 Integrity constraint violation when deleting a user with an entry inside table ApiOauthCodes ``` +___ ## 4.1.6-rc1 ### Update instructions @@ -201,7 +825,7 @@ PHRAS-3619 After record removal, we have an HTTP status 200 on the /records rout PHRAS-3285 Thesaurus - candidat panel - The Stock is not available PHRAS-3628 API - create record - 500 error if No file ``` - +___ ## 4.1.5 ### Version summary : @@ -374,14 +998,14 @@ PHRAS-3411 Prod - String for Thesaurus as tx windows Note : For technical reasons, no Docker image and packaged version have been generated for the 4.1.4 version. Therefore, the release notes below concern both versions 4.1.4 and 4.1.5. - +___ # 4.1.4 ### Version summary : see upper 4.1.5 - +___ ## 4.1.3 Release notes - Phraseanet - Version 4.1.3 @@ -479,7 +1103,7 @@ Release notes - Phraseanet - Version 4.1.3 * [PHRAS-2873] - Phraseanet repositories reorganization * [PHRAS-3295] - Change method for Playing test (old fashion) on CircleCI with php7 - +___ ## 4.1.2 Release notes - Phraseanet - Version 4.1.2 @@ -539,7 +1163,7 @@ Release notes - Phraseanet - Version 4.1.2 * [PHRAS-3204] - Worker - Add reconnect to db when populate ended * [PHRAS-3181] - Worker video build subdefinition ends with error and tmp file is not copied to destination - +___ ## 4.1.1 ### Change summary @@ -611,6 +1235,7 @@ Release notes - Phraseanet - Version 4.1.2 * [PHRAS-2671] - Change behavior of preview display in audio file case * [PHRAS-2879] - Define facets order in GUI and query result +___ ## 4.0.12 Release notes - Phraseanet - Version 4.0.12 @@ -628,12 +1253,12 @@ Release notes - Phraseanet - Version 4.0.12 ### Bugfix * [PHRAS-2979] - The content of a story is not displayed even for users with appropriate on the collection - +___ ## 4.1.0 Pre release of 4.1 - +___ ## 4.0.11 Release notes - Phraseanet - Version 4.0.11 @@ -685,11 +1310,12 @@ Release notes - Phraseanet - Version 4.0.11 * [PHRAS-2912] - When updating a user informations the wrong field are populated (job and activity inverted) * [PHRAS-2811] - Cleanning of bad chars in candidats terms - +___ ## 4.0.10 Not publish - + +___ ## 4.0.9 ### Adds @@ -709,6 +1335,7 @@ Release notes - Phraseanet - Version 4.0.11 - PHRAS-2154 - Front - Bug on Chrome only - selected 1 document instead of all for the feedback. - PHRAS-2538 - Back - Some MP4 files were not correctly detected by Phraseanet. +___ ## 4.0.8 ### Adds: @@ -727,6 +1354,7 @@ Release notes - Phraseanet - Version 4.0.11 - List of fields was not refreshed in the exported fields section. - Push and Feedback fix error when adding a user when Geonames was not set (null value in Geonames). +___ ## 4.0.7 ### Adds: @@ -754,6 +1382,7 @@ Release notes - Phraseanet - Version 4.0.11 -Vagrant dev environment fix - Feedback: Sort assets “Order by best choice” has no effect +___ ## 4.0.3 ### Adds: @@ -781,6 +1410,7 @@ Release notes - Phraseanet - Version 4.0.11 - Dev: Fix API version returned in answer - Dev: Fix vagrant provisioning for Windows +___ ## 4.0.2 ### Adds: @@ -800,7 +1430,8 @@ Release notes - Phraseanet - Version 4.0.11 - Prod: fix field list in advanced search with Edge browser - Upload: fix 500 error when missing collection - Install wizard: fix error in graphical installer - + +___ ## 4.0.0 ### Adds: @@ -825,7 +1456,8 @@ Release notes - Phraseanet - Version 4.0.11 - Rewriting of the task scheduler based on the web sockets - Quarantine enhancement - Drag and drop upload - + +___ ## 3.8.8 (2015-12-02) - BugFix: Wrong BaseController used when no plugin installed. @@ -833,7 +1465,8 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix: all subdefs are shown when permalink is available in prod imagetools - BugFix: Empty labels are considered as valid - BugFix: Error 500 on prod imagetools when insufficient rights - + - +___ ## 3.8.7 (2015-11-09) - NewFeature: Adding public, temporary links (link generation based on JSON Web Token) @@ -868,6 +1501,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix: The "flatten" parameter when generating PDF thumbnails is not taken into account - Deprecation: Classic application is now obsolete +___ ## 3.8.6 (2015-01-20) - BugFix : Fixes the stories editing. When opening an editing form, the style applied to the notice doesn't match its selection @@ -923,6 +1557,7 @@ Release notes - Phraseanet - Version 4.0.11 - NewFeature : Adding a Vagrant VM (for developers and testers). The setup is quicker: development environments made easy. - NewFeature : Adding a command for the file generation crossdomain.xml depending on the configuration. +___ ## 3.8.5 (2014-07-08) - BugFix : Fix Flickr connexion throught Bridge Application @@ -936,6 +1571,7 @@ Release notes - Phraseanet - Version 4.0.11 - Enhancement : Add the possibility to choose a document or a video as a representative image of a story - Enhancement : Titles are truncated but still visible by hovering them +___ ## 3.8.4 (2014-06-25) - BC Break : Drop sphinx search engine highlight support @@ -983,6 +1619,7 @@ Release notes - Phraseanet - Version 4.0.11 - NewFeature : Add session idle & life time in configuration - NewFeature : Add possibility to search “unknown” type document through API +___ ## 3.8.3 (2014-02-24) - BugFix : Fix record type editing. @@ -1031,10 +1668,12 @@ Release notes - Phraseanet - Version 4.0.11 - Enhancement : Add option to disable filesystem logs. - Enhancement : Add compatibility with PHP 5.6. +___ ## 3.8.2 (2013-11-15) - BugFix : Locale translation may block administration module load. +___ ## 3.8.1 (2013-11-15) - BugFix : IE 6 homepage error message is broken. @@ -1081,6 +1720,7 @@ Release notes - Phraseanet - Version 4.0.11 - Enhancement : Add Phraseanet twig namespace. - Enhancement : Allow video bitrate up to 12M. +___ ## 3.8.0 (2013-09-26) - BC Break : Removed `bin/console check:system` command, replaced by `bin/setup check:system`. @@ -1124,10 +1764,12 @@ Release notes - Phraseanet - Version 4.0.11 host configuration depending on Phraseanet configuration - Phraseanet enabled languages is now configurable. +___ ## 3.7.15 (2013-09-14) - Add Office Plugin client id and secret. +___ ## 3.7.14 (2013-07-23) - BugFix : Multi layered images are not rendered properly. @@ -1135,6 +1777,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : Records index is not updated after databox structure field rename. - Enhancement : Add support for grayscale colorspaces. +___ ## 3.7.13 (2013-07-04) - Some users were able to access story creation form whereas they were not allowed to. @@ -1142,6 +1785,7 @@ Release notes - Phraseanet - Version 4.0.11 - Update to PHP-FFMpeg 0.2.4, better support for video resizing. - BugFix : Unablt to reject a thesaurus term from thesaurus module. +___ ## 3.7.12 (2013-05-13) - BugFix : : Removed "required" attribute on non-required fields in order form. @@ -1149,12 +1793,14 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : Grouped status bits are not displayed in advanced search dialog. - Enhancement : Locales update. +___ ## 3.7.11 (2013-04-23) - Enhancement : Animated Gifs (video support) does not requir Gmagick anymore to work properly. - BugFix : : When importing users from CSV file, some properties were missing. - BugFix : : In Report, CSV export is limited to 30 lines. +___ ## 3.7.10 (2013-04-03) - BugFix : : Permalinks pages may be broken. @@ -1163,6 +1809,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : Phraseanet installation fails. - BugFix : : Consecutive calls to image tools may fail. +___ ## 3.7.9 (2013-03-27) - BugFix : : Detailed view does not display the right search result. @@ -1172,6 +1819,7 @@ Release notes - Phraseanet - Version 4.0.11 - Permalinks returned by the API now embed a download URL. - Bump to API version 1.3.1 (see https://docs.phraseanet.com/3.7/en/Devel/API/Changelog.html). +___ ## 3.7.8 (2013-03-22) - BugFix : : Phraseanet API does not return results at correct offset. @@ -1182,6 +1830,7 @@ Release notes - Phraseanet - Version 4.0.11 - Add support for CMYK images. - Preserve ICC profiles data in sub-definitions. +___ ## 3.7.7 (2013-03-08) - BugFix : : Archive task fails with stories. @@ -1189,6 +1838,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : Fix feeds entry notification display. - BugFix : : Read receipts are not associated to email for push and validation. +___ ## 3.7.6 (2013-02-01) - BugFix : : Load of a publication entry with a publisher that refers to a deleted users fails. @@ -1198,6 +1848,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : Landscape format images are displayed with a wrong ratio in quarantine. - General enhancement of Lightbox display on IE 7/8/9. +___ ## 3.7.5 (2013-01-09) - Support of Dailymotion latest API. @@ -1212,6 +1863,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : XML import to metadata fields that do not have proper source do not work correctly. - BugFix : : Databox unmount can provide 500's to users that have attached stories to their work zone. +___ ## 3.7.4 (2012-12-20) - BugFix : : Upgrade from 3.5 may lose metadatas. @@ -1233,6 +1885,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : : Story thumbnails are not displayed correctly. - BugFix : : Add dutch (nl_NL) support. +___ ## 3.7.3 (2012-11-09) - BugFix : : Security flaw (thanks TEHTRI-Security http://www.tehtri-security.com/). @@ -1260,6 +1913,7 @@ Release notes - Phraseanet - Version 4.0.11 - Mails links are now clickable in Thunderbird and Outlook. - Emails list in mail export now supports comma and space separators. +___ ## 3.7.2 (2012-10-04) - Significant speed enhancement on thumbnail display. @@ -1270,6 +1924,7 @@ Release notes - Phraseanet - Version 4.0.11 - Add option to rotate multiple image. - `Remember-me` was applied even if the box was not checked. +___ ## 3.7.1 (2012-09-18) - Multiple fixes in archive task. @@ -1278,6 +1933,7 @@ Release notes - Phraseanet - Version 4.0.11 - BugFix : upgrade from version 3.1 and 3.5. - BugFix : : Print tool is not working on IE version 8 and less over HTTPS. +___ ## 3.7.0 (2012-07-24) - Lots of graphics enhancements. @@ -1289,22 +1945,26 @@ Release notes - Phraseanet - Version 4.0.11 - Upgrade of the Phraseanet API to version 1.2 (see https://docs.phraseanet.com/3.7/en/Devel/API/Changelog.html#id1). - Phraseanet PHP SDK http://phraseanet-php-sdk.readthedocs.org/. +___ ## 3.6.5 (2012-05-11) - BugFix : : Bridge buttons are not visible on some browsers. - Youtube and Dailymotion APIs updates. - Stories can now be deleted from the work zone. - Push and validation logs were missing. - + +___ ## 3.6.4 (2012-04-30) - BugFix : DatePicker menus do not format date correctly. - BugFix : Dead records can remain in orders and may broke order window. +___ ## 3.6.3 (2012-04-26) - BugFix : selection in webkit based browers. +___ ## 3.6.2 (2012-04-19) - BugFix : : Users can be created by some pushers. @@ -1317,10 +1977,12 @@ Release notes - Phraseanet - Version 4.0.11 - Document + XML hot folder import produces corrupted files. - Enhanced Push list view on small device. +___ ## 3.6.1 (2012-03-27) - BugFix : upgrade from 3.5 versions with large datasets. +___ ## 3.6.0 (2012-03-20) - Add a Vocabulary mapping to multivalued fields. diff --git a/Dockerfile b/Dockerfile index 6ab15007f6..f6133a69fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,210 +1,18 @@ -######################################################################### -# 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 - -ENV FFMPEG_VERSION=4.2.2 - -RUN echo "deb http://deb.debian.org/debian stretch main non-free" > /etc/apt/sources.list \ - && apt-get update \ - && apt-get install -y \ - apt-transport-https \ - ca-certificates \ - gnupg2 \ - wget \ - && wget -O certs.deb http://ftp.fr.debian.org/debian/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb \ - && dpkg --fsys-tarfile certs.deb | tar -xOf - ./usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt > /usr/local/share/ca-certificates/ISRG_Root_X1.crt \ - && rm -rf /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt \ - && update-ca-certificates --fresh \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - zlib1g-dev \ - automake \ - git \ - ghostscript \ - gpac \ - imagemagick \ - ufraw \ - inkscape \ - libav-tools \ - libfreetype6-dev \ - libicu-dev \ - libjpeg62-turbo-dev \ - libmagickwand-dev \ - libmcrypt-dev \ - libpng-dev \ - librabbitmq-dev \ - libssl-dev \ - libxslt-dev \ - libzmq3-dev \ - libtool \ - locales \ - gettext \ - mcrypt \ - swftools \ - unoconv \ - unzip \ - poppler-utils \ - libreoffice-base-core \ - libreoffice-impress \ - libreoffice-calc \ - libreoffice-math \ - libreoffice-writer \ - libreoffice-pdfimport \ - # heic - libde265-dev \ - libopenjp2-7-dev \ - librsvg2-dev \ - libwebp-dev \ - # End heic - # FFmpeg - yasm \ - libvorbis-dev \ - texi2html \ - nasm \ - zlib1g-dev \ - libx264-dev \ - libfdk-aac-dev \ - libopus-dev \ - libvpx-dev \ - libmp3lame-dev \ - libogg-dev \ - libopencore-amrnb-dev \ - libopencore-amrwb-dev \ - libdc1394-22-dev \ - libx11-dev \ - libswscale-dev \ - libpostproc-dev \ - libxvidcore-dev \ - libtheora-dev \ - libgsm1-dev \ - libfreetype6-dev \ - libldap2-dev \ - # End FFmpeg \ - nano \ - && update-locale "LANG=fr_FR.UTF-8 UTF-8" \ - && dpkg-reconfigure --frontend noninteractive locales \ - # --- jq and libs for php-ext-jq \ - && mkdir /tmp/libjq \ - && git clone https://github.com/stedolan/jq.git /tmp/libjq \ - && cd /tmp/libjq \ - && git submodule update --init \ - && autoreconf -fi \ - && ./configure --with-oniguruma=builtin --disable-maintainer-mode \ - && make -j8 \ - && make check \ - && make install \ - # --- end of jq \ - && mkdir /tmp/libheif \ - && git clone https://github.com/strukturag/libheif.git /tmp/libheif \ - && cd /tmp/libheif \ - && git checkout v1.13.0 \ - && ./autogen.sh \ - && ./configure \ - && make \ - && make install -RUN echo "BUILDING AND INSTALLING IMAGEMAGICK" \ - && git clone https://github.com/ImageMagick/ImageMagick.git /tmp/ImageMagick \ - && cd /tmp/ImageMagick \ - && git checkout 7.1.0-39 \ - && ./configure \ - && make \ - && make install -RUN echo "BUILDING PHP PECL EXTENTIONS" \ - && ldconfig \ - && 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-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \ - && docker-php-ext-install -j$(nproc) ldap \ - && docker-php-ext-install zip exif iconv mbstring pcntl sockets xsl intl pdo_mysql gettext bcmath mcrypt \ - # --- extension jq - sources _must_ be in /usr/src/php/ext/ for the docker-php-ext-install script to find it \ - && mkdir -p /usr/src/php/ext/ \ - && git clone --depth=1 https://github.com/kjdev/php-ext-jq.git /usr/src/php/ext/php-ext-jq \ - && docker-php-ext-install php-ext-jq \ - # --- end of extension jq \ - && pecl install \ - redis \ - amqp-1.9.3 \ - zmq-beta \ - imagick-beta \ - xdebug-2.6.1 \ - && docker-php-ext-enable redis amqp zmq imagick opcache \ - && pecl clear-cache \ - && docker-php-source delete -RUN echo "BUILDING AND INSTALLING FFMPEG" \ - && mkdir /tmp/ffmpeg \ - && curl -s https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 | tar jxf - -C /tmp/ffmpeg \ - && ( \ - cd /tmp/ffmpeg/ffmpeg-${FFMPEG_VERSION} \ - && ./configure \ - --enable-gpl \ - --enable-nonfree \ - --enable-libfdk-aac \ - --enable-libfdk_aac \ - --enable-libgsm \ - --enable-libmp3lame \ - --enable-libtheora \ - --enable-libvorbis \ - --enable-libvpx \ - --enable-libfreetype \ - --enable-libopus \ - --enable-libx264 \ - --enable-libxvid \ - --enable-zlib \ - --enable-postproc \ - --enable-swscale \ - --enable-pthreads \ - --enable-libdc1394 \ - --enable-version3 \ - --enable-libopencore-amrnb \ - --enable-libopencore-amrwb \ - && make \ - && make install \ - && make distclean \ - ) - #&& rm -rf /tmp/ffmpeg -RUN echo "INSTALLING NEWRELIC AND BLACKFIRE EXTENTIONS" \ - && echo 'deb http://apt.newrelic.com/debian/ newrelic non-free' | tee /etc/apt/sources.list.d/newrelic.list \ - && curl -o- https://download.newrelic.com/548C16BF.gpg | apt-key add - \ - && apt-get update \ - && apt-get install -y newrelic-php5 \ - && NR_INSTALL_SILENT=1 newrelic-install install \ - && touch /etc/newrelic/newrelic.cfg \ - && curl -o- https://packages.blackfire.io/gpg.key |apt-key add - \ - && echo "deb http://packages.blackfire.io/debian any main" |tee /etc/apt/sources.list.d/blackfire.list \ - && apt update \ - && apt install blackfire-agent \ - && apt install blackfire-php -RUN echo "FINALIZING BUILD AND CLEANING" \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists \ - && mkdir /entrypoint /var/alchemy \ - && useradd -u 1000 app \ - && mkdir -p /home/app/.composer \ - && chown -R app: /home/app /var/alchemy - -ENV XDEBUG_ENABLED=0 -######################################################################### -# This image is used to build the apps -######################################################################### - -FROM phraseanet-system as builder +FROM alchemyfr/phraseanet-base:1.0.0 as builder COPY --from=composer:2.1.6 /usr/bin/composer /usr/bin/composer # 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 - \ + +RUN cd /tmp \ + && curl -O https://nodejs.org/download/release/v10.24.1/node-v10.24.1-linux-x64.tar.gz \ + && tar -xvf node-v10.24.1-linux-x64.tar.gz \ + && cp -Rf node-v10.24.1-linux-x64/* /usr/ \ && 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 \ - nodejs \ yarn \ nano \ vim \ @@ -214,7 +22,7 @@ RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ telnet \ autoconf \ libtool \ - python \ + python3 \ pkg-config \ && apt-get clean \ && rm -rf /var/lib/apt/lists \ @@ -264,7 +72,7 @@ CMD [] # Phraseanet install and setup application image ######################################################################### -FROM phraseanet-system as phraseanet-setup +FROM alchemyfr/phraseanet-base:1.0.0 as phraseanet-setup COPY --from=builder --chown=app /var/alchemy/Phraseanet /var/alchemy/Phraseanet ADD ./docker/phraseanet/root / @@ -277,7 +85,7 @@ CMD [] # Phraseanet web application image ######################################################################### -FROM phraseanet-system as phraseanet-fpm +FROM alchemyfr/phraseanet-base:1.0.0 as phraseanet-fpm COPY --from=builder --chown=app /var/alchemy/Phraseanet /var/alchemy/Phraseanet ADD ./docker/phraseanet/root / @@ -289,12 +97,16 @@ CMD ["php-fpm", "-F"] # Phraseanet worker application image ######################################################################### -FROM phraseanet-fpm as phraseanet-worker -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - supervisor \ - logrotate \ - && mkdir -p /var/log/supervisor \ +FROM alchemyfr/phraseanet-base:1.0.0 as phraseanet-worker + +COPY --from=builder --chown=app /var/alchemy/Phraseanet /var/alchemy/Phraseanet +ADD ./docker/phraseanet/root / +WORKDIR /var/alchemy/Phraseanet + +RUN apt-get update +RUN apt-get install -y --no-install-recommends supervisor +RUN apt-get install -y --no-install-recommends logrotate +RUN mkdir -p /var/log/supervisor \ && chown -R app: /var/log/supervisor \ && apt-get clean \ && rm -rf /var/lib/apt/lists @@ -313,6 +125,8 @@ CMD ["/bin/bash", "bin/run-worker.sh"] FROM nginx:1.17.8-alpine as phraseanet-nginx RUN adduser --uid 1000 --disabled-password app +RUN apk add --update apache2-utils \ + && rm -rf /var/cache/apk/* ADD ./docker/nginx/root / COPY --from=builder /var/alchemy/Phraseanet/www /var/alchemy/Phraseanet/www @@ -322,12 +136,12 @@ CMD ["nginx", "-g", "daemon off;"] HEALTHCHECK CMD wget --spider http://127.0.0.1/login || nginx -s reload || exit 1 ######################################################################### -# phrasaseanet adapted simplesaml service provider +# phraseanet adapted simplesaml service provider ######################################################################### -FROM php:7.0-fpm-stretch as phraseanet-saml-sp +FROM alchemyfr/phraseanet-base:1.0.0 as phraseanet-saml-sp RUN adduser --uid 1000 --disabled-password app -RUN echo "deb http://deb.debian.org/debian stretch main non-free" > /etc/apt/sources.list \ +RUN echo "deb http://archive.debian.org/debian stretch main non-free" > /etc/apt/sources.list \ && apt-get update \ && apt-get install -y \ apt-transport-https \ @@ -346,11 +160,9 @@ RUN echo "deb http://deb.debian.org/debian stretch main non-free" > /etc/apt/sou mcrypt \ libldap2-dev \ && curl -Ls https://github.com/simplesamlphp/simplesamlphp/releases/download/simplesamlphp-1.10.0/simplesamlphp-1.10.0.tar.gz | tar xzvf - -C /var/www/ \ - && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \ - && docker-php-ext-install -j$(nproc) ldap \ && docker-php-ext-install zip mbstring pdo_mysql gettext mcrypt \ && pecl install \ - redis \ + redis-5.3.7 \ && docker-php-ext-enable redis \ && pecl clear-cache \ && docker-php-source delete diff --git a/Phraseanet-production-client/README.md b/Phraseanet-production-client/README.md index 3a10463f15..f10366521e 100644 --- a/Phraseanet-production-client/README.md +++ b/Phraseanet-production-client/README.md @@ -23,11 +23,11 @@ Node `^5.0.0`. - Go to Phraseanet-production-client folder ```cd Phraseanet-production-client``` - Generate dist ```npm run dist``` - Go back to Phraseanet folder : ```cd ..``` - - Copy assets in www/assets folder ```make install_asset``` + - Copy assets in www/assets folder ```make install_assets``` - ... or simply one cmd : ```cd Phraseanet-production-client && npm run dist && cd .. && make install_assets && rm -rf cache/*``` ### Push - - If features is finished ```dist``` folder is to be commited with sources. + - If features is finished ```dist``` folder is to be committed with sources. ## Available commands diff --git a/Phraseanet-production-client/config/config.js b/Phraseanet-production-client/config/config.js index 9487cecd39..ba09697925 100644 --- a/Phraseanet-production-client/config/config.js +++ b/Phraseanet-production-client/config/config.js @@ -13,5 +13,5 @@ module.exports = { setupDir: _root + 'tests/setup/node.js', karmaConf: _root + 'config/karma.conf.js', // change this version when you change JS file for lazy loading - assetFileVersion: 77 + assetFileVersion: 106 }; diff --git a/Phraseanet-production-client/dist/authenticate.js b/Phraseanet-production-client/dist/authenticate.js index e6fc79a89d..02f7602658 100644 --- a/Phraseanet-production-client/dist/authenticate.js +++ b/Phraseanet-production-client/dist/authenticate.js @@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=77"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=106"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { @@ -4558,7 +4558,7 @@ var ErrorView = _backbone2.default.View.extend({ }, render: function render() { if (this.errors.length > 0) { - var template = _underscore2.default.template((0, _jquery2.default)(this.errorTemplate).html(), { + var template = _underscore2.default.template((0, _jquery2.default)(this.errorTemplate).html())({ errors: this.errors }); @@ -4740,10 +4740,7 @@ var renewPassword = function renewPassword(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', @@ -4828,10 +4825,7 @@ var regiser = function regiser(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', @@ -4844,10 +4838,7 @@ var regiser = function regiser(services) { }, { name: 'collections[]', rules: 'min_length[1]', - message: localeService.t('validation_choice_min', { - postProcess: 'sprintf', - sprintf: ['1'] - }), + message: localeService.t('validation_choice_min'), type: 'multiple' }]; @@ -4964,10 +4955,7 @@ var registerProvider = function registerProvider(services) { }, { name: 'password', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'passwordConfirm', rules: 'matches[password]', @@ -4980,10 +4968,7 @@ var registerProvider = function registerProvider(services) { }, { name: 'collections[]', rules: 'min_length[1]', - message: localeService.t('validation_choice_min', { - postProcess: 'sprintf', - sprintf: ['1'] - }), + message: localeService.t('validation_choice_min'), type: 'multiple' }]; @@ -5317,10 +5302,7 @@ var changePassword = function changePassword(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', diff --git a/Phraseanet-production-client/dist/authenticate.min.js b/Phraseanet-production-client/dist/authenticate.min.js index d9dda38f87..fde33b54b4 100644 --- a/Phraseanet-production-client/dist/authenticate.min.js +++ b/Phraseanet-production-client/dist/authenticate.min.js @@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=77"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=106"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { @@ -4558,7 +4558,7 @@ var ErrorView = _backbone2.default.View.extend({ }, render: function render() { if (this.errors.length > 0) { - var template = _underscore2.default.template((0, _jquery2.default)(this.errorTemplate).html(), { + var template = _underscore2.default.template((0, _jquery2.default)(this.errorTemplate).html())({ errors: this.errors }); @@ -4740,10 +4740,7 @@ var renewPassword = function renewPassword(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', @@ -4828,10 +4825,7 @@ var regiser = function regiser(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', @@ -4844,10 +4838,7 @@ var regiser = function regiser(services) { }, { name: 'collections[]', rules: 'min_length[1]', - message: localeService.t('validation_choice_min', { - postProcess: 'sprintf', - sprintf: ['1'] - }), + message: localeService.t('validation_choice_min'), type: 'multiple' }]; @@ -4964,10 +4955,7 @@ var registerProvider = function registerProvider(services) { }, { name: 'password', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'passwordConfirm', rules: 'matches[password]', @@ -4980,10 +4968,7 @@ var registerProvider = function registerProvider(services) { }, { name: 'collections[]', rules: 'min_length[1]', - message: localeService.t('validation_choice_min', { - postProcess: 'sprintf', - sprintf: ['1'] - }), + message: localeService.t('validation_choice_min'), type: 'multiple' }]; @@ -5317,10 +5302,7 @@ var changePassword = function changePassword(services) { }, { name: 'password[password]', rules: 'min_length[5]', - message: localeService.t('validation_length_min', { - postProcess: 'sprintf', - sprintf: ['5'] - }) + message: localeService.t('validation_length_min') }, { name: 'password[confirm]', rules: 'matches[password[password]]', diff --git a/Phraseanet-production-client/dist/commons.js b/Phraseanet-production-client/dist/commons.js index a69d220e0d..4b80195160 100644 --- a/Phraseanet-production-client/dist/commons.js +++ b/Phraseanet-production-client/dist/commons.js @@ -91,7 +91,7 @@ /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=77"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=106"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { @@ -37593,8 +37593,7 @@ exports.default = utilsModule; /* 75 */, /* 76 */, /* 77 */, -/* 78 */, -/* 79 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/Phraseanet-production-client/dist/commons.min.js b/Phraseanet-production-client/dist/commons.min.js index a323e47d33..a4a7d3c8b5 100644 --- a/Phraseanet-production-client/dist/commons.min.js +++ b/Phraseanet-production-client/dist/commons.min.js @@ -91,7 +91,7 @@ /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=77"; +/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=106"; /******/ var timeout = setTimeout(onScriptComplete, 120000); /******/ script.onerror = script.onload = onScriptComplete; /******/ function onScriptComplete() { @@ -37593,8 +37593,7 @@ exports.default = utilsModule; /* 75 */, /* 76 */, /* 77 */, -/* 78 */, -/* 79 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/Phraseanet-production-client/dist/lazy-1.js b/Phraseanet-production-client/dist/lazy-1.js index 786cf65712..743fc76122 100644 --- a/Phraseanet-production-client/dist/lazy-1.js +++ b/Phraseanet-production-client/dist/lazy-1.js @@ -7,15 +7,15 @@ webpackJsonpapp([1],{ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_global_window__ = __webpack_require__(44); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_global_window___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_global_window__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document__ = __webpack_require__(88); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document__ = __webpack_require__(87); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_global_document__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml__ = __webpack_require__(89); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml__ = __webpack_require__(88); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_tsml__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__ = __webpack_require__(90); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__ = __webpack_require__(89); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_keycode__ = __webpack_require__(358); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_keycode___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_keycode__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr__ = __webpack_require__(91); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr__ = __webpack_require__(90); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_xhr__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js__ = __webpack_require__(326); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js__); @@ -63970,7 +63970,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* videojs-hotke /***/ }), -/***/ 92: +/***/ 91: /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64036,7 +64036,6 @@ var rangeCapture = function rangeCapture(services, datas) { } options.frameRates = {}; options.ratios = {}; - var coverUrl = ''; var generateSourcesTpl = function generateSourcesTpl(record) { var recordSources = []; _underscore2.default.each(record.sources, function (s, i) { @@ -64049,7 +64048,7 @@ var rangeCapture = function rangeCapture(services, datas) { }; var sources = generateSourcesTpl(record); - $container.append(''); + $container.append(''); // window.videojs = videojs; _video2.default.addLanguage(localeService.getLocale(), localeService.getTranslations()); diff --git a/Phraseanet-production-client/dist/lazy-1.min.js b/Phraseanet-production-client/dist/lazy-1.min.js index 786cf65712..743fc76122 100644 --- a/Phraseanet-production-client/dist/lazy-1.min.js +++ b/Phraseanet-production-client/dist/lazy-1.min.js @@ -7,15 +7,15 @@ webpackJsonpapp([1],{ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_global_window__ = __webpack_require__(44); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_global_window___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_global_window__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document__ = __webpack_require__(88); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document__ = __webpack_require__(87); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_global_document___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_global_document__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml__ = __webpack_require__(89); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml__ = __webpack_require__(88); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_tsml___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_tsml__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__ = __webpack_require__(90); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__ = __webpack_require__(89); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_safe_json_parse_tuple__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_keycode__ = __webpack_require__(358); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_keycode___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_keycode__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr__ = __webpack_require__(91); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr__ = __webpack_require__(90); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_xhr___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_xhr__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js__ = __webpack_require__(326); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_videojs_vtt_js__); @@ -63970,7 +63970,7 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* videojs-hotke /***/ }), -/***/ 92: +/***/ 91: /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64036,7 +64036,6 @@ var rangeCapture = function rangeCapture(services, datas) { } options.frameRates = {}; options.ratios = {}; - var coverUrl = ''; var generateSourcesTpl = function generateSourcesTpl(record) { var recordSources = []; _underscore2.default.each(record.sources, function (s, i) { @@ -64049,7 +64048,7 @@ var rangeCapture = function rangeCapture(services, datas) { }; var sources = generateSourcesTpl(record); - $container.append(''); + $container.append(''); // window.videojs = videojs; _video2.default.addLanguage(localeService.getLocale(), localeService.getTranslations()); diff --git a/Phraseanet-production-client/dist/lazy-2.js b/Phraseanet-production-client/dist/lazy-2.js index 4fbd18cd8d..9b9b91d8d2 100644 --- a/Phraseanet-production-client/dist/lazy-2.js +++ b/Phraseanet-production-client/dist/lazy-2.js @@ -3046,7 +3046,7 @@ var widget = $.widget; /***/ }), -/***/ 94: +/***/ 93: /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/Phraseanet-production-client/dist/lazy-2.min.js b/Phraseanet-production-client/dist/lazy-2.min.js index 4fbd18cd8d..9b9b91d8d2 100644 --- a/Phraseanet-production-client/dist/lazy-2.min.js +++ b/Phraseanet-production-client/dist/lazy-2.min.js @@ -3046,7 +3046,7 @@ var widget = $.widget; /***/ }), -/***/ 94: +/***/ 93: /***/ (function(module, exports, __webpack_require__) { "use strict"; diff --git a/Phraseanet-production-client/dist/lazy-3.js b/Phraseanet-production-client/dist/lazy-3.js index 0570d7fb86..5f5307e1bc 100644 --- a/Phraseanet-production-client/dist/lazy-3.js +++ b/Phraseanet-production-client/dist/lazy-3.js @@ -899,7 +899,7 @@ if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { const projectVersion = __webpack_require__(450).version; const _ = __webpack_require__(451); -const EventEmitter = __webpack_require__(93); +const EventEmitter = __webpack_require__(92); const turfCircle = __webpack_require__(452); const turfBbox = __webpack_require__(453); const turfBboxPoly = __webpack_require__(454); @@ -2555,8 +2555,8 @@ module.exports = interceptor; var corslite = __webpack_require__(399), - strict = __webpack_require__(82).strict, - config = __webpack_require__(86); + strict = __webpack_require__(81).strict, + config = __webpack_require__(85); var protocol = /^(https?:)?(?=\/\/(.|api)\.tiles\.mapbox\.com\/)/; @@ -3142,8 +3142,8 @@ module.exports = { var request = __webpack_require__(309), - format_url = __webpack_require__(84), - util = __webpack_require__(82); + format_url = __webpack_require__(83), + util = __webpack_require__(81); module.exports = { _loadTileJSON: function(_) { @@ -13082,8 +13082,8 @@ L.Map.include({ var isArray = __webpack_require__(398), - util = __webpack_require__(82), - format_url = __webpack_require__(84), + util = __webpack_require__(81), + format_url = __webpack_require__(83), feedback = __webpack_require__(317), request = __webpack_require__(309); @@ -13230,7 +13230,7 @@ module.exports = function(url, options) { "use strict"; -var util = __webpack_require__(82), +var util = __webpack_require__(81), Mustache = __webpack_require__(336); var GridControl = L.Control.extend({ @@ -13238,7 +13238,7 @@ var GridControl = L.Control.extend({ options: { pinnable: true, follow: false, - sanitizer: __webpack_require__(83), + sanitizer: __webpack_require__(82), touchTeaser: true, location: true }, @@ -14073,10 +14073,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ "use strict"; -var util = __webpack_require__(82), - format_url = __webpack_require__(84), +var util = __webpack_require__(81), + format_url = __webpack_require__(83), request = __webpack_require__(309), - marker = __webpack_require__(85), + marker = __webpack_require__(84), simplestyle = __webpack_require__(338); // # featureLayer @@ -14086,7 +14086,7 @@ var util = __webpack_require__(82), var FeatureLayer = L.FeatureGroup.extend({ options: { filter: function() { return true; }, - sanitizer: __webpack_require__(83), + sanitizer: __webpack_require__(82), style: simplestyle.style, popupOptions: { closeButton: false } }, @@ -14263,7 +14263,7 @@ var LegendControl = L.Control.extend({ options: { position: 'bottomright', - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(options) { @@ -14333,7 +14333,7 @@ module.exports.legendControl = function(options) { "use strict"; -var format_url = __webpack_require__(84); +var format_url = __webpack_require__(83); var ShareControl = L.Control.extend({ includes: [__webpack_require__(312)], @@ -14461,14 +14461,14 @@ module.exports.shareControl = function(_, options) { "use strict"; -var util = __webpack_require__(82); +var util = __webpack_require__(81); var formatPattern = /\.((?:png|jpg)\d*)(?=$|\?)/; var TileLayer = L.TileLayer.extend({ includes: [__webpack_require__(312)], options: { - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, // http://mapbox.com/developers/api/#image_quality @@ -14569,7 +14569,7 @@ module.exports.tileLayer = function(_, options) { var InfoControl = L.Control.extend({ options: { position: 'bottomright', - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(options) { @@ -14688,7 +14688,7 @@ module.exports.infoControl = function(options) { "use strict"; -var util = __webpack_require__(82), +var util = __webpack_require__(81), request = __webpack_require__(309), grid = __webpack_require__(401); @@ -16563,9 +16563,9 @@ var geocoderControl = __webpack_require__(397), styleLayer = __webpack_require__(403); L.mapbox = module.exports = { - VERSION: __webpack_require__(87).version, + VERSION: __webpack_require__(86).version, geocoder: __webpack_require__(334), - marker: __webpack_require__(85), + marker: __webpack_require__(84), simplestyle: __webpack_require__(338), tileLayer: tileLayer.tileLayer, TileLayer: tileLayer.TileLayer, @@ -16587,8 +16587,8 @@ L.mapbox = module.exports = { FeatureLayer: featureLayer.FeatureLayer, map: map.map, Map: map.Map, - config: __webpack_require__(86), - sanitize: __webpack_require__(83), + config: __webpack_require__(85), + sanitize: __webpack_require__(82), template: __webpack_require__(336).to_html, feedback: __webpack_require__(317) }; @@ -16602,7 +16602,7 @@ window.L.Icon.Default.imagePath = ((document.location.protocol === 'https:' || document.location.protocol === 'http:') ? '' : 'https:') + '//api.tiles.mapbox.com/mapbox.js/' + 'v' + - __webpack_require__(87).version + '/images'; + __webpack_require__(86).version + '/images'; /***/ }), @@ -16613,7 +16613,7 @@ window.L.Icon.Default.imagePath = var geocoder = __webpack_require__(334), - util = __webpack_require__(82); + util = __webpack_require__(81); var GeocoderControl = L.Control.extend({ includes: L.Mixin.Events, @@ -16958,7 +16958,7 @@ var LMap = L.Map.extend({ gridControl: {}, infoControl: false, shareControl: false, - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, _tilejson: {}, @@ -17234,14 +17234,14 @@ module.exports.mapboxLogoControl = function(options) { "use strict"; -var util = __webpack_require__(82); -var format_url = __webpack_require__(84); +var util = __webpack_require__(81); +var format_url = __webpack_require__(83); var request = __webpack_require__(309); var StyleLayer = L.TileLayer.extend({ options: { - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(_, options) { @@ -27569,7 +27569,7 @@ MapboxTokens.prototype.listScopes = function(callback) { /* 450 */ /***/ (function(module, exports) { -module.exports = {"_args":[["mapbox-gl-circle@1.6.5","/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox-gl-circle@1.6.5","_id":"mapbox-gl-circle@1.6.5","_inBundle":false,"_integrity":"sha512-VHA6lgxZE/WFtBXmMveU2zt7ZeVcBHe42k4U4b8xGEnrDSQs4/++EBPVywEMNqi01XQrbf1eiAhsIDZasR4drw==","_location":"/mapbox-gl-circle","_phantomChildren":{"@mapbox/geojson-area":"0.2.2","@mapbox/gl-matrix":"0.0.1","@mapbox/mapbox-gl-supported":"1.4.0","@mapbox/point-geometry":"0.1.0","@mapbox/shelf-pack":"3.2.0","@mapbox/tiny-sdf":"1.1.0","@mapbox/unitbezier":"0.0.0","@mapbox/vector-tile":"1.3.1","@mapbox/whoots-js":"3.1.0","brfs":"1.6.1","bubleify":"0.7.0","concat-stream":"1.6.2","csscolorparser":"1.0.3","earcut":"2.1.3","geojson-vt":"3.2.1","gray-matter":"3.1.1","grid-index":"1.1.0","jsonlint-lines-primitives":"1.6.0","minimist":"0.0.8","package-json-versionify":"1.0.4","pbf":"3.2.0","quickselect":"1.1.1","rw":"1.3.3","sharkdown":"0.1.1","shuffle-seed":"1.1.6","sort-object":"0.3.2","through2":"2.0.3","tinyqueue":"1.2.3","unassertify":"2.1.1","unflowify":"1.0.1","vt-pbf":"3.1.1","webworkify":"1.5.0"},"_requested":{"type":"version","registry":true,"raw":"mapbox-gl-circle@1.6.5","name":"mapbox-gl-circle","escapedName":"mapbox-gl-circle","rawSpec":"1.6.5","saveSpec":null,"fetchSpec":"1.6.5"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox-gl-circle/-/mapbox-gl-circle-1.6.5.tgz","_spec":"1.6.5","_where":"/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client","author":{"name":"Smith Micro Software, Inc."},"browserify":{"transform":["babelify"]},"bugs":{"url":"https://github.com/smithmicro/mapbox-gl-circle/issues"},"dependencies":{"@turf/bbox":"^4.7.3","@turf/bbox-polygon":"^4.7.3","@turf/bearing":"^4.5.2","@turf/circle":"^4.7.3","@turf/destination":"^4.7.3","@turf/distance":"^4.7.3","@turf/helpers":"^4.7.3","@turf/truncate":"^4.7.3","core-util-is":"^1.0.2","debug":"^3.0.0","events":"^1.1.1","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","lodash":"^4.17.5","lodash.debounce":"^4.0.8","mapbox-gl":"^0.44.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"description":"A google.maps.Circle replacement for Mapbox GL JS API","devDependencies":{"async-each":"^1.0.1","babel-preset-es2015":"^6.24.1","babelify":"^7.3.0","brfs":"^1.4.4","browserify":"^14.5.0","buble":"^0.15.2","budo":"^10.0.4","documentation":"^5.1.0","eslint":"^4.18.1","eslint-config-google":"^0.9.1","esutils":"^2.0.2","magic-string":"^0.22.4","uglify-js":"^3.3.12","vlq":"^0.2.3","watchify":"^3.10.0"},"directories":{"example":"example","lib":"lib"},"engines":{"node":">=7.6.0","npm":">=5.3.0"},"files":["lib/","example/","dist/"],"homepage":"https://github.com/smithmicro/mapbox-gl-circle#readme","keywords":["mapbox","circle","osm","gl"],"license":"ISC","main":"lib/main.js","name":"mapbox-gl-circle","optionalDependencies":{"core-util-is":"^1.0.2","debug":"^3.0.0","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"repository":{"type":"git","url":"git+ssh://git@github.com/smithmicro/mapbox-gl-circle.git"},"scripts":{"browserify":"mkdir -p dist && browserify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug --delay=0 -v","docs":"documentation lint lib/main.js && documentation readme lib/main.js --access public --section=Usage","lint":"eslint lib","prepare":"mkdir -p dist && browserify --standalone MapboxCircle -t [ babelify --presets [ es2015 ] ] lib/main.js | uglifyjs -c -m > dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js && cp -f dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js dist/mapbox-gl-circle.min.js","start":"budo example/index.js --live --force-default-index --title budo/mapbox-gl-circle --verbose -- -t brfs","watchify":"mkdir -p dist && watchify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug -v"},"version":"1.6.5"} +module.exports = {"_args":[["mapbox-gl-circle@1.6.5","/var/alchemy/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox-gl-circle@1.6.5","_id":"mapbox-gl-circle@1.6.5","_inBundle":false,"_integrity":"sha512-VHA6lgxZE/WFtBXmMveU2zt7ZeVcBHe42k4U4b8xGEnrDSQs4/++EBPVywEMNqi01XQrbf1eiAhsIDZasR4drw==","_location":"/mapbox-gl-circle","_phantomChildren":{"@mapbox/geojson-area":"0.2.2","@mapbox/gl-matrix":"0.0.1","@mapbox/mapbox-gl-supported":"1.4.0","@mapbox/point-geometry":"0.1.0","@mapbox/shelf-pack":"3.2.0","@mapbox/tiny-sdf":"1.1.0","@mapbox/unitbezier":"0.0.0","@mapbox/vector-tile":"1.3.1","@mapbox/whoots-js":"3.1.0","brfs":"1.6.1","bubleify":"0.7.0","concat-stream":"1.6.2","csscolorparser":"1.0.3","earcut":"2.1.3","geojson-vt":"3.2.1","gray-matter":"3.1.1","grid-index":"1.1.0","jsonlint-lines-primitives":"1.6.0","minimist":"0.0.8","package-json-versionify":"1.0.4","pbf":"3.2.0","quickselect":"1.1.1","rw":"1.3.3","sharkdown":"0.1.1","shuffle-seed":"1.1.6","sort-object":"0.3.2","through2":"2.0.3","tinyqueue":"1.2.3","unassertify":"2.1.1","unflowify":"1.0.1","vt-pbf":"3.1.1","webworkify":"1.5.0"},"_requested":{"type":"version","registry":true,"raw":"mapbox-gl-circle@1.6.5","name":"mapbox-gl-circle","escapedName":"mapbox-gl-circle","rawSpec":"1.6.5","saveSpec":null,"fetchSpec":"1.6.5"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox-gl-circle/-/mapbox-gl-circle-1.6.5.tgz","_spec":"1.6.5","_where":"/var/alchemy/Phraseanet/Phraseanet-production-client","author":{"name":"Smith Micro Software, Inc."},"browserify":{"transform":["babelify"]},"bugs":{"url":"https://github.com/smithmicro/mapbox-gl-circle/issues"},"dependencies":{"@turf/bbox":"^4.7.3","@turf/bbox-polygon":"^4.7.3","@turf/bearing":"^4.5.2","@turf/circle":"^4.7.3","@turf/destination":"^4.7.3","@turf/distance":"^4.7.3","@turf/helpers":"^4.7.3","@turf/truncate":"^4.7.3","core-util-is":"^1.0.2","debug":"^3.0.0","events":"^1.1.1","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","lodash":"^4.17.5","lodash.debounce":"^4.0.8","mapbox-gl":"^0.44.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"description":"A google.maps.Circle replacement for Mapbox GL JS API","devDependencies":{"async-each":"^1.0.1","babel-preset-es2015":"^6.24.1","babelify":"^7.3.0","brfs":"^1.4.4","browserify":"^14.5.0","buble":"^0.15.2","budo":"^10.0.4","documentation":"^5.1.0","eslint":"^4.18.1","eslint-config-google":"^0.9.1","esutils":"^2.0.2","magic-string":"^0.22.4","uglify-js":"^3.3.12","vlq":"^0.2.3","watchify":"^3.10.0"},"directories":{"example":"example","lib":"lib"},"engines":{"node":">=7.6.0","npm":">=5.3.0"},"files":["lib/","example/","dist/"],"homepage":"https://github.com/smithmicro/mapbox-gl-circle#readme","keywords":["mapbox","circle","osm","gl"],"license":"ISC","main":"lib/main.js","name":"mapbox-gl-circle","optionalDependencies":{"core-util-is":"^1.0.2","debug":"^3.0.0","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"repository":{"type":"git","url":"git+ssh://git@github.com/smithmicro/mapbox-gl-circle.git"},"scripts":{"browserify":"mkdir -p dist && browserify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug --delay=0 -v","docs":"documentation lint lib/main.js && documentation readme lib/main.js --access public --section=Usage","lint":"eslint lib","prepare":"mkdir -p dist && browserify --standalone MapboxCircle -t [ babelify --presets [ es2015 ] ] lib/main.js | uglifyjs -c -m > dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js && cp -f dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js dist/mapbox-gl-circle.min.js","start":"budo example/index.js --live --force-default-index --title budo/mapbox-gl-circle --verbose -- -t brfs","watchify":"mkdir -p dist && watchify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug -v"},"version":"1.6.5"} /***/ }), /* 451 */ diff --git a/Phraseanet-production-client/dist/lazy-3.min.js b/Phraseanet-production-client/dist/lazy-3.min.js index 0570d7fb86..5f5307e1bc 100644 --- a/Phraseanet-production-client/dist/lazy-3.min.js +++ b/Phraseanet-production-client/dist/lazy-3.min.js @@ -899,7 +899,7 @@ if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { const projectVersion = __webpack_require__(450).version; const _ = __webpack_require__(451); -const EventEmitter = __webpack_require__(93); +const EventEmitter = __webpack_require__(92); const turfCircle = __webpack_require__(452); const turfBbox = __webpack_require__(453); const turfBboxPoly = __webpack_require__(454); @@ -2555,8 +2555,8 @@ module.exports = interceptor; var corslite = __webpack_require__(399), - strict = __webpack_require__(82).strict, - config = __webpack_require__(86); + strict = __webpack_require__(81).strict, + config = __webpack_require__(85); var protocol = /^(https?:)?(?=\/\/(.|api)\.tiles\.mapbox\.com\/)/; @@ -3142,8 +3142,8 @@ module.exports = { var request = __webpack_require__(309), - format_url = __webpack_require__(84), - util = __webpack_require__(82); + format_url = __webpack_require__(83), + util = __webpack_require__(81); module.exports = { _loadTileJSON: function(_) { @@ -13082,8 +13082,8 @@ L.Map.include({ var isArray = __webpack_require__(398), - util = __webpack_require__(82), - format_url = __webpack_require__(84), + util = __webpack_require__(81), + format_url = __webpack_require__(83), feedback = __webpack_require__(317), request = __webpack_require__(309); @@ -13230,7 +13230,7 @@ module.exports = function(url, options) { "use strict"; -var util = __webpack_require__(82), +var util = __webpack_require__(81), Mustache = __webpack_require__(336); var GridControl = L.Control.extend({ @@ -13238,7 +13238,7 @@ var GridControl = L.Control.extend({ options: { pinnable: true, follow: false, - sanitizer: __webpack_require__(83), + sanitizer: __webpack_require__(82), touchTeaser: true, location: true }, @@ -14073,10 +14073,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ "use strict"; -var util = __webpack_require__(82), - format_url = __webpack_require__(84), +var util = __webpack_require__(81), + format_url = __webpack_require__(83), request = __webpack_require__(309), - marker = __webpack_require__(85), + marker = __webpack_require__(84), simplestyle = __webpack_require__(338); // # featureLayer @@ -14086,7 +14086,7 @@ var util = __webpack_require__(82), var FeatureLayer = L.FeatureGroup.extend({ options: { filter: function() { return true; }, - sanitizer: __webpack_require__(83), + sanitizer: __webpack_require__(82), style: simplestyle.style, popupOptions: { closeButton: false } }, @@ -14263,7 +14263,7 @@ var LegendControl = L.Control.extend({ options: { position: 'bottomright', - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(options) { @@ -14333,7 +14333,7 @@ module.exports.legendControl = function(options) { "use strict"; -var format_url = __webpack_require__(84); +var format_url = __webpack_require__(83); var ShareControl = L.Control.extend({ includes: [__webpack_require__(312)], @@ -14461,14 +14461,14 @@ module.exports.shareControl = function(_, options) { "use strict"; -var util = __webpack_require__(82); +var util = __webpack_require__(81); var formatPattern = /\.((?:png|jpg)\d*)(?=$|\?)/; var TileLayer = L.TileLayer.extend({ includes: [__webpack_require__(312)], options: { - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, // http://mapbox.com/developers/api/#image_quality @@ -14569,7 +14569,7 @@ module.exports.tileLayer = function(_, options) { var InfoControl = L.Control.extend({ options: { position: 'bottomright', - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(options) { @@ -14688,7 +14688,7 @@ module.exports.infoControl = function(options) { "use strict"; -var util = __webpack_require__(82), +var util = __webpack_require__(81), request = __webpack_require__(309), grid = __webpack_require__(401); @@ -16563,9 +16563,9 @@ var geocoderControl = __webpack_require__(397), styleLayer = __webpack_require__(403); L.mapbox = module.exports = { - VERSION: __webpack_require__(87).version, + VERSION: __webpack_require__(86).version, geocoder: __webpack_require__(334), - marker: __webpack_require__(85), + marker: __webpack_require__(84), simplestyle: __webpack_require__(338), tileLayer: tileLayer.tileLayer, TileLayer: tileLayer.TileLayer, @@ -16587,8 +16587,8 @@ L.mapbox = module.exports = { FeatureLayer: featureLayer.FeatureLayer, map: map.map, Map: map.Map, - config: __webpack_require__(86), - sanitize: __webpack_require__(83), + config: __webpack_require__(85), + sanitize: __webpack_require__(82), template: __webpack_require__(336).to_html, feedback: __webpack_require__(317) }; @@ -16602,7 +16602,7 @@ window.L.Icon.Default.imagePath = ((document.location.protocol === 'https:' || document.location.protocol === 'http:') ? '' : 'https:') + '//api.tiles.mapbox.com/mapbox.js/' + 'v' + - __webpack_require__(87).version + '/images'; + __webpack_require__(86).version + '/images'; /***/ }), @@ -16613,7 +16613,7 @@ window.L.Icon.Default.imagePath = var geocoder = __webpack_require__(334), - util = __webpack_require__(82); + util = __webpack_require__(81); var GeocoderControl = L.Control.extend({ includes: L.Mixin.Events, @@ -16958,7 +16958,7 @@ var LMap = L.Map.extend({ gridControl: {}, infoControl: false, shareControl: false, - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, _tilejson: {}, @@ -17234,14 +17234,14 @@ module.exports.mapboxLogoControl = function(options) { "use strict"; -var util = __webpack_require__(82); -var format_url = __webpack_require__(84); +var util = __webpack_require__(81); +var format_url = __webpack_require__(83); var request = __webpack_require__(309); var StyleLayer = L.TileLayer.extend({ options: { - sanitizer: __webpack_require__(83) + sanitizer: __webpack_require__(82) }, initialize: function(_, options) { @@ -27569,7 +27569,7 @@ MapboxTokens.prototype.listScopes = function(callback) { /* 450 */ /***/ (function(module, exports) { -module.exports = {"_args":[["mapbox-gl-circle@1.6.5","/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox-gl-circle@1.6.5","_id":"mapbox-gl-circle@1.6.5","_inBundle":false,"_integrity":"sha512-VHA6lgxZE/WFtBXmMveU2zt7ZeVcBHe42k4U4b8xGEnrDSQs4/++EBPVywEMNqi01XQrbf1eiAhsIDZasR4drw==","_location":"/mapbox-gl-circle","_phantomChildren":{"@mapbox/geojson-area":"0.2.2","@mapbox/gl-matrix":"0.0.1","@mapbox/mapbox-gl-supported":"1.4.0","@mapbox/point-geometry":"0.1.0","@mapbox/shelf-pack":"3.2.0","@mapbox/tiny-sdf":"1.1.0","@mapbox/unitbezier":"0.0.0","@mapbox/vector-tile":"1.3.1","@mapbox/whoots-js":"3.1.0","brfs":"1.6.1","bubleify":"0.7.0","concat-stream":"1.6.2","csscolorparser":"1.0.3","earcut":"2.1.3","geojson-vt":"3.2.1","gray-matter":"3.1.1","grid-index":"1.1.0","jsonlint-lines-primitives":"1.6.0","minimist":"0.0.8","package-json-versionify":"1.0.4","pbf":"3.2.0","quickselect":"1.1.1","rw":"1.3.3","sharkdown":"0.1.1","shuffle-seed":"1.1.6","sort-object":"0.3.2","through2":"2.0.3","tinyqueue":"1.2.3","unassertify":"2.1.1","unflowify":"1.0.1","vt-pbf":"3.1.1","webworkify":"1.5.0"},"_requested":{"type":"version","registry":true,"raw":"mapbox-gl-circle@1.6.5","name":"mapbox-gl-circle","escapedName":"mapbox-gl-circle","rawSpec":"1.6.5","saveSpec":null,"fetchSpec":"1.6.5"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox-gl-circle/-/mapbox-gl-circle-1.6.5.tgz","_spec":"1.6.5","_where":"/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client","author":{"name":"Smith Micro Software, Inc."},"browserify":{"transform":["babelify"]},"bugs":{"url":"https://github.com/smithmicro/mapbox-gl-circle/issues"},"dependencies":{"@turf/bbox":"^4.7.3","@turf/bbox-polygon":"^4.7.3","@turf/bearing":"^4.5.2","@turf/circle":"^4.7.3","@turf/destination":"^4.7.3","@turf/distance":"^4.7.3","@turf/helpers":"^4.7.3","@turf/truncate":"^4.7.3","core-util-is":"^1.0.2","debug":"^3.0.0","events":"^1.1.1","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","lodash":"^4.17.5","lodash.debounce":"^4.0.8","mapbox-gl":"^0.44.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"description":"A google.maps.Circle replacement for Mapbox GL JS API","devDependencies":{"async-each":"^1.0.1","babel-preset-es2015":"^6.24.1","babelify":"^7.3.0","brfs":"^1.4.4","browserify":"^14.5.0","buble":"^0.15.2","budo":"^10.0.4","documentation":"^5.1.0","eslint":"^4.18.1","eslint-config-google":"^0.9.1","esutils":"^2.0.2","magic-string":"^0.22.4","uglify-js":"^3.3.12","vlq":"^0.2.3","watchify":"^3.10.0"},"directories":{"example":"example","lib":"lib"},"engines":{"node":">=7.6.0","npm":">=5.3.0"},"files":["lib/","example/","dist/"],"homepage":"https://github.com/smithmicro/mapbox-gl-circle#readme","keywords":["mapbox","circle","osm","gl"],"license":"ISC","main":"lib/main.js","name":"mapbox-gl-circle","optionalDependencies":{"core-util-is":"^1.0.2","debug":"^3.0.0","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"repository":{"type":"git","url":"git+ssh://git@github.com/smithmicro/mapbox-gl-circle.git"},"scripts":{"browserify":"mkdir -p dist && browserify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug --delay=0 -v","docs":"documentation lint lib/main.js && documentation readme lib/main.js --access public --section=Usage","lint":"eslint lib","prepare":"mkdir -p dist && browserify --standalone MapboxCircle -t [ babelify --presets [ es2015 ] ] lib/main.js | uglifyjs -c -m > dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js && cp -f dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js dist/mapbox-gl-circle.min.js","start":"budo example/index.js --live --force-default-index --title budo/mapbox-gl-circle --verbose -- -t brfs","watchify":"mkdir -p dist && watchify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug -v"},"version":"1.6.5"} +module.exports = {"_args":[["mapbox-gl-circle@1.6.5","/var/alchemy/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox-gl-circle@1.6.5","_id":"mapbox-gl-circle@1.6.5","_inBundle":false,"_integrity":"sha512-VHA6lgxZE/WFtBXmMveU2zt7ZeVcBHe42k4U4b8xGEnrDSQs4/++EBPVywEMNqi01XQrbf1eiAhsIDZasR4drw==","_location":"/mapbox-gl-circle","_phantomChildren":{"@mapbox/geojson-area":"0.2.2","@mapbox/gl-matrix":"0.0.1","@mapbox/mapbox-gl-supported":"1.4.0","@mapbox/point-geometry":"0.1.0","@mapbox/shelf-pack":"3.2.0","@mapbox/tiny-sdf":"1.1.0","@mapbox/unitbezier":"0.0.0","@mapbox/vector-tile":"1.3.1","@mapbox/whoots-js":"3.1.0","brfs":"1.6.1","bubleify":"0.7.0","concat-stream":"1.6.2","csscolorparser":"1.0.3","earcut":"2.1.3","geojson-vt":"3.2.1","gray-matter":"3.1.1","grid-index":"1.1.0","jsonlint-lines-primitives":"1.6.0","minimist":"0.0.8","package-json-versionify":"1.0.4","pbf":"3.2.0","quickselect":"1.1.1","rw":"1.3.3","sharkdown":"0.1.1","shuffle-seed":"1.1.6","sort-object":"0.3.2","through2":"2.0.3","tinyqueue":"1.2.3","unassertify":"2.1.1","unflowify":"1.0.1","vt-pbf":"3.1.1","webworkify":"1.5.0"},"_requested":{"type":"version","registry":true,"raw":"mapbox-gl-circle@1.6.5","name":"mapbox-gl-circle","escapedName":"mapbox-gl-circle","rawSpec":"1.6.5","saveSpec":null,"fetchSpec":"1.6.5"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox-gl-circle/-/mapbox-gl-circle-1.6.5.tgz","_spec":"1.6.5","_where":"/var/alchemy/Phraseanet/Phraseanet-production-client","author":{"name":"Smith Micro Software, Inc."},"browserify":{"transform":["babelify"]},"bugs":{"url":"https://github.com/smithmicro/mapbox-gl-circle/issues"},"dependencies":{"@turf/bbox":"^4.7.3","@turf/bbox-polygon":"^4.7.3","@turf/bearing":"^4.5.2","@turf/circle":"^4.7.3","@turf/destination":"^4.7.3","@turf/distance":"^4.7.3","@turf/helpers":"^4.7.3","@turf/truncate":"^4.7.3","core-util-is":"^1.0.2","debug":"^3.0.0","events":"^1.1.1","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","lodash":"^4.17.5","lodash.debounce":"^4.0.8","mapbox-gl":"^0.44.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"description":"A google.maps.Circle replacement for Mapbox GL JS API","devDependencies":{"async-each":"^1.0.1","babel-preset-es2015":"^6.24.1","babelify":"^7.3.0","brfs":"^1.4.4","browserify":"^14.5.0","buble":"^0.15.2","budo":"^10.0.4","documentation":"^5.1.0","eslint":"^4.18.1","eslint-config-google":"^0.9.1","esutils":"^2.0.2","magic-string":"^0.22.4","uglify-js":"^3.3.12","vlq":"^0.2.3","watchify":"^3.10.0"},"directories":{"example":"example","lib":"lib"},"engines":{"node":">=7.6.0","npm":">=5.3.0"},"files":["lib/","example/","dist/"],"homepage":"https://github.com/smithmicro/mapbox-gl-circle#readme","keywords":["mapbox","circle","osm","gl"],"license":"ISC","main":"lib/main.js","name":"mapbox-gl-circle","optionalDependencies":{"core-util-is":"^1.0.2","debug":"^3.0.0","fsevents":"^1.1.2","glob":"^7.1.2","inflight":"^1.0.6","inherits":"^2.0.3","jsonparse":"^1.3.1","minimatch":"^3.0.4","once":"^1.4.0","punycode":"^2.1.0","readable-stream":"^2.3.3","string_decoder":"^1.0.3","through2":"^2.0.3","util-deprecate":"^1.0.2","wrappy":"^1.0.2","xtend":"^4.0.1","yarn":"^0.27.5"},"repository":{"type":"git","url":"git+ssh://git@github.com/smithmicro/mapbox-gl-circle.git"},"scripts":{"browserify":"mkdir -p dist && browserify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug --delay=0 -v","docs":"documentation lint lib/main.js && documentation readme lib/main.js --access public --section=Usage","lint":"eslint lib","prepare":"mkdir -p dist && browserify --standalone MapboxCircle -t [ babelify --presets [ es2015 ] ] lib/main.js | uglifyjs -c -m > dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js && cp -f dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.min.js dist/mapbox-gl-circle.min.js","start":"budo example/index.js --live --force-default-index --title budo/mapbox-gl-circle --verbose -- -t brfs","watchify":"mkdir -p dist && watchify lib/main.js -o dist/mapbox-gl-circle-${BUILD_VERSION:-dev}.js --debug -v"},"version":"1.6.5"} /***/ }), /* 451 */ diff --git a/Phraseanet-production-client/dist/lightbox.js b/Phraseanet-production-client/dist/lightbox.js index 2d75d10a2f..5f1b857913 100644 --- a/Phraseanet-production-client/dist/lightbox.js +++ b/Phraseanet-production-client/dist/lightbox.js @@ -99,7 +99,7 @@ var _index = __webpack_require__(256); var _index2 = _interopRequireDefault(_index); -var _mainMenu = __webpack_require__(79); +var _mainMenu = __webpack_require__(78); var _mainMenu2 = _interopRequireDefault(_mainMenu); @@ -1064,7 +1064,8 @@ var lightbox = function lightbox(services) { url: '/lightbox/ajax/SET_NOTE/' + sselcont_id + '/', dataType: 'json', data: { - note: note + note: note, + lightbox_token: (0, _jquery2.default)(button).closest('form').find('input[name=lightbox_token]').val() }, success: function success(datas) { _hideNotes(container); @@ -1248,6 +1249,11 @@ var download = function download(services) { success: function success(data) { $dialog.setContent(data); _onDownloadReady($dialog, window.exportConfig); + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); diff --git a/Phraseanet-production-client/dist/lightbox.min.js b/Phraseanet-production-client/dist/lightbox.min.js index 2d75d10a2f..5f1b857913 100644 --- a/Phraseanet-production-client/dist/lightbox.min.js +++ b/Phraseanet-production-client/dist/lightbox.min.js @@ -99,7 +99,7 @@ var _index = __webpack_require__(256); var _index2 = _interopRequireDefault(_index); -var _mainMenu = __webpack_require__(79); +var _mainMenu = __webpack_require__(78); var _mainMenu2 = _interopRequireDefault(_mainMenu); @@ -1064,7 +1064,8 @@ var lightbox = function lightbox(services) { url: '/lightbox/ajax/SET_NOTE/' + sselcont_id + '/', dataType: 'json', data: { - note: note + note: note, + lightbox_token: (0, _jquery2.default)(button).closest('form').find('input[name=lightbox_token]').val() }, success: function success(datas) { _hideNotes(container); @@ -1248,6 +1249,11 @@ var download = function download(services) { success: function success(data) { $dialog.setContent(data); _onDownloadReady($dialog, window.exportConfig); + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); diff --git a/Phraseanet-production-client/dist/production.css b/Phraseanet-production-client/dist/production.css index e331a0fbdd..61bb175635 100644 --- a/Phraseanet-production-client/dist/production.css +++ b/Phraseanet-production-client/dist/production.css @@ -4405,6 +4405,14 @@ input.checkbox { background-image: url("/assets/common/images/icons/ppen_history.png"); } +.history-subdefCreation { + background-image: url("/assets/common/images/icons/subdefCreation.png"); +} + +.history-writeMetadatas { + background-image: url("/assets/common/images/icons/writeMetadatas.png"); +} + .history-validate { background-image: url("/assets/common/images/icons/basket_validation.png"); } @@ -4432,6 +4440,8 @@ input.checkbox { background-image: url('/assets/common/images/icons/add.png'); }*/ +.history-writeMetadatas, +.history-subdefCreation, .history-collection, .history-status, .history-print, @@ -4445,8 +4455,8 @@ input.checkbox { .history-push, .history-add { background-repeat: no-repeat; - background-position: 3px center; - background-size: 24px; + background-position: 3px top; + background-size: 20px; padding-left: 37px; min-height: 16px; } @@ -4660,6 +4670,8 @@ td span.text_block_bold { } @media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 13 / 10), only screen and (min-resolution: 120dpi) { + .history-writeMetadatas, + .history-subdefCreation, .history-collection, .history-status, .history-print, @@ -4671,7 +4683,7 @@ td span.text_block_bold { .history-edit, .history-validate, .history-push { - background-size: 16px 16px; + background-size: 20px 20px; } } diff --git a/Phraseanet-production-client/dist/production.js b/Phraseanet-production-client/dist/production.js index fa01ab9fbf..dba6476d56 100644 --- a/Phraseanet-production-client/dist/production.js +++ b/Phraseanet-production-client/dist/production.js @@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.userModule = exports.utilsModule = exports.commonModule = exports.dialogModule = undefined; -var _common = __webpack_require__(96); +var _common = __webpack_require__(95); var _common2 = _interopRequireDefault(_common); @@ -873,7 +873,7 @@ var singleton = null; var singletonCounter = 0; var stylesInsertedAtTop = []; -var fixUrls = __webpack_require__(191); +var fixUrls = __webpack_require__(190); module.exports = function(list, options) { if (typeof DEBUG !== "undefined" && DEBUG) { @@ -1617,7 +1617,6 @@ function setPref(name, value) { }, dataType: 'json', timeout: _jquery2.default.data[prefName] = false, - error: _jquery2.default.data[prefName] = false, success: function success(data) { if (data.success) { humane.info(data.message); @@ -1626,6 +1625,12 @@ function setPref(name, value) { } _jquery2.default.data[prefName] = false; return data; + }, + error: function error(data) { + _jquery2.default.data[prefName] = false; + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); return _jquery2.default.data[prefName]; @@ -1640,7 +1645,7 @@ exports.default = { setPref: setPref }; "use strict"; -var implementation = __webpack_require__(135); +var implementation = __webpack_require__(134); module.exports = Function.prototype.bind || implementation; @@ -1712,21 +1717,21 @@ var _underscore = __webpack_require__(2); var _underscore2 = _interopRequireDefault(_underscore); -var _markerCollection = __webpack_require__(156); +var _markerCollection = __webpack_require__(155); var _markerCollection2 = _interopRequireDefault(_markerCollection); -var _markerGLCollection = __webpack_require__(157); +var _markerGLCollection = __webpack_require__(156); var _markerGLCollection2 = _interopRequireDefault(_markerGLCollection); var _utils = __webpack_require__(42); -var _provider = __webpack_require__(158); +var _provider = __webpack_require__(157); var _provider2 = _interopRequireDefault(_provider); -var _fr = __webpack_require__(159); +var _fr = __webpack_require__(158); var _fr2 = _interopRequireDefault(_fr); @@ -1734,19 +1739,19 @@ var _lodash = __webpack_require__(4); var _lodash2 = _interopRequireDefault(_lodash); -var _mapboxGlGeocoder = __webpack_require__(160); +var _mapboxGlGeocoder = __webpack_require__(159); var _mapboxGlGeocoder2 = _interopRequireDefault(_mapboxGlGeocoder); -__webpack_require__(189); +__webpack_require__(188); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -__webpack_require__(192); -__webpack_require__(196); -__webpack_require__(198); -__webpack_require__(200); -__webpack_require__(204); +__webpack_require__(191); +__webpack_require__(195); +__webpack_require__(197); +__webpack_require__(199); +__webpack_require__(203); var leafletMap = function leafletMap(services) { var configService = services.configService, @@ -2590,7 +2595,7 @@ var leafletMap = function leafletMap(services) { // To draw a circle overlay with a radius in meters, use L.circle() return L.circleMarker(latlng, { radius: feature.properties.radius || 10 }); } else { - var marker = __webpack_require__(85); //L.marker(feature); + var marker = __webpack_require__(84); //L.marker(feature); return marker.style(feature, latlng, { accessToken: activeProvider.accessToken }); } } @@ -3503,6 +3508,10 @@ var publication = function publication(services) { _jquery2.default.post(url + 'prod/feeds/requestavailable/', options, function (data) { return openModal(data); + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); return; @@ -3802,10 +3811,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -__webpack_require__(103); +__webpack_require__(102); __webpack_require__(38); -__webpack_require__(104); +__webpack_require__(103); var workzoneFacets = function workzoneFacets(services) { @@ -3873,7 +3882,7 @@ var workzoneFacets = function workzoneFacets(services) { var values = _.map(_.sortBy(facet.values, sortIteration), function (value) { var type = facet.type; // todo : define a new phraseanet "color" type for fields. for now we push a "type" for every value, copied from field type // patch "color" type values - var textLimit = 15; // cut long values (set to 0 to not cut) + var textLimit = 35; // cut long values (set to 0 to not cut) var text = value.value.toString(); var label = text; var title = text; @@ -3882,7 +3891,6 @@ var workzoneFacets = function workzoneFacets(services) { if (match && match[2] != null) { // text looks like a color ! var colorCode = '#' + match[2]; - // add color circle and remove color code from text; var textWithoutColorCode = text.replace('[' + colorCode + ']', ''); if (textLimit > 0 && textWithoutColorCode.length > textLimit) { textWithoutColorCode = textWithoutColorCode.substring(0, textLimit) + '…'; @@ -3890,7 +3898,9 @@ var workzoneFacets = function workzoneFacets(services) { // patch type = "COLOR-AGGREGATE"; label = textWithoutColorCode; + textWithoutColorCode = (0, _jquery2.default)('').text(textWithoutColorCode).html(); // escape html tooltip = _.escape(textWithoutColorCode); + title = ' ' + tooltip; } else { // keep text as it is, just cut if too long @@ -3898,7 +3908,7 @@ var workzoneFacets = function workzoneFacets(services) { text = text.substring(0, textLimit) + '…'; } label = text; - /*title = tooltip = _.escape(text);*/ + title = (0, _jquery2.default)('').text(text).html(); // escape html } return { @@ -3952,8 +3962,6 @@ var workzoneFacets = function workzoneFacets(services) { treeSource = _shouldMaskNodes(treeSource, hiddenFacetsList); } - treeSource = _parseColors(treeSource); - treeSource = _colorUnsetText(treeSource); return _getFacetsTree().reload(treeSource).done(function () { @@ -3969,7 +3977,7 @@ var workzoneFacets = function workzoneFacets(services) { (0, _jquery2.default)(el).hide(); } }); - ul.append(''); + ul.append(''); } }); (0, _jquery2.default)('.see_more_btn').on('click', function () { @@ -3980,18 +3988,6 @@ var workzoneFacets = function workzoneFacets(services) { }); }; - function _parseColors(source) { - _.forEach(source, function (facet) { - if (!_.isUndefined(facet.children) && facet.children.length > 0) { - _.forEach(facet.children, function (child) { - var title = child.title; - child.title = _formatColorText(title.toString()); - }); - } - }); - return source; - } - function _formatColorText(string) { var textLimit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; @@ -4006,11 +4002,13 @@ var workzoneFacets = function workzoneFacets(services) { if (textLimit > 0 && textWithoutColorCode.length > textLimit) { textWithoutColorCode = textWithoutColorCode.substring(0, textLimit) + '…'; } + textWithoutColorCode = (0, _jquery2.default)('').text(textWithoutColorCode).html(); // escape html return '' + ' ' + textWithoutColorCode; } else { if (textLimit > 0 && string.length > textLimit) { string = string.substring(0, textLimit) + '…'; } + string = (0, _jquery2.default)('').text(string).html(); // escape html return string; } } @@ -4402,6 +4400,10 @@ var sharebasketModal = function sharebasketModal(services, datas) { $dialog.setContent(data); _onDialogReady(); return; + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); return true; @@ -4439,11 +4441,11 @@ var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); -var _pushOrShare = __webpack_require__(109); +var _pushOrShare = __webpack_require__(108); var _pushOrShare2 = _interopRequireDefault(_pushOrShare); -var _listManager = __webpack_require__(110); +var _listManager = __webpack_require__(109); var _listManager2 = _interopRequireDefault(_listManager); @@ -4969,19 +4971,19 @@ var _phraseanetCommon = __webpack_require__(11); var appCommons = _interopRequireWildcard(_phraseanetCommon); -var _toolbar = __webpack_require__(122); +var _toolbar = __webpack_require__(121); var _toolbar2 = _interopRequireDefault(_toolbar); -var _mainMenu = __webpack_require__(79); +var _mainMenu = __webpack_require__(78); var _mainMenu2 = _interopRequireDefault(_mainMenu); -var _keyboard = __webpack_require__(224); +var _keyboard = __webpack_require__(217); var _keyboard2 = _interopRequireDefault(_keyboard); -var _cgu = __webpack_require__(225); +var _cgu = __webpack_require__(218); var _cgu2 = _interopRequireDefault(_cgu); @@ -4993,11 +4995,11 @@ var _export = __webpack_require__(76); var _export2 = _interopRequireDefault(_export); -var _share = __webpack_require__(226); +var _share = __webpack_require__(219); var _share2 = _interopRequireDefault(_share); -var _index = __webpack_require__(78); +var _index = __webpack_require__(220); var _index2 = _interopRequireDefault(_index); @@ -5017,7 +5019,7 @@ var _preferences = __webpack_require__(229); var _preferences2 = _interopRequireDefault(_preferences); -var _order = __webpack_require__(80); +var _order = __webpack_require__(79); var _order2 = _interopRequireDefault(_order); @@ -5056,6 +5058,7 @@ var ui = function ui(services) { (0, _removeFromBasket2.default)(services).initialize(); (0, _print2.default)(services).initialize(); (0, _share2.default)(services).initialize(options); + (0, _index2.default)(services).initialize(options); (0, _cgu2.default)(services).initialize(options); (0, _preferences2.default)(services).initialize(options); (0, _order2.default)(services).initialize(options); @@ -5469,7 +5472,7 @@ var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); -var _index = __webpack_require__(124); +var _index = __webpack_require__(123); var _index2 = _interopRequireDefault(_index); @@ -5531,6 +5534,13 @@ var editRecord = function editRecord(services) { success: function success(data) { (0, _jquery2.default)('#EDITWINDOW').removeClass('loading').empty().html(data); + // if the user have not "edit" right in all selected document + if (window.recordEditorConfig.state.T_records.length === 0) { + (0, _jquery2.default)('#EDITWINDOW').removeClass('loading').hide(); + + return; + } + if (window.recordEditorConfig.hasMultipleDatabases === true) { (0, _jquery2.default)('#EDITWINDOW').removeClass('loading').hide(); @@ -5546,8 +5556,11 @@ var editRecord = function editRecord(services) { (0, _jquery2.default)('#tooltip').hide(); return; }, - error: function error(XHR, textStatus, errorThrown) { - if (XHR.status === 0) { + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } + if (data.status === 0) { return false; } } @@ -5647,9 +5660,9 @@ exports.default = editRecord; "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_video_js__ = __webpack_require__(130); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_video_js__ = __webpack_require__(129); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_video_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_video_js__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_videojs_swf_package_json__ = __webpack_require__(153); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_videojs_swf_package_json__ = __webpack_require__(152); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_videojs_swf_package_json___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_videojs_swf_package_json__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_global_window__ = __webpack_require__(44); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_global_window___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_global_window__); @@ -7107,7 +7120,7 @@ Flash.VERSION = version$1; "use strict"; -var keys = __webpack_require__(136); +var keys = __webpack_require__(135); var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; var toStr = Object.prototype.toString; @@ -7173,7 +7186,7 @@ module.exports = defineProperties; var bind = __webpack_require__(49); -var ES = __webpack_require__(138); +var ES = __webpack_require__(137); var replace = bind.call(Function.call, String.prototype.replace); var leftWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/; @@ -7259,7 +7272,7 @@ return mapboxgl; "use strict"; -var browser = __webpack_require__(168); +var browser = __webpack_require__(167); var MapiClient = __webpack_require__(73); function BrowserClient(options) { @@ -7294,7 +7307,7 @@ module.exports = createBrowserClient; var parseToken = __webpack_require__(74); -var MapiRequest = __webpack_require__(174); +var MapiRequest = __webpack_require__(173); var constants = __webpack_require__(46); /** @@ -7338,7 +7351,7 @@ module.exports = MapiClient; "use strict"; -var base64 = __webpack_require__(173); +var base64 = __webpack_require__(172); var tokenCache = {}; @@ -7490,6 +7503,11 @@ var exportRecord = function exportRecord(services) { } else { _onExportReady($dialog, window.exportConfig); } + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); @@ -7718,10 +7736,10 @@ var exportRecord = function exportRecord(services) { return false; }); - (0, _jquery2.default)('input[name="obj[]"]', (0, _jquery2.default)('#download, #sendmail, #ftp')).bind('change', function () { + (0, _jquery2.default)('input.caption', (0, _jquery2.default)('#download, #sendmail, #ftp')).bind('change', function () { var $form = (0, _jquery2.default)(this).closest('form'); - if ((0, _jquery2.default)('input.caption[name="obj[]"]:checked', $form).length > 0) { + if ((0, _jquery2.default)('input.caption:checked', $form).length > 0) { (0, _jquery2.default)('div.businessfields', $form).show(); } else { (0, _jquery2.default)('div.businessfields', $form).hide(); @@ -7822,7 +7840,10 @@ var exportRecord = function exportRecord(services) { return true; } - return { initialize: initialize, openModal: openModal }; + return { + initialize: initialize, + openModal: openModal + }; }; exports.default = exportRecord; @@ -7911,6 +7932,11 @@ var printRecord = function printRecord(services) { success: function success(data) { (0, _jquery2.default)('#DIALOG').removeClass('loading').empty().append(data); return; + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); } @@ -7921,137 +7947,8 @@ var printRecord = function printRecord(services) { exports.default = printRecord; /***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _jquery = __webpack_require__(0); - -var _jquery2 = _interopRequireDefault(_jquery); - -var _dialog = __webpack_require__(1); - -var _dialog2 = _interopRequireDefault(_dialog); - -var _videoScreenCapture = __webpack_require__(218); - -var _videoScreenCapture2 = _interopRequireDefault(_videoScreenCapture); - -var _videoRangeCapture = __webpack_require__(221); - -var _videoRangeCapture2 = _interopRequireDefault(_videoRangeCapture); - -var _videoSubtitleCapture = __webpack_require__(222); - -var _videoSubtitleCapture2 = _interopRequireDefault(_videoSubtitleCapture); - -var _rx = __webpack_require__(8); - -var Rx = _interopRequireWildcard(_rx); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -__webpack_require__(223); - - -var humane = __webpack_require__(9); - -var recordVideoEditorModal = function recordVideoEditorModal(services, datas) { - var activeTab = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var configService = services.configService, - localeService = services.localeService, - appEvents = services.appEvents; - - var url = configService.get('baseUrl'); - var $dialog = null; - var toolsStream = new Rx.Subject(); - - var initialize = function initialize() { - - (0, _jquery2.default)(document).on('click', '.video-tools-record-action', function (event) { - event.preventDefault(); - var $el = (0, _jquery2.default)(event.currentTarget); - var idLst = $el.data("idlst"); - var datas = {}; - var key = "lst"; - datas[key] = idLst; - openModal(datas, activeTab); - }); - }; - initialize(); - - toolsStream.subscribe(function (params) { - switch (params.action) { - case 'refresh': - openModal.apply(null, params.options); - break; - default: - } - }); - var openModal = function openModal(datas, activeTab) { - $dialog = _dialog2.default.create(services, { - size: 'Custom', - customWidth: 1100, - customHeight: 700, - title: localeService.t('videoEditor'), - loading: true - }); - - return _jquery2.default.get(url + 'prod/tools/videoEditor', datas, function (data) { - $dialog.setContent(data); - $dialog.setOption('contextArgs', datas); - $dialog.getDomElement().closest('.ui-dialog').addClass('videoEditor_dialog'); - _onModalReady(data, window.toolsConfig, activeTab); - return; - }); - }; - - var _onModalReady = function _onModalReady(template, data, activeTab) { - - var $scope = (0, _jquery2.default)('#prod-tool-box'); - var tabs = (0, _jquery2.default)('#tool-tabs', $scope).tabs(); - if (activeTab !== false) { - tabs.tabs('option', 'active', activeTab); - } - - // available if only 1 record is selected: - if (data.isVideo === "true") { - (0, _videoScreenCapture2.default)(services).initialize({ $container: $scope, data: data }); - (0, _videoRangeCapture2.default)(services).initialize({ $container: (0, _jquery2.default)('.video-range-editor-container'), data: data, services: services }); - (0, _videoSubtitleCapture2.default)(services).initialize({ $container: (0, _jquery2.default)('.video-subtitle-editor-container'), data: data, services: services }); - } else { - var confirmationDialog = _dialog2.default.create(services, { - size: 'Alert', - title: localeService.t('warning'), - closeOnEscape: true - }, 3); - - var content = (0, _jquery2.default)('').css({ - 'text-align': 'center', - width: '100%', - 'font-size': '14px' - }).append(localeService.t('error video editor')); - confirmationDialog.setContent(content); - $dialog.close(); - } - }; - - return { openModal: openModal }; -}; - -exports.default = recordVideoEditorModal; - -/***/ }), -/* 79 */, -/* 80 */ +/* 78 */, +/* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8310,7 +8207,7 @@ var order = function order(services) { exports.default = order; /***/ }), -/* 81 */ +/* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8419,7 +8316,7 @@ var resultInfos = function resultInfos(services) { exports.default = resultInfos; /***/ }), -/* 82 */ +/* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8471,10 +8368,10 @@ module.exports = { /***/ }), -/* 83 */ +/* 82 */ /***/ (function(module, exports, __webpack_require__) { -var html_sanitize = __webpack_require__(206); +var html_sanitize = __webpack_require__(205); module.exports = function(_) { if (!_) return ''; @@ -8495,14 +8392,14 @@ function cleanId(id) { return id; } /***/ }), -/* 84 */ +/* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var config = __webpack_require__(86), - version = __webpack_require__(87).version; +var config = __webpack_require__(85), + version = __webpack_require__(86).version; module.exports = function(path, accessToken) { accessToken = accessToken || L.mapbox.accessToken; @@ -8562,15 +8459,15 @@ module.exports.style = function(styleURL, accessToken) { /***/ }), -/* 85 */ +/* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var format_url = __webpack_require__(84), - util = __webpack_require__(82), - sanitize = __webpack_require__(83); +var format_url = __webpack_require__(83), + util = __webpack_require__(81), + sanitize = __webpack_require__(82); // mapbox-related markers functionality // provide an icon from mapbox's simple-style spec and hosted markers @@ -8634,7 +8531,7 @@ module.exports = { /***/ }), -/* 86 */ +/* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8649,18 +8546,18 @@ module.exports = { /***/ }), -/* 87 */ +/* 86 */ /***/ (function(module, exports) { -module.exports = {"_args":[["mapbox.js@2.4.0","/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox.js@2.4.0","_id":"mapbox.js@2.4.0","_inBundle":false,"_integrity":"sha1-xDsISl3XEzTIPuHfKPpnRD1zwpw=","_location":"/mapbox.js","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"mapbox.js@2.4.0","name":"mapbox.js","escapedName":"mapbox.js","rawSpec":"2.4.0","saveSpec":null,"fetchSpec":"2.4.0"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox.js/-/mapbox.js-2.4.0.tgz","_spec":"2.4.0","_where":"/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client","author":{"name":"Mapbox"},"bugs":{"url":"https://github.com/mapbox/mapbox.js/issues"},"dependencies":{"corslite":"0.0.6","isarray":"0.0.1","leaflet":"0.7.7","mustache":"2.2.1","sanitize-caja":"0.1.3"},"description":"mapbox javascript api","devDependencies":{"browserify":"^13.0.0","clean-css":"~2.0.7","eslint":"^0.23.0","expect.js":"0.3.1","happen":"0.1.3","leaflet-fullscreen":"0.0.4","leaflet-hash":"0.2.1","marked":"~0.3.0","minifyify":"^6.1.0","minimist":"0.0.5","mocha":"2.4.5","mocha-phantomjs":"4.0.2","sinon":"1.10.2"},"engines":{"node":"*"},"homepage":"http://mapbox.com/","license":"BSD-3-Clause","main":"src/index.js","name":"mapbox.js","optionalDependencies":{},"repository":{"type":"git","url":"git://github.com/mapbox/mapbox.js.git"},"scripts":{"test":"eslint --no-eslintrc -c .eslintrc src && mocha-phantomjs test/index.html"},"version":"2.4.0"} +module.exports = {"_args":[["mapbox.js@2.4.0","/var/alchemy/Phraseanet/Phraseanet-production-client"]],"_from":"mapbox.js@2.4.0","_id":"mapbox.js@2.4.0","_inBundle":false,"_integrity":"sha1-xDsISl3XEzTIPuHfKPpnRD1zwpw=","_location":"/mapbox.js","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"mapbox.js@2.4.0","name":"mapbox.js","escapedName":"mapbox.js","rawSpec":"2.4.0","saveSpec":null,"fetchSpec":"2.4.0"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/mapbox.js/-/mapbox.js-2.4.0.tgz","_spec":"2.4.0","_where":"/var/alchemy/Phraseanet/Phraseanet-production-client","author":{"name":"Mapbox"},"bugs":{"url":"https://github.com/mapbox/mapbox.js/issues"},"dependencies":{"corslite":"0.0.6","isarray":"0.0.1","leaflet":"0.7.7","mustache":"2.2.1","sanitize-caja":"0.1.3"},"description":"mapbox javascript api","devDependencies":{"browserify":"^13.0.0","clean-css":"~2.0.7","eslint":"^0.23.0","expect.js":"0.3.1","happen":"0.1.3","leaflet-fullscreen":"0.0.4","leaflet-hash":"0.2.1","marked":"~0.3.0","minifyify":"^6.1.0","minimist":"0.0.5","mocha":"2.4.5","mocha-phantomjs":"4.0.2","sinon":"1.10.2"},"engines":{"node":"*"},"homepage":"http://mapbox.com/","license":"BSD-3-Clause","main":"src/index.js","name":"mapbox.js","optionalDependencies":{},"repository":{"type":"git","url":"git://github.com/mapbox/mapbox.js.git"},"scripts":{"test":"eslint --no-eslintrc -c .eslintrc src && mocha-phantomjs test/index.html"},"version":"2.4.0"} /***/ }), -/* 88 */ +/* 87 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {var topLevel = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : {} -var minDoc = __webpack_require__(131); +var minDoc = __webpack_require__(130); var doccy; @@ -8679,7 +8576,7 @@ module.exports = doccy; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5))) /***/ }), -/* 89 */ +/* 88 */ /***/ (function(module, exports) { function clean (s) { @@ -8698,7 +8595,7 @@ module.exports = function tsml (sa) { } /***/ }), -/* 90 */ +/* 89 */ /***/ (function(module, exports) { module.exports = SafeParseTuple @@ -8718,14 +8615,14 @@ function SafeParseTuple(obj, reviver) { /***/ }), -/* 91 */ +/* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var window = __webpack_require__(44) -var isFunction = __webpack_require__(132) -var parseHeaders = __webpack_require__(133) +var isFunction = __webpack_require__(131) +var parseHeaders = __webpack_require__(132) var xtend = __webpack_require__(37) module.exports = createXHR @@ -8966,8 +8863,8 @@ function noop() {} /***/ }), -/* 92 */, -/* 93 */ +/* 91 */, +/* 92 */ /***/ (function(module, exports) { // Copyright Joyent, Inc. and other Node contributors. @@ -9275,8 +9172,8 @@ function isUndefined(arg) { /***/ }), -/* 94 */, -/* 95 */ +/* 93 */, +/* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9290,7 +9187,7 @@ var _utils = __webpack_require__(42); var utils = _interopRequireWildcard(_utils); -var _bootstrap = __webpack_require__(98); +var _bootstrap = __webpack_require__(97); var _bootstrap2 = _interopRequireDefault(_bootstrap); @@ -9322,7 +9219,7 @@ if (typeof window !== 'undefined') { module.exports = ProductionApplication; /***/ }), -/* 96 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9338,7 +9235,7 @@ var _jquery2 = _interopRequireDefault(_jquery); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var cookie = __webpack_require__(97); // @TODO enable lints +var cookie = __webpack_require__(96); // @TODO enable lints /* eslint-disable max-len*/ /* eslint-disable object-shorthand*/ /* eslint-disable dot-notation*/ @@ -9483,7 +9380,7 @@ exports.default = { }; /***/ }), -/* 97 */ +/* 96 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -9656,7 +9553,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! /***/ }), -/* 98 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9680,11 +9577,11 @@ var _publication = __webpack_require__(58); var _publication2 = _interopRequireDefault(_publication); -var _workzone = __webpack_require__(99); +var _workzone = __webpack_require__(98); var _workzone2 = _interopRequireDefault(_workzone); -var _notifyLayout = __webpack_require__(121); +var _notifyLayout = __webpack_require__(120); var _notifyLayout2 = _interopRequireDefault(_notifyLayout); @@ -10017,7 +9914,7 @@ var bootstrap = function bootstrap(userConfig) { exports.default = bootstrap; /***/ }), -/* 99 */ +/* 98 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10027,8 +9924,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); @@ -10037,7 +9932,7 @@ var _phraseanetCommon = __webpack_require__(11); var appCommons = _interopRequireWildcard(_phraseanetCommon); -var _index = __webpack_require__(100); +var _index = __webpack_require__(99); var _index2 = _interopRequireDefault(_index); @@ -10045,7 +9940,7 @@ var _index3 = __webpack_require__(60); var _index4 = _interopRequireDefault(_index3); -var _index5 = __webpack_require__(105); +var _index5 = __webpack_require__(104); var _index6 = _interopRequireDefault(_index5); @@ -10061,7 +9956,7 @@ var _dialog = __webpack_require__(1); var _dialog2 = _interopRequireDefault(_dialog); -var _reminder = __webpack_require__(120); +var _reminder = __webpack_require__(119); var _reminder2 = _interopRequireDefault(_reminder); @@ -10150,7 +10045,14 @@ var workzone = function workzone(services) { $container.on('click', '.feedback-reminder', function (event) { event.preventDefault(); var $el = (0, _jquery2.default)(event.currentTarget); - (0, _reminder2.default)(services).openModal($el.data('basket-id')); + var options = {}; + if ($el.parents('.feedback-block').length) { + options = { title: localeService.t('feedbackReminderTitle') }; + } else if ($el.parents('.share-block').length) { + options = { title: localeService.t('shareSendEmailTitle') }; + } + + (0, _reminder2.default)(services).openModal($el.data('basket-id'), options); }); $container.on('click', '#basket-filter .refresh-basket', function () { @@ -10179,12 +10081,35 @@ var workzone = function workzone(services) { updatePublicationList(exposeName); }); + (0, _jquery2.default)('#expose_title_filter').on('keyup', function (event) { + if ((0, _jquery2.default)(this).val().length > 2 || (0, _jquery2.default)(this).val().length === 0) { + var exposeName = (0, _jquery2.default)('#expose_list').val(); + (0, _jquery2.default)('.publication-list').empty().html(''); + updatePublicationList(exposeName); + } + }); + (0, _jquery2.default)('.refresh-list').on('click', function (event) { var exposeName = (0, _jquery2.default)('#expose_list').val(); (0, _jquery2.default)('.publication-list').empty().html(''); updatePublicationList(exposeName); }); + (0, _jquery2.default)('.publication-pagination').on('click', function (event) { + var exposeName = (0, _jquery2.default)('#expose_list').val(); + (0, _jquery2.default)('.publication-list').empty().html(''); + var pageEl = (0, _jquery2.default)('#expose_workzone .publication-page'); + var page = pageEl.text(); + + if ((0, _jquery2.default)(this).hasClass('previous-publication')) { + page = parseInt(page) - 1; + } else if ((0, _jquery2.default)(this).hasClass('next-publication')) { + page = parseInt(page) + 1; + } + + updatePublicationList(exposeName, page); + }); + (0, _jquery2.default)('#expose_list').on('change', function () { (0, _jquery2.default)('.publication-list').empty().html(''); updatePublicationList(this.value); @@ -10247,6 +10172,10 @@ var workzone = function workzone(services) { data: formData, success: function success(data) { (0, _jquery2.default)('#DIALOG-field-mapping').dialog('close'); + }, + error: function error(xhr, status, _error) { + var err = JSON.parse(xhr.responseText); + alert(err.message); } }); }); @@ -10318,6 +10247,21 @@ var workzone = function workzone(services) { } }); + (0, _jquery2.default)('#DIALOG-field-mapping').on('click', '.checkbox-field-mapping', function () { + if ((0, _jquery2.default)(this).is(":checked")) { + var nameEl = (0, _jquery2.default)(this).attr('data-field-name'); + var inputName = (0, _jquery2.default)(this).closest('div').find('.name-expose-side'); + var labelText = (0, _jquery2.default)(this).closest('label').find('span').text(); + inputName.attr('name', nameEl); + inputName.attr('value', labelText); + inputName.removeClass('hidden'); + } else { + var _inputName = (0, _jquery2.default)(this).closest('div').find('.name-expose-side'); + _inputName.removeAttr('name'); + _inputName.addClass('hidden'); + } + }); + (0, _jquery2.default)('#DIALOG-field-mapping').on('click', '#save-subdef-mapping', function (event) { event.preventDefault(); if ((0, _jquery2.default)('#subdef-profile-mapping').val() == '') { @@ -10333,6 +10277,10 @@ var workzone = function workzone(services) { data: formData, success: function success(data) { (0, _jquery2.default)('#DIALOG-field-mapping').dialog('close'); + }, + error: function error(xhr, status, _error2) { + var err = JSON.parse(xhr.responseText); + alert(err.message); } }); }); @@ -10565,6 +10513,11 @@ var workzone = function workzone(services) { }, success: function success(data) { return; + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); }); @@ -11055,17 +11008,18 @@ var workzone = function workzone(services) { var publicationId = (0, _jquery2.default)(this).attr('data-publication-id'); var exposeName = (0, _jquery2.default)('#expose_list').val(); var assetsContainer = (0, _jquery2.default)(this).parents('.expose_item_deployed'); - var positions = []; + var order = []; (0, _jquery2.default)('.assets_list .chim-wrapper').each(function (i, el) { - positions[(0, _jquery2.default)(this).attr('data-pub-asset-id')] = i + 1; + order.push((0, _jquery2.default)(this).attr('data-pub-asset-id')); }); _jquery2.default.ajax({ type: 'POST', url: '/prod/expose/publication/update-assets-order/?exposeName=' + exposeName, data: { - listPositions: JSON.stringify(_extends({}, positions)) + order: order, + publicationId: publicationId }, dataType: 'json', success: function success(data) { @@ -11092,7 +11046,8 @@ var workzone = function workzone(services) { dataType: 'json', data: { exposeName: '' + exposeName, - publicationData: publicationData + publicationData: publicationData, + prodExposeEdit_token: (0, _jquery2.default)(this).find('input[name="prodExposeEdit_token"]').val() }, success: function success(data) { if (data.success) { @@ -11117,13 +11072,15 @@ var workzone = function workzone(services) { } function updatePublicationList(exposeName) { + var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; _jquery2.default.ajax({ type: 'GET', - url: '/prod/expose/list-publication/?exposeName=' + exposeName, + url: '/prod/expose/list-publication/?exposeName=' + exposeName + '&page=' + page, data: { mine: (0, _jquery2.default)("#expose_mine_only").is(':checked') ? 1 : 0, - editable: (0, _jquery2.default)("#expose_editable_only").is(':checked') ? 1 : 0 + editable: (0, _jquery2.default)("#expose_editable_only").is(':checked') ? 1 : 0, + title: (0, _jquery2.default)("#expose_title_filter").val() }, success: function success(data) { if ('twig' in data) { @@ -11163,19 +11120,54 @@ var workzone = function workzone(services) { (0, _jquery2.default)('.expose_connected').empty().text(loggedMessage); (0, _jquery2.default)('.expose_logout_link').removeClass('hidden'); (0, _jquery2.default)('.expose_field_mapping').removeClass('hidden'); + (0, _jquery2.default)('.add_publication').removeClass('hidden'); (0, _jquery2.default)('.add_expose_block').removeClass('hidden'); + (0, _jquery2.default)('.expose-pagination').removeClass('hidden'); } else { (0, _jquery2.default)('.expose_connected').empty(); (0, _jquery2.default)('.expose_logout_link').addClass('hidden'); (0, _jquery2.default)('.expose_field_mapping').addClass('hidden'); + (0, _jquery2.default)('.add_publication').addClass('hidden'); (0, _jquery2.default)('.add_expose_block').addClass('hidden'); + (0, _jquery2.default)('.expose-pagination').addClass('hidden'); + } + + if ('previousPage' in data) { + if (data.previousPage) { + (0, _jquery2.default)('#expose_workzone .previous-publication').removeClass('hidden'); + (0, _jquery2.default)('#expose_workzone .publication-page').removeClass('hidden'); + } else { + (0, _jquery2.default)('#expose_workzone .previous-publication').addClass('hidden'); + } + } + + if ('nextPage' in data) { + if (data.nextPage) { + (0, _jquery2.default)('#expose_workzone .next-publication').removeClass('hidden'); + (0, _jquery2.default)('#expose_workzone .publication-page').removeClass('hidden'); + } else { + (0, _jquery2.default)('#expose_workzone .next-publication').addClass('hidden'); + } + } + + if ('previousPage' in data && 'nextPage' in data && !data.previousPage && !data.nextPage) { + (0, _jquery2.default)('#expose_workzone .publication-page').addClass('hidden'); } if ('error' in data) { (0, _jquery2.default)('.publication-list').empty().html(data.error); } + + (0, _jquery2.default)('#expose_workzone .nb_item').text(data.nbItems); + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); + + (0, _jquery2.default)('#expose_workzone .publication-page').text(page); } function getPublicationAssetsList(publicationId, exposeName, assetsContainer) { @@ -11603,11 +11595,13 @@ var workzone = function workzone(services) { }, dataType: 'json', success: function success(data) { - setTimeout(function () { - getPublicationAssetsList(publicationId, exposeName, assetsContainer, 1); - }, 6000); - - console.log(data.message); + if (data.success) { + setTimeout(function () { + getPublicationAssetsList(publicationId, exposeName, assetsContainer, 1); + }, 6000); + } else { + (0, _jquery2.default)('.refresh-list').trigger('click'); + } } }); } @@ -11685,7 +11679,7 @@ var workzone = function workzone(services) { exports.default = workzone; /***/ }), -/* 100 */ +/* 99 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11699,13 +11693,13 @@ var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); -var _index = __webpack_require__(101); +var _index = __webpack_require__(100); var _index2 = _interopRequireDefault(_index); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -__webpack_require__(102); +__webpack_require__(101); var workzoneThesaurus = function workzoneThesaurus(services) { var configService = services.configService, @@ -11752,7 +11746,7 @@ var workzoneThesaurus = function workzoneThesaurus(services) { exports.default = workzoneThesaurus; /***/ }), -/* 101 */ +/* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12366,7 +12360,9 @@ var thesaurusService = function thesaurusService(services) { sbas[i].seeker = _jquery2.default.ajax({ url: _zurl, type: 'POST', - data: [], + data: { + prodTabThesaurus_token: (0, _jquery2.default)('form.thesaurus-filter-submit-action input[name=prodTabThesaurus_token]').val() + }, dataType: 'json', success: function success(j) { var z = '#TX_P\\.' + j.parm.sbid + '\\.T'; @@ -12403,7 +12399,9 @@ var thesaurusService = function thesaurusService(services) { sbas[i].seeker = _jquery2.default.ajax({ url: zurl, type: 'POST', - data: [], + data: { + prodTabThesaurus_token: (0, _jquery2.default)('form.thesaurus-filter-submit-action input[name=prodTabThesaurus_token]').val() + }, dataType: 'json', success: function success(j) { var z = '#TX_P\\.' + j.parm.sbid + '\\.T'; @@ -13336,19 +13334,19 @@ var thesaurusService = function thesaurusService(services) { exports.default = thesaurusService; /***/ }), -/* 102 */ +/* 101 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), -/* 103 */ +/* 102 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), -/* 104 */ +/* 103 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(jQuery) {/*! @@ -17695,7 +17693,7 @@ $.extend($.ui.fancytree, /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) /***/ }), -/* 105 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17709,43 +17707,43 @@ var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); -var _delete = __webpack_require__(106); +var _delete = __webpack_require__(105); var _delete2 = _interopRequireDefault(_delete); -var _quitshare = __webpack_require__(107); +var _quitshare = __webpack_require__(106); var _quitshare2 = _interopRequireDefault(_quitshare); -var _actions = __webpack_require__(108); +var _actions = __webpack_require__(107); var _actions2 = _interopRequireDefault(_actions); -var _archive = __webpack_require__(113); +var _archive = __webpack_require__(112); var _archive2 = _interopRequireDefault(_archive); -var _create = __webpack_require__(114); +var _create = __webpack_require__(113); var _create2 = _interopRequireDefault(_create); -var _create3 = __webpack_require__(115); +var _create3 = __webpack_require__(114); var _create4 = _interopRequireDefault(_create3); -var _update = __webpack_require__(116); +var _update = __webpack_require__(115); var _update2 = _interopRequireDefault(_update); -var _browse = __webpack_require__(117); +var _browse = __webpack_require__(116); var _browse2 = _interopRequireDefault(_browse); -var _reorderContent = __webpack_require__(118); +var _reorderContent = __webpack_require__(117); var _reorderContent2 = _interopRequireDefault(_reorderContent); -var _reorderContent3 = __webpack_require__(119); +var _reorderContent3 = __webpack_require__(118); var _reorderContent4 = _interopRequireDefault(_reorderContent3); @@ -17827,7 +17825,7 @@ var workzoneBaskets = function workzoneBaskets(services) { exports.default = workzoneBaskets; /***/ }), -/* 106 */ +/* 105 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17985,6 +17983,11 @@ var deleteBasket = function deleteBasket(services) { } return false; + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); }; @@ -18016,7 +18019,7 @@ var deleteBasket = function deleteBasket(services) { exports.default = deleteBasket; /***/ }), -/* 107 */ +/* 106 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18126,7 +18129,7 @@ var quitshareBasket = function quitshareBasket(services) { exports.default = quitshareBasket; /***/ }), -/* 108 */ +/* 107 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18183,7 +18186,7 @@ var shareBasket = function shareBasket(services) { exports.default = shareBasket; /***/ }), -/* 109 */ +/* 108 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18951,7 +18954,7 @@ pushOrShare.prototype = { exports.default = pushOrShare; /***/ }), -/* 110 */ +/* 109 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18969,11 +18972,11 @@ var _jquery2 = _interopRequireDefault(_jquery); var _index = __webpack_require__(63); -var _listEditor = __webpack_require__(111); +var _listEditor = __webpack_require__(110); var _listEditor2 = _interopRequireDefault(_listEditor); -var _listShare = __webpack_require__(112); +var _listShare = __webpack_require__(111); var _listShare2 = _interopRequireDefault(_listShare); @@ -19613,7 +19616,7 @@ ListManager.prototype = { exports.default = ListManager; /***/ }), -/* 111 */ +/* 110 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19701,7 +19704,7 @@ var listEditor = function listEditor(services, options) { exports.default = listEditor; /***/ }), -/* 112 */ +/* 111 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19873,7 +19876,7 @@ var listShare = function listShare(services, options) { exports.default = listShare; /***/ }), -/* 113 */ +/* 112 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -19935,6 +19938,11 @@ var archiveBasket = function archiveBasket(services) { alert(data.message); } return; + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); } @@ -19945,7 +19953,7 @@ var archiveBasket = function archiveBasket(services) { exports.default = archiveBasket; /***/ }), -/* 114 */ +/* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20010,6 +20018,10 @@ var basketCreate = function basketCreate(services) { $dialog.setContent(data); _onDialogReady(); return; + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); }; @@ -20068,7 +20080,7 @@ var basketCreate = function basketCreate(services) { exports.default = basketCreate; /***/ }), -/* 115 */ +/* 114 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20125,7 +20137,7 @@ var storyCreate = function storyCreate(services) { var dialogOptions = (0, _lodash2.default)({ - size: 'Small', + size: 'Medium', loading: false }, options); var $dialog = _dialog2.default.create(services, dialogOptions); @@ -20142,6 +20154,11 @@ var storyCreate = function storyCreate(services) { _onDialogReady(); return; + }, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } } }); }; @@ -20149,6 +20166,7 @@ var storyCreate = function storyCreate(services) { var _onDialogReady = function _onDialogReady() { var $dialog = _dialog2.default.get(1); var $dialogBox = $dialog.getDomElement(); + var $selectCollection = (0, _jquery2.default)('select[name="base_id"]', $dialogBox); (0, _jquery2.default)('input[name="lst"]', $dialogBox).val(searchSelectionSerialized); @@ -20172,6 +20190,29 @@ var storyCreate = function storyCreate(services) { $dialog.setOption('buttons', buttons); + if ($selectCollection.val() == '') { + (0, _jquery2.default)('.create-story-name', $dialogBox).hide(); + (0, _jquery2.default)('.create-story-name input', $dialogBox).prop('disabled', true); + } + + $selectCollection.change(function () { + var that = (0, _jquery2.default)(this); + if (that.val() != '') { + // first hide all input and show only the corresponding field for the selected db + (0, _jquery2.default)('.create-story-name', $dialogBox).hide(); + // mark as disabled to no process the hidden field when submit + (0, _jquery2.default)('.create-story-name input', $dialogBox).prop('disabled', true); + var sbasId = that.find('option:selected').data('sbas'); + (0, _jquery2.default)('.sbas-' + sbasId, $dialogBox).show(); + (0, _jquery2.default)('.sbas-' + sbasId + ' input', $dialogBox).prop('disabled', false); + (0, _jquery2.default)('.create-story-name-title', $dialogBox).show(); + } else { + (0, _jquery2.default)('.create-story-name-title', $dialogBox).hide(); + (0, _jquery2.default)('.create-story-name', $dialogBox).hide(); + (0, _jquery2.default)('.create-story-name input', $dialogBox).prop('disabled', true); + } + }); + (0, _jquery2.default)('input[name="lst"]', $dialogBox).change(function () { var that = this; if ((0, _jquery2.default)(that).is(":checked")) { @@ -20182,10 +20223,18 @@ var storyCreate = function storyCreate(services) { if ((0, _jquery2.default)('form #multiple_databox', $dialogBox).val() === '1') { alert(localeService.t('warning-multiple-databoxes')); - (0, _jquery2.default)(that).prop("checked", false); + (0, _jquery2.default)(that).prop('checked', false); } } else { (0, _jquery2.default)('form', $dialogBox).removeClass('story-filter-db'); + if ($selectCollection.val() != '') { + (0, _jquery2.default)('.create-story-name', $dialogBox).hide(); + (0, _jquery2.default)('.create-story-name input', $dialogBox).prop('disabled', true); + var sbasId = $selectCollection.find('option:selected').data('sbas'); + (0, _jquery2.default)('.sbas-' + sbasId, $dialogBox).show(); + (0, _jquery2.default)('.sbas-' + sbasId + ' input', $dialogBox).prop('disabled', false); + (0, _jquery2.default)('.create-story-name-title', $dialogBox).show(); + } } }); @@ -20199,7 +20248,7 @@ var storyCreate = function storyCreate(services) { return; } - if ((0, _jquery2.default)('select[name="base_id"]', $dialogBox).val() == '') { + if ($selectCollection.val() == '') { alert(localeService.t('choose-collection')); event.preventDefault(); @@ -20246,7 +20295,7 @@ var storyCreate = function storyCreate(services) { exports.default = storyCreate; /***/ }), -/* 116 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20317,6 +20366,10 @@ var basketUpdate = function basketUpdate(services) { $dialog.setContent(data); _onDialogReady(); return; + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); }; @@ -20363,7 +20416,7 @@ var basketUpdate = function basketUpdate(services) { exports.default = basketUpdate; /***/ }), -/* 117 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20666,7 +20719,7 @@ var basketBrowse = function basketBrowse(services) { exports.default = basketBrowse; /***/ }), -/* 118 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -20740,7 +20793,12 @@ var basketReorderContent = function basketReorderContent(services) { return _jquery2.default.get(url + 'prod/baskets/' + basketId + '/reorder/', function (data) { $dialog.setContent(data); _onDialogReady(); + return; + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); }; @@ -20950,7 +21008,7 @@ var basketReorderContent = function basketReorderContent(services) { exports.default = basketReorderContent; /***/ }), -/* 119 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21018,7 +21076,12 @@ var storyReorderContent = function storyReorderContent(services) { return _jquery2.default.get(url + 'prod/story/' + dbId + '/' + recordId + '/reorder/', function (data) { $dialog.setContent(data); _onDialogReady(); + return; + }).fail(function (data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } }); }; @@ -21234,7 +21297,7 @@ var storyReorderContent = function storyReorderContent(services) { exports.default = storyReorderContent; /***/ }), -/* 120 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21271,7 +21334,6 @@ var feedbackReminder = function feedbackReminder(services) { var dialogOptions = (0, _lodash2.default)({ size: '558x415', loading: false, - title: localeService.t('feedbackReminderTitle'), closeButton: true }, options); @@ -21341,7 +21403,7 @@ var feedbackReminder = function feedbackReminder(services) { exports.default = feedbackReminder; /***/ }), -/* 121 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21592,7 +21654,7 @@ var notifyLayout = function notifyLayout(services) { exports.default = notifyLayout; /***/ }), -/* 122 */ +/* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21606,7 +21668,7 @@ var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); -var _move = __webpack_require__(123); +var _move = __webpack_require__(122); var _move2 = _interopRequireDefault(_move); @@ -21614,7 +21676,7 @@ var _edit = __webpack_require__(66); var _edit2 = _interopRequireDefault(_edit); -var _delete = __webpack_require__(210); +var _delete = __webpack_require__(209); var _delete2 = _interopRequireDefault(_delete); @@ -21622,7 +21684,7 @@ var _export = __webpack_require__(76); var _export2 = _interopRequireDefault(_export); -var _property = __webpack_require__(211); +var _property = __webpack_require__(210); var _property2 = _interopRequireDefault(_property); @@ -21630,15 +21692,15 @@ var _sharebasketModal = __webpack_require__(61); var _sharebasketModal2 = _interopRequireDefault(_sharebasketModal); -var _pushbasketModal = __webpack_require__(212); +var _pushbasketModal = __webpack_require__(211); var _pushbasketModal2 = _interopRequireDefault(_pushbasketModal); -var _publish = __webpack_require__(213); +var _publish = __webpack_require__(212); var _publish2 = _interopRequireDefault(_publish); -var _index = __webpack_require__(214); +var _index = __webpack_require__(213); var _index2 = _interopRequireDefault(_index); @@ -21646,14 +21708,10 @@ var _print = __webpack_require__(77); var _print2 = _interopRequireDefault(_print); -var _bridge = __webpack_require__(216); +var _bridge = __webpack_require__(215); var _bridge2 = _interopRequireDefault(_bridge); -var _index3 = __webpack_require__(78); - -var _index4 = _interopRequireDefault(_index3); - var _lodash = __webpack_require__(4); var _lodash2 = _interopRequireDefault(_lodash); @@ -21666,6 +21724,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// import usersListsModal from '../../userslists/index'; var toolbar = function toolbar(services) { var configService = services.configService, localeService = services.localeService, @@ -21824,13 +21883,6 @@ var toolbar = function toolbar(services) { $el.data('action-state', !state); }); - /** - * tools > Edit > VideoEditor - */ - $container.on('click', '.video-tools-record-action', function (event) { - _triggerModal(event, (0, _index4.default)(services).openModal, false); - }); - /** * tools > Edit > Move */ @@ -22030,11 +22082,11 @@ var toolbar = function toolbar(services) { return { initialize: initialize }; }; -// import usersListsModal from '../../userslists/index'; + exports.default = toolbar; /***/ }), -/* 123 */ +/* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -22103,7 +22155,8 @@ var moveRecord = function moveRecord(services) { var datas = { lst: (0, _jquery2.default)('input[name="lst"]', $form).val(), base_id: (0, _jquery2.default)('select[name="base_id"]', $form).val(), - chg_coll_son: coll_son + chg_coll_son: coll_son, + prodMoveCollection_token: (0, _jquery2.default)('input[name="prodMoveCollection_token"]', $form).val() }; var buttonPanel = $dialog.getDomElement().closest('.ui-dialog').find('.ui-dialog-buttonpane'); @@ -22130,7 +22183,12 @@ var moveRecord = function moveRecord(services) { return _jquery2.default.ajax({ type: 'POST', url: url + 'prod/records/movecollection/', - data: datas + data: datas, + error: function error(data) { + if (data.status === 403 && data.getResponseHeader('x-phraseanet-end-session')) { + self.location.replace(self.location.href); // refresh will redirect to login + } + } }); }; @@ -22149,7 +22207,7 @@ var moveRecord = function moveRecord(services) { exports.default = moveRecord; /***/ }), -/* 124 */ +/* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -22181,27 +22239,27 @@ var _utils = __webpack_require__(42); var _sprintfJs = __webpack_require__(45); -var _layout = __webpack_require__(125); +var _layout = __webpack_require__(124); var _layout2 = _interopRequireDefault(_layout); -var _presets = __webpack_require__(126); +var _presets = __webpack_require__(125); var _presets2 = _interopRequireDefault(_presets); -var _searchReplace = __webpack_require__(127); +var _searchReplace = __webpack_require__(126); var _searchReplace2 = _interopRequireDefault(_searchReplace); -var _preview = __webpack_require__(128); +var _preview = __webpack_require__(127); var _preview2 = _interopRequireDefault(_preview); -var _thesaurusDatasource = __webpack_require__(154); +var _thesaurusDatasource = __webpack_require__(153); var _thesaurusDatasource2 = _interopRequireDefault(_thesaurusDatasource); -var _geonameDatasource = __webpack_require__(155); +var _geonameDatasource = __webpack_require__(154); var _geonameDatasource2 = _interopRequireDefault(_geonameDatasource); @@ -22213,7 +22271,7 @@ var _emitter = __webpack_require__(15); var _emitter2 = _interopRequireDefault(_emitter); -var _recordCollection = __webpack_require__(207); +var _recordCollection = __webpack_require__(206); var _recordCollection2 = _interopRequireDefault(_recordCollection); @@ -22221,7 +22279,7 @@ var _fieldCollection = __webpack_require__(52); var _fieldCollection2 = _interopRequireDefault(_fieldCollection); -var _statusCollection = __webpack_require__(209); +var _statusCollection = __webpack_require__(208); var _statusCollection2 = _interopRequireDefault(_statusCollection); @@ -22250,6 +22308,7 @@ var recordEditorService = function recordEditorService(services) { var $editTimeArea = void 0; var $editMonoValTextArea = void 0; var $editMultiValTextArea = void 0; + var $searchThesaurus = void 0; var $toolsTabs = void 0; var $idExplain = void 0; var $dateFormat = /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}$|^\d{4}\/\d{2}\/\d{2}$|^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$|^\d{4}-\d{2}-\d{2}$/; @@ -22277,6 +22336,7 @@ var recordEditorService = function recordEditorService(services) { $editMultiValTextArea = (0, _jquery2.default)('#EditTextMultiValued', options.$container); $toolsTabs = (0, _jquery2.default)('#EDIT_MID_R .tabs', options.$container); $idExplain = (0, _jquery2.default)('#idExplain', options.$container); + $searchThesaurus = (0, _jquery2.default)('.editor-thesaurus-search', options.$container); $toolsTabs.tabs({ activate: function activate(event, ui) { @@ -22411,6 +22471,10 @@ var recordEditorService = function recordEditorService(services) { $editTimeArea.hide(); $editDateArea.css('width', 210); } + }).on('mouseup mousedown keyup keydown', '.editor-thesaurus-search', function (event) { + var currentField = options.fieldCollection.getActiveField(); + + onUserInputComplete(event, $searchThesaurus.val(), currentField); }); }; @@ -22656,6 +22720,8 @@ var recordEditorService = function recordEditorService(services) { function onSelectField(evt, fieldIndex) { $editTextArea.blur(); $editMultiValTextArea.blur(); + $searchThesaurus.blur(); + (0, _jquery2.default)('.editDiaButtons', options.$container).hide(); (0, _jquery2.default)($editTextArea, $editMultiValTextArea).unbind('keyup.maxLength'); @@ -22772,6 +22838,8 @@ var recordEditorService = function recordEditorService(services) { if (field.type === 'date') { $editTextArea.hide(); $editDateArea.show(); + $searchThesaurus.hide(); + (0, _jquery2.default)('#idEditDateZone', options.$container).show(); $editDateArea.val(field._value); @@ -22788,12 +22856,25 @@ var recordEditorService = function recordEditorService(services) { $editTimeArea.hide(); $editDateArea.css('width', 210); } + + if (field.input_disable) { + $editDateArea.prop('disabled', true); + } else { + $editDateArea.prop('disabled', false); + } } else { $editDateArea.hide(); $editTimeArea.hide(); (0, _jquery2.default)('#idEditDateZone', options.$container).hide(); $editTextArea.show(); $editTextArea.css('height', '100%'); + $searchThesaurus.show(); + + if (field.input_disable) { + $editTextArea.prop('disabled', true); + } else { + $editTextArea.prop('disabled', false); + } } $ztextStatus.hide(); @@ -22854,10 +22935,18 @@ var recordEditorService = function recordEditorService(services) { $editMultiValTextArea.trigger('keyup.maxLength'); + if (field.input_disable) { + $editMultiValTextArea.prop('disabled', true); + } else { + $editMultiValTextArea.prop('disabled', false); + } + self.setTimeout(function () { return $editMultiValTextArea.focus(); }, 50); + $searchThesaurus.show(); + // reveal_mval(); } } @@ -22985,6 +23074,9 @@ var recordEditorService = function recordEditorService(services) { $editTextArea.blur(); $editMultiValTextArea.blur(); + $searchThesaurus.blur(); + + $searchThesaurus.hide(); (0, _jquery2.default)('#idFieldNameEdit', options.$container).html('[STATUS]'); $idExplain.html(' '); @@ -23903,7 +23995,7 @@ var recordEditorService = function recordEditorService(services) { exports.default = recordEditorService; /***/ }), -/* 125 */ +/* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24063,7 +24155,7 @@ var recordEditorLayout = function recordEditorLayout(services) { exports.default = recordEditorLayout; /***/ }), -/* 126 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24319,7 +24411,7 @@ var presetsModule = function presetsModule(services) { exports.default = presetsModule; /***/ }), -/* 127 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24444,7 +24536,7 @@ var searchReplace = function searchReplace(services) { exports.default = searchReplace; /***/ }), -/* 128 */ +/* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24462,7 +24554,7 @@ var _pym = __webpack_require__(17); var _pym2 = _interopRequireDefault(_pym); -var _videoEditor = __webpack_require__(129); +var _videoEditor = __webpack_require__(128); var _videoEditor2 = _interopRequireDefault(_videoEditor); @@ -24668,7 +24760,7 @@ var preview = function preview(services) { exports.default = preview; /***/ }), -/* 129 */ +/* 128 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24729,7 +24821,7 @@ var videoEditor = function videoEditor(services) { __webpack_require__.e/* require.ensure */(1/* duplicate */).then((function () { // load videoJs lib - rangeCapture = __webpack_require__(92).default; + rangeCapture = __webpack_require__(91).default; rangeCaptureInstance = rangeCapture(services); rangeCaptureInstance.initialize(params, options); @@ -24765,7 +24857,7 @@ var videoEditor = function videoEditor(services) { exports.default = videoEditor; /***/ }), -/* 130 */ +/* 129 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -24783,11 +24875,11 @@ exports.default = videoEditor; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var window = _interopDefault(__webpack_require__(44)); -var document = _interopDefault(__webpack_require__(88)); -var tsml = _interopDefault(__webpack_require__(89)); -var safeParseTuple = _interopDefault(__webpack_require__(90)); -var xhr = _interopDefault(__webpack_require__(91)); -var vtt = _interopDefault(__webpack_require__(149)); +var document = _interopDefault(__webpack_require__(87)); +var tsml = _interopDefault(__webpack_require__(88)); +var safeParseTuple = _interopDefault(__webpack_require__(89)); +var xhr = _interopDefault(__webpack_require__(90)); +var vtt = _interopDefault(__webpack_require__(148)); var version = "6.13.0"; @@ -50107,13 +50199,13 @@ module.exports = videojs; /***/ }), -/* 131 */ +/* 130 */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), -/* 132 */ +/* 131 */ /***/ (function(module, exports) { module.exports = isFunction @@ -50134,11 +50226,11 @@ function isFunction (fn) { /***/ }), -/* 133 */ +/* 132 */ /***/ (function(module, exports, __webpack_require__) { -var trim = __webpack_require__(134) - , forEach = __webpack_require__(148) +var trim = __webpack_require__(133) + , forEach = __webpack_require__(147) , isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; } @@ -50171,7 +50263,7 @@ module.exports = function (headers) { /***/ }), -/* 134 */ +/* 133 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50182,7 +50274,7 @@ var define = __webpack_require__(68); var implementation = __webpack_require__(69); var getPolyfill = __webpack_require__(70); -var shim = __webpack_require__(147); +var shim = __webpack_require__(146); var boundTrim = bind.call(Function.call, getPolyfill()); @@ -50196,7 +50288,7 @@ module.exports = boundTrim; /***/ }), -/* 135 */ +/* 134 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50255,7 +50347,7 @@ module.exports = function bind(that) { /***/ }), -/* 136 */ +/* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50265,7 +50357,7 @@ module.exports = function bind(that) { var has = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var slice = Array.prototype.slice; -var isArgs = __webpack_require__(137); +var isArgs = __webpack_require__(136); var isEnumerable = Object.prototype.propertyIsEnumerable; var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); @@ -50403,7 +50495,7 @@ module.exports = keysShim; /***/ }), -/* 137 */ +/* 136 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50427,28 +50519,28 @@ module.exports = function isArguments(value) { /***/ }), -/* 138 */ +/* 137 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var GetIntrinsic = __webpack_require__(139); +var GetIntrinsic = __webpack_require__(138); var $Object = GetIntrinsic('%Object%'); var $TypeError = GetIntrinsic('%TypeError%'); var $String = GetIntrinsic('%String%'); -var $isNaN = __webpack_require__(140); -var $isFinite = __webpack_require__(141); +var $isNaN = __webpack_require__(139); +var $isFinite = __webpack_require__(140); -var sign = __webpack_require__(142); -var mod = __webpack_require__(143); +var sign = __webpack_require__(141); +var mod = __webpack_require__(142); var IsCallable = __webpack_require__(50); -var toPrimitive = __webpack_require__(144); +var toPrimitive = __webpack_require__(143); -var has = __webpack_require__(146); +var has = __webpack_require__(145); // https://es5.github.io/#x9 var ES5 = { @@ -50676,7 +50768,7 @@ module.exports = ES5; /***/ }), -/* 139 */ +/* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50860,7 +50952,7 @@ module.exports = function GetIntrinsic(name, allowMissing) { /***/ }), -/* 140 */ +/* 139 */ /***/ (function(module, exports) { module.exports = Number.isNaN || function isNaN(a) { @@ -50869,7 +50961,7 @@ module.exports = Number.isNaN || function isNaN(a) { /***/ }), -/* 141 */ +/* 140 */ /***/ (function(module, exports) { var $isNaN = Number.isNaN || function (a) { return a !== a; }; @@ -50878,7 +50970,7 @@ module.exports = Number.isFinite || function (x) { return typeof x === 'number' /***/ }), -/* 142 */ +/* 141 */ /***/ (function(module, exports) { module.exports = function sign(number) { @@ -50887,7 +50979,7 @@ module.exports = function sign(number) { /***/ }), -/* 143 */ +/* 142 */ /***/ (function(module, exports) { module.exports = function mod(number, modulo) { @@ -50897,7 +50989,7 @@ module.exports = function mod(number, modulo) { /***/ }), -/* 144 */ +/* 143 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50905,7 +50997,7 @@ module.exports = function mod(number, modulo) { var toStr = Object.prototype.toString; -var isPrimitive = __webpack_require__(145); +var isPrimitive = __webpack_require__(144); var isCallable = __webpack_require__(50); @@ -50941,7 +51033,7 @@ module.exports = function ToPrimitive(input, PreferredType) { /***/ }), -/* 145 */ +/* 144 */ /***/ (function(module, exports) { module.exports = function isPrimitive(value) { @@ -50950,7 +51042,7 @@ module.exports = function isPrimitive(value) { /***/ }), -/* 146 */ +/* 145 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50962,7 +51054,7 @@ module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); /***/ }), -/* 147 */ +/* 146 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50979,7 +51071,7 @@ module.exports = function shimStringTrim() { /***/ }), -/* 148 */ +/* 147 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -51048,7 +51140,7 @@ module.exports = forEach; /***/ }), -/* 149 */ +/* 148 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -51075,9 +51167,9 @@ module.exports = forEach; var window = __webpack_require__(44); var vttjs = module.exports = { - WebVTT: __webpack_require__(150), - VTTCue: __webpack_require__(151), - VTTRegion: __webpack_require__(152) + WebVTT: __webpack_require__(149), + VTTCue: __webpack_require__(150), + VTTRegion: __webpack_require__(151) }; window.vttjs = vttjs; @@ -51104,7 +51196,7 @@ if (!window.VTTCue) { /***/ }), -/* 150 */ +/* 149 */ /***/ (function(module, exports) { /** @@ -52439,7 +52531,7 @@ module.exports = WebVTT; /***/ }), -/* 151 */ +/* 150 */ /***/ (function(module, exports) { /** @@ -52750,7 +52842,7 @@ module.exports = VTTCue; /***/ }), -/* 152 */ +/* 151 */ /***/ (function(module, exports) { /** @@ -52890,13 +52982,13 @@ module.exports = VTTRegion; /***/ }), -/* 153 */ +/* 152 */ /***/ (function(module, exports) { -module.exports = {"_args":[["videojs-swf@5.4.1","/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client"]],"_from":"videojs-swf@5.4.1","_id":"videojs-swf@5.4.1","_inBundle":false,"_integrity":"sha1-IHfvccdJ8seCPvSbq65N0qywj4c=","_location":"/videojs-swf","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"videojs-swf@5.4.1","name":"videojs-swf","escapedName":"videojs-swf","rawSpec":"5.4.1","saveSpec":null,"fetchSpec":"5.4.1"},"_requiredBy":["/videojs-flash"],"_resolved":"https://registry.npmjs.org/videojs-swf/-/videojs-swf-5.4.1.tgz","_spec":"5.4.1","_where":"/home/esokia-6/work/work41/Phraseanet/Phraseanet-production-client","author":{"name":"Brightcove"},"bugs":{"url":"https://github.com/videojs/video-js-swf/issues"},"copyright":"Copyright 2014 Brightcove, Inc. https://github.com/videojs/video-js-swf/blob/master/LICENSE","description":"The Flash-fallback video player for video.js (http://videojs.com)","devDependencies":{"async":"~0.2.9","chg":"^0.3.2","flex-sdk":"4.6.0-0","grunt":"~0.4.0","grunt-bumpup":"~0.5.0","grunt-cli":"~0.1.0","grunt-connect":"~0.2.0","grunt-contrib-jshint":"~0.4.3","grunt-contrib-qunit":"~0.2.1","grunt-contrib-watch":"~0.1.4","grunt-npm":"~0.0.2","grunt-prompt":"~0.1.2","grunt-shell":"~0.6.1","grunt-tagrelease":"~0.3.1","qunitjs":"~1.12.0","video.js":"^5.9.2"},"homepage":"http://videojs.com","keywords":["flash","video","player"],"name":"videojs-swf","repository":{"type":"git","url":"git+https://github.com/videojs/video-js-swf.git"},"scripts":{"version":"chg release -y && grunt dist && git add -f dist/ && git add CHANGELOG.md"},"version":"5.4.1"} +module.exports = {"_args":[["videojs-swf@5.4.1","/var/alchemy/Phraseanet/Phraseanet-production-client"]],"_from":"videojs-swf@5.4.1","_id":"videojs-swf@5.4.1","_inBundle":false,"_integrity":"sha1-IHfvccdJ8seCPvSbq65N0qywj4c=","_location":"/videojs-swf","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"videojs-swf@5.4.1","name":"videojs-swf","escapedName":"videojs-swf","rawSpec":"5.4.1","saveSpec":null,"fetchSpec":"5.4.1"},"_requiredBy":["/videojs-flash"],"_resolved":"https://registry.npmjs.org/videojs-swf/-/videojs-swf-5.4.1.tgz","_spec":"5.4.1","_where":"/var/alchemy/Phraseanet/Phraseanet-production-client","author":{"name":"Brightcove"},"bugs":{"url":"https://github.com/videojs/video-js-swf/issues"},"copyright":"Copyright 2014 Brightcove, Inc. https://github.com/videojs/video-js-swf/blob/master/LICENSE","description":"The Flash-fallback video player for video.js (http://videojs.com)","devDependencies":{"async":"~0.2.9","chg":"^0.3.2","flex-sdk":"4.6.0-0","grunt":"~0.4.0","grunt-bumpup":"~0.5.0","grunt-cli":"~0.1.0","grunt-connect":"~0.2.0","grunt-contrib-jshint":"~0.4.3","grunt-contrib-qunit":"~0.2.1","grunt-contrib-watch":"~0.1.4","grunt-npm":"~0.0.2","grunt-prompt":"~0.1.2","grunt-shell":"~0.6.1","grunt-tagrelease":"~0.3.1","qunitjs":"~1.12.0","video.js":"^5.9.2"},"homepage":"http://videojs.com","keywords":["flash","video","player"],"name":"videojs-swf","repository":{"type":"git","url":"git+https://github.com/videojs/video-js-swf.git"},"scripts":{"version":"chg release -y && grunt dist && git add -f dist/ && git add CHANGELOG.md"},"version":"5.4.1"} /***/ }), -/* 154 */ +/* 153 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53117,7 +53209,7 @@ var thesaurusDatasource = function thesaurusDatasource(services) { exports.default = thesaurusDatasource; /***/ }), -/* 155 */ +/* 154 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53431,7 +53523,7 @@ var geonameDatasource = function geonameDatasource(services) { exports.default = geonameDatasource; /***/ }), -/* 156 */ +/* 155 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53560,7 +53652,7 @@ var markerCollection = function markerCollection(services) { exports.default = markerCollection; /***/ }), -/* 157 */ +/* 156 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53741,7 +53833,7 @@ var markerGLCollection = function markerGLCollection(services) { exports.default = markerGLCollection; /***/ }), -/* 158 */ +/* 157 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53925,7 +54017,7 @@ exports.default = provider; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) /***/ }), -/* 159 */ +/* 158 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -54033,22 +54125,22 @@ var leafletLocaleFr = { exports.default = leafletLocaleFr; /***/ }), -/* 160 */ +/* 159 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Typeahead = __webpack_require__(161); -var debounce = __webpack_require__(165); +var Typeahead = __webpack_require__(160); +var debounce = __webpack_require__(164); var extend = __webpack_require__(37); -var EventEmitter = __webpack_require__(93).EventEmitter; -var exceptions = __webpack_require__(166); -var MapboxClient = __webpack_require__(167); -var mbxGeocoder = __webpack_require__(177); -var MapboxEventManager = __webpack_require__(185); -var localization = __webpack_require__(187); -var subtag = __webpack_require__(188); +var EventEmitter = __webpack_require__(92).EventEmitter; +var exceptions = __webpack_require__(165); +var MapboxClient = __webpack_require__(166); +var mbxGeocoder = __webpack_require__(176); +var MapboxEventManager = __webpack_require__(184); +var localization = __webpack_require__(186); +var subtag = __webpack_require__(187); /** * A geocoder component using the [Mapbox Geocoding API](https://docs.mapbox.com/api/search/#geocoding) @@ -55071,7 +55163,7 @@ module.exports = MapboxGeocoder; /***/ }), -/* 161 */ +/* 160 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -55132,20 +55224,20 @@ module.exports = MapboxGeocoder; * * new Suggestions(input, data); */ -var Suggestions = __webpack_require__(162); +var Suggestions = __webpack_require__(161); window.Suggestions = module.exports = Suggestions; /***/ }), -/* 162 */ +/* 161 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var extend = __webpack_require__(37); -var fuzzy = __webpack_require__(163); -var List = __webpack_require__(164); +var fuzzy = __webpack_require__(162); +var List = __webpack_require__(163); var Suggestions = function(el, data, options) { options = options || {}; @@ -55400,7 +55492,7 @@ module.exports = Suggestions; /***/ }), -/* 163 */ +/* 162 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -55550,7 +55642,7 @@ fuzzy.filter = function(pattern, arr, opts) { /***/ }), -/* 164 */ +/* 163 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -55668,7 +55760,7 @@ module.exports = List; /***/ }), -/* 165 */ +/* 164 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {/** @@ -56052,7 +56144,7 @@ module.exports = debounce; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5))) /***/ }), -/* 166 */ +/* 165 */ /***/ (function(module, exports) { module.exports = { @@ -56076,7 +56168,7 @@ module.exports = { /***/ }), -/* 167 */ +/* 166 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56088,16 +56180,16 @@ module.exports = client; /***/ }), -/* 168 */ +/* 167 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var MapiResponse = __webpack_require__(169); -var MapiError = __webpack_require__(171); +var MapiResponse = __webpack_require__(168); +var MapiError = __webpack_require__(170); var constants = __webpack_require__(46); -var parseHeaders = __webpack_require__(172); +var parseHeaders = __webpack_require__(171); // Keys are request IDs, values are XHRs. var requestsUnderway = {}; @@ -56220,13 +56312,13 @@ module.exports = { /***/ }), -/* 169 */ +/* 168 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var parseLinkHeader = __webpack_require__(170); +var parseLinkHeader = __webpack_require__(169); /** * A Mapbox API response. @@ -56287,7 +56379,7 @@ module.exports = MapiResponse; /***/ }), -/* 170 */ +/* 169 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56369,7 +56461,7 @@ module.exports = parseLinkHeader; /***/ }), -/* 171 */ +/* 170 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56440,7 +56532,7 @@ module.exports = MapiError; /***/ }), -/* 172 */ +/* 171 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56490,7 +56582,7 @@ module.exports = parseHeaders; /***/ }), -/* 173 */ +/* 172 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ @@ -56661,7 +56753,7 @@ module.exports = parseHeaders; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)(module), __webpack_require__(5))) /***/ }), -/* 174 */ +/* 173 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56669,8 +56761,8 @@ module.exports = parseHeaders; var parseToken = __webpack_require__(74); var xtend = __webpack_require__(37); -var EventEmitter = __webpack_require__(175); -var urlUtils = __webpack_require__(176); +var EventEmitter = __webpack_require__(174); +var urlUtils = __webpack_require__(175); var constants = __webpack_require__(46); var requestId = 1; @@ -56930,7 +57022,7 @@ module.exports = MapiRequest; /***/ }), -/* 175 */ +/* 174 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57273,7 +57365,7 @@ if (true) { /***/ }), -/* 176 */ +/* 175 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57400,17 +57492,17 @@ module.exports = { /***/ }), -/* 177 */ +/* 176 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var xtend = __webpack_require__(37); -var v = __webpack_require__(178); -var pick = __webpack_require__(181); -var stringifyBooleans = __webpack_require__(182); -var createServiceFactory = __webpack_require__(184); +var v = __webpack_require__(177); +var pick = __webpack_require__(180); +var stringifyBooleans = __webpack_require__(181); +var createServiceFactory = __webpack_require__(183); /** * Geocoding API service. @@ -57606,14 +57698,14 @@ module.exports = createServiceFactory(Geocoding); /***/ }), -/* 178 */ +/* 177 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) { var xtend = __webpack_require__(37); -var v = __webpack_require__(179); +var v = __webpack_require__(178); function file(value) { // If we're in a browser so Blob is available, the file must be that. @@ -57663,7 +57755,7 @@ module.exports = xtend(v, { /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5))) /***/ }), -/* 179 */ +/* 178 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57674,7 +57766,7 @@ module.exports = xtend(v, { * to display a helpful error message. * They can also return a function for a custom error message. */ -var isPlainObject = __webpack_require__(180); +var isPlainObject = __webpack_require__(179); var xtend = __webpack_require__(37); var DEFAULT_ERROR_PATH = 'value'; @@ -58050,7 +58142,7 @@ module.exports = v; /***/ }), -/* 180 */ +/* 179 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -58064,7 +58156,7 @@ module.exports = function (x) { /***/ }), -/* 181 */ +/* 180 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -58101,13 +58193,13 @@ module.exports = pick; /***/ }), -/* 182 */ +/* 181 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var objectMap = __webpack_require__(183); +var objectMap = __webpack_require__(182); /** * Stringify all the boolean values in an object, so true becomes "true". @@ -58125,7 +58217,7 @@ module.exports = stringifyBoolean; /***/ }), -/* 183 */ +/* 182 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -58142,7 +58234,7 @@ module.exports = objectMap; /***/ }), -/* 184 */ +/* 183 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -58170,12 +58262,12 @@ module.exports = createServiceFactory; /***/ }), -/* 185 */ +/* 184 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanoid = __webpack_require__(186) +var nanoid = __webpack_require__(185) /** * Construct a new mapbox event client to send interaction events to the mapbox event service @@ -58488,7 +58580,7 @@ module.exports = MapboxEventManager; /***/ }), -/* 186 */ +/* 185 */ /***/ (function(module, exports, __webpack_require__) { // This file replaces `index.js` in bundlers like webpack or Rollup, @@ -58548,7 +58640,7 @@ module.exports = function (size) { /***/ }), -/* 187 */ +/* 186 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -58591,7 +58683,7 @@ module.exports = {placeholder: placeholder}; /***/ }), -/* 188 */ +/* 187 */ /***/ (function(module, exports) { !function(root, name, make) { @@ -58647,13 +58739,13 @@ module.exports = {placeholder: placeholder}; /***/ }), -/* 189 */ +/* 188 */ /***/ (function(module, exports, __webpack_require__) { // style-loader: Adds some css to the DOM by adding a + diff --git a/templates/web/admin/editusers.html.twig b/templates/web/admin/editusers.html.twig index d4f76fdd98..bd71bcdc28 100644 --- a/templates/web/admin/editusers.html.twig +++ b/templates/web/admin/editusers.html.twig @@ -111,7 +111,8 @@{% trans %}Order{% endtrans %} | +{% trans %}Order{% endtrans %} : | <%= field.sorter %> | +meta_structure_id : | +<%= field.id %> | ||||||||||||||
+ | <%= field.name %> | |||||||||||||||||
+ |
| | ||||||||||||||||
+ | ||||||||||||||||||
@@ -139,7 +141,7 @@ |
+ | <% if(field['vocabulary-type'] != null && field['vocabulary-type'] != '') { %> | |||
+ | + + | +|||
{{ 'subdef.substituable' | trans }} | ++ | ++ | ||
{{ 'classe' | trans }}
@@ -620,6 +626,13 @@
{% if selected %}checked="checked"{% endif %}/>{{ pot_value }}
{% endfor %}
+ {% elseif option.getType() == constant('\\Alchemy\\Phrasea\\Media\\Subdef\\OptionType\\OptionType::TYPE_ENUM_BUTTON') %}
+
+ {% for label, pot_value in option.getAvailableValues() %}
+ {{ label }}
+ {% endfor %}
+
{% endif %}
|
diff --git a/templates/web/admin/tree.html.twig b/templates/web/admin/tree.html.twig
index 075d1e263d..3c70a3938c 100644
--- a/templates/web/admin/tree.html.twig
+++ b/templates/web/admin/tree.html.twig
@@ -58,6 +58,21 @@
{% endif %}
+ {% if app.getAclForUser(app.getAuthenticatedUser()).is_admin() %}
+ |
+ + + |