Merge branch 'master' into PHRAS-2739-incorporate-subdefwebhook

This commit is contained in:
Nicolas Maillat
2019-12-12 12:07:17 +01:00
committed by GitHub
49 changed files with 3193 additions and 1782 deletions

View File

@@ -107,6 +107,53 @@ jobs:
- store_artifacts:
path: /tmp/circleci-test-results
build_phraseanet-fpm:
machine:
image: ubuntu-1604:201903-01
docker_layer_caching: true
working_directory: ~/alchemy-fr/Phraseanet
steps:
- checkout
- aws-ecr/ecr-login:
region: AWS_DEFAULT_REGION
- run: docker build --target phraseanet-fpm -t ${AWS_ACCOUNT_URL}/phraseanet-fpm:${CIRCLE_BRANCH} .
- aws-ecr/push-image:
account-url: AWS_ACCOUNT_URL
repo: "phraseanet-fpm"
tag: "${CIRCLE_BRANCH}"
build_phraseanet-worker:
machine:
image: ubuntu-1604:201903-01
docker_layer_caching: true
working_directory: ~/alchemy-fr/Phraseanet
steps:
- checkout
- aws-ecr/ecr-login:
region: AWS_DEFAULT_REGION
- run: docker build --target phraseanet-worker -t ${AWS_ACCOUNT_URL}/phraseanet-worker:${CIRCLE_BRANCH} .
- aws-ecr/push-image:
account-url: AWS_ACCOUNT_URL
repo: "phraseanet-worker"
tag: "${CIRCLE_BRANCH}"
build_phraseanet-nginx:
machine:
image: ubuntu-1604:201903-01
docker_layer_caching: true
working_directory: ~/alchemy-fr/Phraseanet
steps:
- checkout
- aws-ecr/ecr-login:
region: AWS_DEFAULT_REGION
- run: docker build --target phraseanet-nginx -t ${AWS_ACCOUNT_URL}/phraseanet-nginx:${CIRCLE_BRANCH} .
- aws-ecr/push-image:
account-url: AWS_ACCOUNT_URL
repo: "phraseanet-nginx"
tag: "${CIRCLE_BRANCH}"
workflows:
version: 2
oldfashion:
@@ -114,36 +161,9 @@ workflows:
- build
newfashion:
jobs:
- aws-ecr/build_and_push_image:
account-url: AWS_ACCOUNT_URL
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
- build_phraseanet-fpm:
context: "AWS London"
create-repo: true
dockerfile: Dockerfile
extra-build-args: "--target phraseanet-fpm"
region: AWS_DEFAULT_REGION
repo: "${AWS_RESOURCE_NAME_PREFIX}/phraseanet"
tag: "alpha-0.1"
- aws-ecr/build_and_push_image:
account-url: AWS_ACCOUNT_URL
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
- build_phraseanet-worker:
context: "AWS London"
create-repo: true
dockerfile: Dockerfile
extra-build-args: "--target phraseanet-nginx"
region: AWS_DEFAULT_REGION
repo: "${AWS_RESOURCE_NAME_PREFIX}/phraseanet-nginx"
tag: "alpha-0.1"
- aws-ecr/build_and_push_image:
account-url: AWS_ACCOUNT_URL
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
- build_phraseanet-nginx:
context: "AWS London"
create-repo: true
dockerfile: Dockerfile
extra-build-args: "--target phraseanet-worker"
region: AWS_DEFAULT_REGION
repo: "${AWS_RESOURCE_NAME_PREFIX}/phraseanet"
tag: "alpha-0.1"

12
.dockerignore Normal file
View File

@@ -0,0 +1,12 @@
.circleci
.git
.settings
nodes_modules
vendor

View File

@@ -1,5 +1,10 @@
FROM php:7.0-fpm-stretch as builder
#########################################################################
# This image contains every build tools that will be used by the builder and
# the app images (usefull in dev mode)
#########################################################################
FROM php:7.0-fpm-stretch as phraseanet-system
RUN apt-get update \
&& apt-get install -y \
apt-transport-https \
@@ -23,6 +28,7 @@ RUN apt-get update \
libxslt-dev \
libzmq3-dev \
locales \
gettext \
mcrypt \
swftools \
unoconv \
@@ -61,9 +67,19 @@ RUN mkdir /entrypoint /var/alchemy \
&& mkdir -p /home/app/.composer \
&& chown -R app: /home/app /var/alchemy
#########################################################################
# This image is used to build the apps
#########################################################################
FROM phraseanet-system as builder
WORKDIR /var/alchemy/
# Files that are needed at build stage
COPY gulpfile.js /var/alchemy/
COPY www/include /var/alchemy/www/include
COPY www/scripts/apps /var/alchemy/www/scripts/apps
COPY Makefile /var/alchemy/
COPY package.json /var/alchemy/
COPY phpunit.xml.dist /var/alchemy/
@@ -73,11 +89,16 @@ COPY composer.json /var/alchemy/
COPY composer.lock /var/alchemy/
RUN make install_composer
COPY resources /var/alchemy/resources
COPY www /var/alchemy/www
# Application build phase
RUN make clean_assets
RUN make install_asset_dependencies
RUN make install_assets
# Application code
COPY www /var/alchemy/www
ADD ./docker/phraseanet/ /
COPY lib /var/alchemy/lib
COPY tmp /var/alchemy/tmp
@@ -86,6 +107,9 @@ COPY grammar /var/alchemy/grammar
COPY templates-profiler /var/alchemy/templates-profiler
COPY templates /var/alchemy/templates
COPY tests /var/alchemy/tests
# Create needed folders
RUN mkdir -p /var/alchemy/Phraseanet/logs \
&& chmod -R 777 /var/alchemy/Phraseanet/logs \
&& mkdir -p /var/alchemy/Phraseanet/cache \
@@ -99,69 +123,11 @@ RUN mkdir -p /var/alchemy/Phraseanet/logs \
&& mkdir -p /var/alchemy/Phraseanet/config \
&& chmod -R 777 /var/alchemy/Phraseanet/config
# Phraseanet
FROM php:7.0-fpm-stretch as phraseanet-fpm
RUN apt-get update \
&& apt-get install -y \
apt-transport-https \
ca-certificates \
gnupg2 \
&& apt-get update \
&& apt-get install -y --no-install-recommends zlib1g-dev \
gettext \
git \
ghostscript \
gpac \
imagemagick \
libav-tools \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libmagickwand-dev \
libmcrypt-dev \
libpng-dev \
librabbitmq-dev \
libssl-dev \
libxslt-dev \
libzmq3-dev \
locales \
mcrypt \
swftools \
unoconv \
unzip \
xpdf \
&& update-locale "LANG=fr_FR.UTF-8 UTF-8" \
&& dpkg-reconfigure --frontend noninteractive locales \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install zip exif iconv mbstring pcntl sockets xsl intl pdo_mysql gettext bcmath mcrypt \
&& pecl install redis amqp-1.9.3 zmq-beta imagick-beta \
&& docker-php-ext-enable redis amqp zmq imagick \
&& pecl clear-cache \
&& docker-php-source delete \
&& rm -rf /var/lib/apt/lists/*
#########################################################################
# Phraseanet web application image
#########################################################################
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& php -r "unlink('composer-setup.php');"
# Node Installation (node + yarn)
# Reference :
# https://linuxize.com/post/how-to-install-node-js-on-ubuntu-18.04/
# https://yarnpkg.com/lang/en/docs/install/#debian-stable
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
&& apt install -y nodejs \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update && apt-get install -y --no-install-recommends yarn \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/
RUN mkdir /entrypoint /var/alchemy \
&& useradd -u 1000 app \
&& mkdir -p /home/app/.composer \
&& chown -R app: /home/app /var/alchemy
FROM phraseanet-system as phraseanet-fpm
COPY --from=builder --chown=app /var/alchemy /var/alchemy/Phraseanet
ADD ./docker/phraseanet/ /
@@ -169,11 +135,17 @@ WORKDIR /var/alchemy/Phraseanet
ENTRYPOINT ["/phraseanet-entrypoint.sh"]
CMD ["/boot.sh"]
# phraseanet-worker
#########################################################################
# Phraseanet worker application image
#########################################################################
FROM phraseanet-fpm as phraseanet-worker
CMD ["/worker-boot.sh"]
#########################################################################
# phraseanet-nginx
#########################################################################
FROM nginx:1.15 as phraseanet-nginx
RUN useradd -u 1000 app
ADD ./docker/nginx/ /

View File

@@ -1,18 +0,0 @@
ARG phraseanet
FROM $phraseanet
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
iproute2 \
&& rm -rf /var/lib/apt/lists/* \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& pecl clear-cache
ADD ./docker/phraseanet-debug/ /
RUN chmod +x /entrypoint.sh /usr/local/bin/docker-*
ENTRYPOINT ["/entrypoint.sh"]
CMD ["php-fpm"]

View File

@@ -72,3 +72,7 @@ It will build and tag the following images :
local/phraseanet-worker:<TAG>
local/phraseanet-fpm:<TAG>
local/phraseanet-nginx:<TAG>
# Deploy the application
Once the images are built, you can deploy the entire phraseanet stack using the repository : https://github.com/alchemy-fr/phraseanet-docker and follow the instruction inside its `README.md` file.

View File

@@ -1,5 +1,7 @@
#!/bin/bash
set -xe
# nginx server
docker build --target phraseanet-nginx -t local/phraseanet-nginx:$1 .

View File

@@ -128,7 +128,7 @@ key:
| quoted_string()
group:
::space::? ::parenthese_:: primary() ::_parenthese:: ::space::?
::space::? ::parenthese_:: ::space::? primary() ::space::? ::_parenthese:: ::space::?
// Thesaurus terms

View File

@@ -13,6 +13,7 @@ namespace Alchemy\Phrasea\Command\Setup;
use Alchemy\Phrasea\Command\Command;
use Alchemy\Phrasea\Core\Configuration\StructureTemplate;
use Alchemy\Phrasea\SearchEngine\Elastic\ElasticsearchOptions;
use Doctrine\DBAL\Driver\Connection;
use Symfony\Component\Console\Helper\DialogHelper;
use Symfony\Component\Console\Input\ArrayInput;
@@ -51,7 +52,9 @@ class Install extends Command
->addOption('db-template', null, InputOption::VALUE_OPTIONAL, 'Databox template (' . $this->structureTemplate->toString() . ')', null)
->addOption('data-path', null, InputOption::VALUE_OPTIONAL, 'Path to data repository', realpath(__DIR__ . '/../../../../../datas'))
->addOption('server-name', null, InputOption::VALUE_OPTIONAL, 'Server name')
->addOption('indexer', null, InputOption::VALUE_OPTIONAL, 'Path to Phraseanet Indexer', 'auto')
->addOption('es-host', null, InputOption::VALUE_OPTIONAL, 'ElasticSearch server HTTP host', 'localhost')
->addOption('es-port', null, InputOption::VALUE_OPTIONAL, 'ElasticSearch server HTTP port', 9200)
->addOption('es-index', null, InputOption::VALUE_OPTIONAL, 'ElasticSearch index name', null)
->addOption('yes', 'y', InputOption::VALUE_NONE, 'Answer yes to all questions');
return $this;
@@ -121,6 +124,21 @@ class Install extends Command
list($email, $password) = $this->getCredentials($input, $output, $dialog);
$dataPath = $this->getDataPath($input, $output, $dialog);
if (! $input->getOption('yes')) {
$output->writeln("<info>--- ElasticSearch connection settings ---</info>");
}
list($esHost, $esPort) = $this->getESHost($input, $output, $dialog);
$esIndexName = $this->getESIndexName($input, $output, $dialog);
$esOptions = ElasticsearchOptions::fromArray([
'host' => $esHost,
'port' => $esPort,
'index' => $esIndexName
]);
$output->writeln('');
if (!$input->getOption('yes')) {
$continue = $dialog->askConfirmation($output, "<question>Phraseanet is going to be installed, continue ? (N/y)</question>", false);
@@ -132,6 +150,7 @@ class Install extends Command
}
$this->container['phraseanet.installer']->install($email, $password, $abConn, $serverName, $dataPath, $dbConn, $templateName, $this->detectBinaries());
$this->container['conf']->set(['main', 'search-engine', 'options'], $esOptions->toArray());
if (null !== $this->getApplication()) {
$command = $this->getApplication()->find('crossdomain:generate');
@@ -339,6 +358,35 @@ class Install extends Command
return $serverName;
}
private function getESHost(InputInterface $input, OutputInterface $output, DialogHelper $dialog)
{
$host = $input->getOption('es-host');
$port = (int) $input->getOption('es-port');
if (! $input->getOption('yes')) {
while (! $host) {
$host = $dialog->ask($output, 'ElasticSearch server host : ', null);
};
while ($port <= 0 || $port >= 65535) {
$port = (int) $dialog->ask($output, 'ElasticSearch server port : ', null);
};
}
return [ $host, $port ];
}
private function getESIndexName(InputInterface $input, OutputInterface $output, DialogHelper $dialog)
{
$index = $input->getOption('es-index');
if (! $input->getOption('yes')) {
$index = $dialog->ask($output, 'ElasticSearch server index name (blank to autogenerate) : ', null);
}
return $index;
}
private function detectBinaries()
{
return [

View File

@@ -354,7 +354,7 @@ class SubdefsController extends Controller
Subdef::TYPE_VIDEO => [
"definitions" => [
"video codec H264" => null,
"144P H264 128 kbps ACC 128kbps" => [
"144P H264 128 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
@@ -362,10 +362,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"240P H264 256 kbps ACC 128kbps" => [
"240P H264 256 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
@@ -373,10 +373,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"360P H264 576 kbps ACC 128kbps" => [
"360P H264 576 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
@@ -384,10 +384,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libtheora",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"480P H264 750 kbps ACC 128kbps" => [
"480P H264 750 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
@@ -395,10 +395,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"720P H264 1492 kbps ACC 128kbps" => [
"720P H264 1492 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
@@ -406,10 +406,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"1080P H264 2420 kbps ACC 128kbps" => [
"1080P H264 2420 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
@@ -417,11 +417,77 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"144P H264 128 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"240P H264 256 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"360P H264 576 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libtheora",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"480P H264 750 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"720P H264 1492 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"1080P H264 2420 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libx264",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"video codec libvpx" => null,
"144P webm 128 kbps ACC 128kbps" => [
"144P webm 128 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
@@ -429,10 +495,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"240P webm 256 kbps ACC 128kbps" => [
"240P webm 256 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
@@ -440,10 +506,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"360P webm 576 kbps ACC 128kbps" => [
"360P webm 576 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
@@ -451,10 +517,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"480P webm 750 kbps ACC 128kbps" => [
"480P webm 750 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
@@ -462,10 +528,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"720P webm 1492 kbps ACC 128kbps" => [
"720P webm 1492 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
@@ -473,10 +539,10 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"1080P webm 2420 kbps ACC 128kbps" => [
"1080P webm 2420 kbps MP3 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
@@ -484,7 +550,73 @@ class SubdefsController extends Controller
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfaac",
Video::OPTION_ACODEC => "libmp3lame",
Subdef::OPTION_DEVICE => ["all"]
],
"144P webm 128 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "128",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "256",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"240P webm 256 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "256",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "426",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"360P webm 576 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "576",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "480",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"480P webm 750 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "750",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "854",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"720P webm 1492 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "1492",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1280",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
"1080P webm 2420 kbps AAC 128kbps" => [
Video::OPTION_AUDIOBITRATE => "128",
Video::OPTION_AUDIOSAMPLERATE => "44100",
Video::OPTION_BITRATE => "2420",
Video::OPTION_GOPSIZE => "25",
Video::OPTION_SIZE => "1920",
Video::OPTION_FRAMERATE => "25",
Video::OPTION_VCODEC => "libvpx",
Video::OPTION_ACODEC => "libfdk_aac",
Subdef::OPTION_DEVICE => ["all"]
],
],

View File

@@ -193,7 +193,7 @@ class PushController extends Controller
'Validation from %user%', [
'%user%' => $this->getAuthenticatedUser()->getDisplayName(),
]));
$validation_description = $request->request->get('validation_description');
$validation_description = $request->request->get('message');
$participants = $request->request->get('participants');

View File

@@ -341,10 +341,20 @@ class QueryController extends Controller
if ($result->getTotal() === 0) {
$template = 'prod/results/help.html.twig';
} else {
}
else {
$template = 'prod/results/records.html.twig';
}
$json['results'] = $this->render($template, ['results'=> $result]);
/** @var \Closure $filter */
$filter = $this->app['plugin.filter_by_authorization'];
$plugins = [
'workzone' => $filter('workzone'),
'actionbar' => $filter('actionbar'),
];
$json['results'] = $this->render($template, ['results'=> $result, 'plugins'=>$plugins]);
// add technical fields

View File

@@ -16,7 +16,7 @@ class Version
/**
* @var string
*/
private $number = '4.1.0-alpha.18a';
private $number = '4.1.0-alpha.19a';
/**
* @var string

View File

@@ -140,6 +140,7 @@ class LegacyRecordRepository implements RecordRepository
's.rid_parent IN (:storyIds)',
'r.parent_record_id = 0'
)
->orderBy('s.ord', 'ASC')
->setParameter('storyIds', $storyIds, Connection::PARAM_INT_ARRAY)
;

View File

@@ -33,7 +33,7 @@ class Video extends Audio
$this->registerOption(new OptionType\Range($this->translator->trans('Frame Rate'), self::OPTION_FRAMERATE, 1, 200, 20));
$this->registerOption(new OptionType\Enum($this->translator->trans('Video Codec'), self::OPTION_VCODEC, ['libx264', 'libvpx', 'libtheora'], 'libx264'));
$this->unregisterOption(self::OPTION_ACODEC);
$this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfaac', 'libvo_aacenc', 'libmp3lame', 'libvorbis'], 'libfaac'));
$this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfaac', 'libvo_aacenc', 'libmp3lame', 'libvorbis', 'libfdk_aac'], 'libmp3lame'));
}
public function getType()

View File

@@ -463,8 +463,8 @@ class databox extends base implements ThumbnailedElement
->set_type($type)
->set_tbranch(isset($field['tbranch']) ? (string) $field['tbranch'] : '')
->set_generate_cterms((isset($field['generate_cterms']) && (string) $field['generate_cterms'] == 1))
->set_gui_editable((isset($field['gui_editable']) && (string) $field['gui_editable'] == 1))
->set_gui_visible((isset($field['gui_editable']) && (string) $field['gui_visible'] == 1))
->set_gui_editable((!isset($field['gui_editable']) || (isset($field['gui_editable']) && (string) $field['gui_editable'] == 1)))
->set_gui_visible((!isset($field['gui_visible']) || (isset($field['gui_visible']) && (string) $field['gui_visible'] == 1)))
->set_thumbtitle(isset($field['thumbtitle']) ? (string) $field['thumbtitle'] : (isset($field['thumbTitle']) ? $field['thumbTitle'] : '0'))
->set_report(isset($field['report']) ? (string) $field['report'] : '1')
->save();

View File

@@ -0,0 +1,69 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2019 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Alchemy\Phrasea\Application;
class patch_410alpha19a implements patchInterface
{
/** @var string */
private $release = '4.1.0-alpha.19a';
/** @var array */
private $concern = [base::APPLICATION_BOX];
/**
* Returns the release version.
*
* @return string
*/
public function get_release()
{
return $this->release;
}
/**
* {@inheritdoc}
*/
public function concern()
{
return $this->concern;
}
/**
* {@inheritdoc}
*/
public function require_all_upgrades()
{
return false;
}
/**
* {@inheritdoc}
*/
public function getDoctrineMigrations()
{
return [];
}
/**
* {@inheritdoc}
*/
public function apply(base $appbox, Application $app)
{
// remove all and last in default query
$sql = "UPDATE UserSettings SET value = '' WHERE name = 'start_page_query' AND lower(trim(value)) in ('all','last')";
$stmt = $appbox->get_connection()->prepare($sql);
$stmt->execute();
$stmt->closeCursor();
return true;
}
}

View File

@@ -79,7 +79,7 @@
<size>748</size>
<mediatype>video</mediatype>
<writeDatas>yes</writeDatas>
<acodec>libfaac</acodec>
<acodec>libmp3lame</acodec>
<vcodec>libx264</vcodec>
<devices>screen</devices>
<bitrate>1000</bitrate>

View File

@@ -79,7 +79,7 @@
<size>748</size>
<mediatype>video</mediatype>
<writeDatas>yes</writeDatas>
<acodec>libfaac</acodec>
<acodec>libmp3lame</acodec>
<vcodec>libx264</vcodec>
<devices>screen</devices>
<bitrate>1000</bitrate>

View File

@@ -79,7 +79,7 @@
<size>748</size>
<mediatype>video</mediatype>
<writeDatas>yes</writeDatas>
<acodec>libfaac</acodec>
<acodec>libmp3lame</acodec>
<vcodec>libx264</vcodec>
<devices>screen</devices>
<bitrate>1000</bitrate>

View File

@@ -65,7 +65,7 @@
"normalize-css": "^2.1.0",
"npm": "^6.0.0",
"npm-modernizr": "^2.8.3",
"phraseanet-production-client": "0.34.76-d",
"phraseanet-production-client": "^0.34.86-d",
"requirejs": "^2.3.5",
"tinymce": "^4.0.28",
"underscore": "^1.8.3",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2019-05-21T05:53:02Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<file date="2019-11-19T08:48:53Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2019-05-21T05:54:16Z" source-language="en" target-language="en" datatype="plaintext" original="not.available">
<file date="2019-11-19T08:49:17Z" source-language="en" target-language="en" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2019-05-21T05:55:28Z" source-language="en" target-language="fr" datatype="plaintext" original="not.available">
<file date="2019-11-15T08:03:23Z" source-language="en" target-language="fr" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2019-05-21T05:56:47Z" source-language="en" target-language="nl" datatype="plaintext" original="not.available">
<file date="2019-11-19T08:50:13Z" source-language="en" target-language="nl" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,13 +1,3 @@
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?81kpnc');
src: url('fonts/icomoon.eot?81kpnc#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?81kpnc') format('truetype'),
url('fonts/icomoon.woff?81kpnc') format('woff'),
url('fonts/icomoon.svg?81kpnc#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */

View File

@@ -1,58 +1,99 @@
$iconsPath: '../../../assets/common/images/icons/';
ul.image_set{
padding:0;
margin:0;
border:none;
width:100%;
border:none;
$feedbackColor : #8bc34a;
$basketColor : #2196f3 ;
ul.image_set {
padding: 0;
margin: 0;
border: none;
width: 100%;
border: none;
list-style-type: none;
display: flex;
flex-wrap: wrap;
}
li.image_box a img{
position:relative;
vertical-align:middle;
border:none;
li.image_box a img {
position: relative;
border: none;
width: auto !important;
height: 100% !important;
top: 0 !important;
object-fit: contain;
}
li.image_box a{
padding:0;
text-shadow:0;
margin:0;
li.image_box a {
padding: 0;
text-shadow: 0;
margin: 0;
width: 100%;
}
li.image_box{
width:80px;
height:80px;
position:relative;
float:left;
margin:0px 15px 15px 0px;
padding:0px;
text-align:center;
li.image_box {
width: 18%;
position: relative;
margin: 0 2.5% 15px 0;
padding: 0;
display: flex;
align-items: center;
text-align: center;
background: #ededed;
&:nth-child(5n) {
margin-right: 0;
}
.thumb_wrapper {
background: #ededed;
width: 100% !important;
height: 160px !important;
@media screen and (max-width: 767px) {
height: 130px !important;
}
}
}
a.no.active_choice{
background-color:red;
@media screen and (max-width: 767px) {
li.image_box {
width: 32%;
margin: 0 2% 15px 0;
&:nth-child(5n) {
margin-right: 2%;
}
&:nth-child(3n) {
margin-right: 0;
}
}
}
a.no.active_choice {
background-color: red;
color: #fff;
}
a.active_choice{
a.active_choice {
background-color: #53b401;
color: #fff;
}
.valid_choice{
position:absolute;
bottom:0;
right:0;
width:16px;
height:16px;
z-index:2;
.valid_choice {
position: absolute;
bottom: 0;
right: 0;
width: 16px;
height: 16px;
z-index: 2;
}
.valid_choice.agree{
background-image: url('#{$iconsPath}ok.png');
.valid_choice.agree {
background: #7ed321;
border-top-left-radius: 100px;
}
.valid_choice.disagree{
background-image: url('#{$iconsPath}delete.png');
.valid_choice.disagree {
background: #d0021b;
border-top-left-radius: 100px;
}
.thumb_wrapper {
text-align:center;
text-align: center;
}
@media screen and (orientation: landscape) {
@@ -70,3 +111,211 @@ a.active_choice{
}
}
.ui-footer .ui-title, .ui-header .ui-title {
font-size: 18px;
}
.ui-listview .ui-li-has-thumb .ui-li-thumb, .ui-listview .ui-li-has-thumb > .ui-btn > img:first-child, .ui-listview .ui-li-has-thumb > img:first-child {
top: 50%;
transform: translateY(-50%);
}
/*user status*/
.menu-bar-item {
background: #f0f0f0;
padding: 12px 15px;
text-align: left;
position: relative;
.icomoon {
font-size: 17px;
position: absolute;
left: 23px;
top: 50%;
transform: translateY(-50%);
}
.ui-link {
color: #4f4f4f !important;
text-decoration: none !important;
.text {
padding-left: 31px;
color: #4f4f4f !important;
text-decoration: none !important;
font-weight: 700;
font-size: 13px;
}
}
}
/*new design of lightbox*/
/*main nav */
#lightbox-menu {
li {
margin-bottom: 30px;
.ui-li-count {
border-radius: 3px !important;
border-top-left-radius: 0 !important;
border-bottom-left-radius: 0 !important;
border: 0;
color: #fff;
text-shadow: none;
padding: 18px 23px;
top: 0;
right: 0;
margin: 0;
font-size: 22px;
min-width: 25px;
background: $feedbackColor;
}
&.ui-first-child {
margin-top: 15px;
}
&.ui-last-child {
a {
&:before {
background: $basketColor;
}
&:hover, &:active, &:focus {
color: $basketColor;
}
}
.ui-li-count {
background: $basketColor;
}
}
}
a {
padding: 22px 25px;
font-size: 20px;
border-radius: 3px !important;
box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.19);
background-color: #eeeeee;
&:hover, &:active, &:focus {
color: $feedbackColor;
}
&:after {
content: none !important;
}
&:before {
content: "";
position: absolute;
display: block;
width: 100%;
height: 4px;
bottom: 0;
background: $feedbackColor;
left: 0;
border-radius: 3px;
}
}
}
.lightbox-bottom-btn {
margin-top: 50px;
.ui-btn {
font-size: 15px;
}
}
#validation, #baskets {
.ui-content {
padding-left: 0;
padding-right: 0;
}
}
.basket-title {
background: $feedbackColor;
padding: 12px 30px;
font-size: 17px;
margin: 0;
text-shadow: none;
color: #fff;
font-weight: 700;
#baskets & {
background: $basketColor;
}
span {
float: right;
}
}
.feed-list {
li {
height: 71px;
padding-left: 109px!important;
padding-right: 80px!important;
border-color: #d4d4d4!important;
text-overflow: inherit!important;
white-space: inherit!important;
}
.lightbox-img {
width: 90px;
height: 90px;
background-color: #ededed;
position: absolute;
left: 0;
top: 0;
display: flex;
flex-wrap: wrap;
img {
display: flex;
align-items: center;
width: 90px;
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
}
h3 {
display: flex!important;
align-items: center;
height: 71px;
margin: 0!important;
font-size: 15px;
font-weight: bold!important;
text-overflow: inherit!important;
white-space: inherit!important;
a {
position: relative;
color: #313131!important;
width: 100%;
padding-right: 18px;
&:after {
content: "\e96c";
font-family: icomoon;
position: absolute;
right: 0;
font-size: 20px;
line-height: 1;
top: 50%;
transform: translateY(-50%);
}
}
}
span {
font-size: 17px;
color: #fff!important;
display: inline-block;
text-shadow: none!important;
top: 0;
width: 52px;
right: 0;
line-height: 25px;
padding: 31px 0px;
margin: 0;
border-radius: 0;
&.validation {
background: $feedbackColor!important;
}
&.baskets {
background: $basketColor!important;
}
}
}
.lightbox-msg {
font-size: 14px;
color: #313131;
padding: 6px 0 6px 30px;
}

View File

@@ -1,5 +1,28 @@
@import './jquery-mobile/jquery-validator';
@font-face {
font-family: 'icomoon';
src: url("../../common/fonts/PhraseanetIcomoon/fonts/icomoon.eot?xt8hfo");
src: url("../../common/fonts/PhraseanetIcomoon/fonts/icomoon.eot?xt8hfo#iefix") format("embedded-opentype"), url("../../common/fonts/PhraseanetIcomoon/fonts/icomoon.ttf?xt8hfo") format("truetype"), url("../../common/fonts/PhraseanetIcomoon/fonts/icomoon.woff?xt8hfo") format("woff"), url("../../common/fonts/PhraseanetIcomoon/fonts/icomoon.svg?xt8hfo#icomoon") format("svg");
font-weight: normal;
font-style: normal;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.nav_button {
width: 90%;
margin: 0px auto;
@@ -25,3 +48,668 @@
#right-btn {
float: right;
}
.report-modal, .ui-dialog .ui-dialog-content {
background: linear-gradient(#3c3c3c, #111);
}
.ui-bar-c, .ui-body-c, .ui-btn-down-c, .ui-btn-hover-c, .ui-btn-up-c, .ui-overlay-c {
text-shadow: none;
}
@import '../../_shared/styles/variables';
$lightboxPath: '../images/';
$imagesPath: '/assets/vendors/jquery-ui/images/dark-hive/';
$mainMenuBackgroundColor: #c7c7c7; //BFBFBF;
$mainMenuBottomBorder: 1px solid #c7c7c7;
$mainMenuLinkColor: #212121;
$mainMenuLinkHoverColor: #000000;
$mainMenuLinkActiveColor: #BFBFBF;
$mainMenuLinkBackgroundHoverColor: transparent;
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
}
img {
border: none;
vertical-align: middle;
}
.title15 {
font-size: 15px;
font-weight: bold;
}
.record_display_box {
width: 100%;
height: 100%;
display: block;
table {
vertical-align: middle;
table-layout: fixed;
}
.title {
margin: 0 10px;
}
.record {
position: relative;
max-width: none;
max-height: none;
}
.header {
color: #BFBFBF;
height: 30px;
bottom: auto;
overflow: hidden;
.title {
overflow: hidden;
line-height: 20px;
height: 20px;
}
}
.lightbox_container {
top: 30px;
overflow: hidden;
}
.display_id {
top: 5px;
margin: 0 0 0 5px;
background: #bebebe;
}
}
#sc_wrapper {
left: 20px;
right: 20px;
overflow-x: scroll;
overflow-y: hidden;
}
#sc_container {
position: relative;
height: 100%;
}
.basket_element_wrapper {
position: relative;
float: left;
padding: 0 5px;
}
.basket_element {
position: relative;
float: left;
width: 114px;
height: 130px;
border: 1px solid #212121;
text-align: left;
padding: 5px 8px;
&.selected {
background-color: #212121;
}
.display_id {
top: 4px;
left: 8px;
}
.agreement {
position: absolute;
top: 4px;
right: 8px;
z-index: 99;
}
.image {
position: relative;
z-index: 90;
}
.previewTips {
background-image: url('#{$iconsPath}zoom.gif');
background-position: center center;
background-repeat: no-repeat;
cursor: help;
position: absolute;
bottom: 4px;
right: 8px;
height: 18px;
width: 18px;
z-index: 99;
}
}
#report .display_id {
top: 0;
left: 0;
border-radius: 0;
background-color: rgba(216, 216, 216, 0.7);
font-weight: 700;
z-index: 99;
color: #333333;
position: absolute;
width: 22px;
padding: 2px 0;
font-size: 12px;
}
#report .CHIM.diapo {
text-align: center;
}
.display_id {
background-color: #FFFFFF;
padding: 3px 6px;
font-weight: bold;
z-index: 99;
color: #212121;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
position: absolute;
}
.not_decided {
opacity: 0.30;
filter: alpha(opacity=30);
}
#sc_wrapper .not_decided {
display: none;
}
#right_scroller {
width: 30px;
right: -10px;
left: auto;
background-image: url('#{$lightboxPath}right_arrow.png');
background-position: center center;
background-repeat: no-repeat;
}
#left_scroller {
width: 30px;
left: -10px;
right: auto;
background-image: url('#{$lightboxPath}left_arrow.png');
background-position: center center;
background-repeat: no-repeat;
}
#basket_infos {
overflow: hidden;
background-color: #1F1E1B;
color: #BFBFBF;
}
#basket_options {
height: 35px;
top: auto;
background-color: #1F1E1B;
text-align: center;
}
#basket_options .confirm_report {
margin: 5px auto;
}
#basket_infos .user_infos {
height: 120px;
top: auto;
}
#basket_infos {
table {
width: 100%;
margin: 5px 0;
.title {
width: 100%;
}
.report_wrapper {
text-align: right;
}
}
}
#right_column {
left: auto;
right: 0;
width: 240px;
}
#right_column_validation_toggle {
bottom: 45px;
background-color: #1F1E1B;
height: 30px;
top: auto;
text-align: center;
display: none;
line-height: 25px;
color: #BFBFBF;
}
#right_column .right_column_title {
height: 30px;
bottom: auto;
}
#right_column .right_column_title img.expanded {
display: none;
}
#right_column .right_column_title img.collapsed {
display: inline;
}
#right_column .right_column_title.expanded img.expanded {
display: inline;
}
#right_column .right_column_title.expanded img.collapsed {
display: none;
}
#right_column .right_column_wrapper {
top: 30px;
bottom: 45px;
}
#right_column .right_column_wrapper.caption {
bottom: 85px;
}
#record_infos {
overflow-x: hidden;
overflow-y: auto;
}
#record_compare {
visibility: hidden;
top: auto;
left: auto;
}
#record_compare .header, #record_compare .lightbox_container {
left: 5px;
}
#record_wrapper.comparison #record_main .header, #record_wrapper.comparison #record_main .lightbox_container {
right: 5px;
}
.agreement_selector {
position: absolute;
bottom: 10px;
right: 10px;
}
.clickable {
cursor: pointer;
}
.big_box.agree {
border: 2px solid #35AC00;
background-color: #35AC00;
}
.big_box.disagree {
border: 2px solid #DE1200;
background-color: #DE1200;
}
.big_box, .big_box.not_decided {
width: 95px;
margin: 0 auto;
padding: 6px 10px;
height: 30px;
color: #1F1E1B;
background-color: #353430;
border: 2px solid #353430;
text-align: center;
opacity: 1;
filter: alpha(opacity=100);
}
.big_box span {
margin: 0 10px;
}
li.userchoice {
margin: 5px 0 0px 20px;
}
.userchoice.disagree {
color: #DE1200;
}
.userchoice.agree {
color: #35AC00;
}
.basket_report_user {
padding: 7px 10px;
}
.basket_report_user_wrapper {
margin: 0;
border-bottom: 1px solid #b2b2b2;
border-radius: 0;
display: inline-block;
padding: 10px 15px;
width: 100%;
box-sizing: border-box;
background: #e5e5e5;
text-shadow: none;
float: left;
}
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text {
padding: 0.2em 1em 0.2em 2.1em;
}
/*******
*
* Index
*
* ******/
#main_index {
position: relative;
width: 600px;
margin: 0 auto;
}
#main_wrapper {
width: 100%;
}
#main_wrapper h1 {
font-weight: bold;
font-size: 25px;
}
table th {
text-align: right;
vertical-align: bottom;
height: 60px;
border-bottom: 1px solid #8F8F8F;
}
table th.title {
text-align: left;
}
table th h1 {
margin-left: 20px;
}
table th i {
margin-right: 20px;
}
.ui-state-default.note_closer, .ui-state-default.note_saver {
background-color: #353430;
padding: 5px;
margin: 0 10px;
}
.ui-state-default.note_saver {
background-color: #1F1E1B;
}
.record_display_box form .buttons {
margin: 5px;
text-align: right;
}
.record_display_box form {
margin: 15px 0;
width: 90%;
}
.record_display_box form textarea {
width: 100%;
height: 75px;
}
#navigation {
width: 200px;
}
.basket_downloader {
background-color: #1F1E1B;
margin: 0 10px;
padding: 2px;
border: 0;
}
hr {
width: 100%;
height: 1px;
background-color: #212121;
border: none;
}
.report {
margin: 0 10px;
vertical-align: bottom;
}
/*
*
* Overrides JqueryUI
*
*/
.ui-button {
background: transparent;
border: none;
margin: 0;
padding: 0;
}
.ui-button-text-only .ui-button-text {
padding: 0.15em;
}
.ui-dialog {
.ui-dialog-titlebar {
padding: 1em 1em;
}
}
.videoTips {
width: 100%;
height: 100%;
}
#basket_infos {
margin-bottom: 20px;
.mobile_aggreement_box {
padding: 20px;
}
}
.ui-button-icon.ui-icon.ui-icon-closethick {
background-position: -73px 0px;
background-color: rgba(0, 0, 0, .9);
padding: 0;
}
.btn-container {
padding: 0 20px;
}
button.confirm_report {
background: #38c !important;
color: #fff !important;
font-size: 16px;
font-weight: bold;
padding: 6px;
display: inline-block;
border: 1px solid #38c;
text-shadow: 0 1px 0 #111;
border-radius: 16px;
font-family: Roboto, sans-serif;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2) !important;
}
.report_wrapper {
position: relative;
margin-bottom: 20px;
}
.report_btn {
position: absolute;
top: -41px;
right: 0;
z-index: 1;
background: #8bc34a;
border: 1px solid #8bc34a;
box-sizing: border-box;
padding: 8px 13px;
min-width: 110px;
border-radius: 4px;
color: #fff !important;
text-decoration: none;
text-align: center;
transition: all 0.3s;
&:hover, &:focus {
background: darken(#8bc34a, 0.2);
border-color: darken(#8bc34a, 0.3);
}
&.report_list {
background: #f44336;
border-color: #f44336;
&:hover, &:focus {
background: darken(#f44336, 0.2);
border-color: darken(#f44336, 0.3);
}
}
}
.report_list {
display: none;
}
.report_summary_backup, .report_list_backup {
display: none;
}
.chim-wrapper-block {
margin-bottom: 15px;
.chim-block {
margin: 0;
}
.chim-inner {
width: 100%;
display: inline-block;
min-width: 296px;
}
.chim-left {
display: inline-block;
width: 100%;
background: #ededed;
text-align: center;
position: relative;
.diapo {
display: inline-block;
div {
max-width: 100%;
}
}
}
.chim-right {
width: 100%;
.validate-icon {
float: left;
height: 25px;
vertical-align: middle;
display: flex;
flex-wrap: wrap;
align-items: center;
}
h3 {
font-size: 16px;
margin: 0;
padding-top: 3px;
}
}
}
.thumb_wrapper img.record_image {
max-width: 100%;
}
/*header lightbox*/
.ui-footer .ui-title, .ui-header .ui-title {
min-height: 26px;
padding: 10px 0;
}
.ui-listview.lightbox-list-view {
& > .ui-li-static {
padding: .7em 1em;
text-overflow: inherit;
white-space: inherit;
}
& > li {
border-color: #b2b2b2;
background: none;
p {
text-overflow: inherit;
white-space: inherit;
line-height: 15px;
font-size: 13px;
color: #141414;
}
}
h3 {
font-family: Roboto, sans-serif;;
font-size: 16px;
font-weight: bold;
font-stretch: normal;
font-style: normal;
line-height: 0.94;
letter-spacing: normal;
color: #141414;
}
}
.ui-footer.ui-bar-inherit {
border: 0;
}
.center-image {
text-align: center;
}
/*validate page*/
.validate-icon {
float: left;
position: absolute;
.icomoon {
color: #fff;
font-size: 17px;
padding: 3px;
border-radius: 50px;
display: inline-block;
}
.icon-disagree {
background: #cd2f2f;
}
.icon-agree {
background: #8bc34a;
}
}
.validate-info {
float: left;
padding-left: 36px;
}

View File

@@ -0,0 +1,17 @@
{% set configuration = app['conf'].get(['registry', 'custom-links']) %}
{% if app.getAuthenticator().isAuthenticated() %}
<div class="menu-bar-item">
{% if app.getAuthenticatedUser().isGuest %}
<span class="icomoon icon-agree">&#xe950;</span>
<span class="text">{{ 'Guest' | trans }}</span>
{% else %}
<a target="_blank" href="{{ path('account') }}"
title="{{ 'login:: Mon compte' | trans }}">
<span class="icomoon icon-agree">&#xe950;</span>
<span class="text">{{ app.getAuthenticatedUser().getDisplayName() }}</span>
</a>
{% endif %}
</div>
{% endif %}

View File

@@ -26,7 +26,7 @@
#content {
position: fixed;
top:50px;
top:90px;
bottom: 0;
right: 0;
left: 0;
@@ -40,7 +40,6 @@
{% block content %}
{% set record = basket_element.getRecord(app) %}
<div data-role="page" id="page">
<div data-role="header">
<a href="{{ path('lightbox_validation', { 'basket' : basket_element.getBasket().getId() }) }}"
@@ -49,8 +48,10 @@
<a rel="external" href="{{ path('lightbox') }}" data-icon="home" data-iconpos="notext" data-direction="reverse"
class="ui-btn-right jqm-home">{{ 'Home' | trans }}</a>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div id="content" data-role="content">
{{ thumbnail.format100percent(record.get_preview()) }}
<div class="nav_button">
{% if prevId != NULL %}
<a data-ajax="false" id="left-btn"
@@ -64,6 +65,7 @@
{% endif %}
<div style="clear: both;"></div>
</div>
<div class="center-image">{{ thumbnail.format100percent(record.get_preview()) }}</div>
{% if basket_element.getBasket().getValidation() %}
{% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanAgree() %}
<fieldset data-role="controlgroup" data-type="horizontal" style="text-align:center;">
@@ -81,7 +83,7 @@
</a>
</div>
<div>
<ul data-role="listview" id="notes_{{basket_element.getId()}}">
<ul data-role="listview" class="lightbox-list-view" id="notes_{{basket_element.getId()}}">
{% include 'lightbox/sc_note.html.twig' %}
</ul>
</div>

View File

@@ -17,7 +17,7 @@
#content {
position: fixed;
top:50px;
top:90px;
bottom: 0;
right: 0;
left: 0;
@@ -35,6 +35,9 @@
<a href="{{ path('lightbox_feed_entry', { 'entry_id' : feed_element.getEntry().getId() }) }}" data-rel="back" data-icon="arrow-l">Back</a>
<h1>{{feed_element.getOrd()}} - {{record.get_title()}}</h1>
<a rel="external" href="{{ path('lightbox') }}" data-icon="home" data-iconpos="notext" data-direction="reverse" class="ui-btn-right jqm-home">Home</a>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div id="content" data-role="content">
{{ thumbnail.format100percent(record.get_preview()) }}

View File

@@ -39,19 +39,22 @@
<div data-role="header">
<h1>{{module_name}}</h1>
<a href="#about" class="ui-btn-right">{{ 'a propos' | trans }}</a>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div data-role="content">
<ul data-role="listview" style="width:100%;margin: 0;">
<li>
<ul id="lightbox-menu" data-role="listview" style="width:100%;margin: 0;">
<li class="lightbox-item">
<a href="#validation">{{ 'Validations' | trans }}</a>
<span class="ui-li-count">{{_self.valid_baskets_length(baskets_collection)}}</span>
</li>
<li>
<li class="lightbox-item">
<a href="#baskets">{{ 'Paniers' | trans }}</a>
<span class="ui-li-count">{{_self.baskets_length(baskets_collection)}}</span>
</li>
</ul>
<div style="margin:2em 0 0 0">
<div class="lightbox-bottom-btn">
<a href="{{ path ('logout') }}" data-role="button" rel="external">{{ 'Deconnexion' | trans }}</a>
</div>
</div>
@@ -64,6 +67,9 @@
<div data-role="header">
<a href="#home" data-rel="back" data-icon="arrow-l">{{ 'Back' | trans }}</a>
<h1>{{ 'a propos' | trans }}</h1>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div data-role="content">
<p>Phraseanet Version {{ app['phraseanet.version'].getName() }} - {{ app['phraseanet.version'].getNumber() }}</p>
@@ -83,28 +89,39 @@
<div id="validation" data-role="page">
<div data-role="header">
<a rel="external" href="#home" data-icon="arrow-l">{{ 'Back' | trans }}</a>
<h1>{{ 'Validations' | trans }}</h1>
<h1>{{ module_name }}</h1>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div data-role="content">
<p>
<p class="basket-title">
{{ 'Validations' | trans }}
<span>{{_self.valid_baskets_length(baskets_collection)}}</span>
</p>
<p class="lightbox-msg">
{{ 'Voici vos validations en cours' | trans }}
</p>
<div class="feed-list">
<ul data-role="listview" style="width:100%;margin: 0;">
{% for basket in baskets_collection %}
{% for basket in baskets_collection | sort | reverse%}
{% if basket.getValidation() %}
{% set basket_length = basket.getElements().count() %}
<li>
{% if basket.getElements().first() %}
<div class="lightbox-img">
<img src="{{ basket.getElements().first().getRecord(app).get_thumbnail.get_url()}}" />
</div>
{% endif %}
<h3><a href="{{ path('lightbox_validation', { 'basket' : basket.getId() }) }}">{{basket.getName()}}</a></h3>
<p>{{ basket.getDescription() }}</p>
<span class="ui-li-count">{{ basket_length }}</span>
{#<p>{{ basket.getDescription() }}</p>#}
<span class="ui-li-count validation">{{ basket_length }}</span>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
<div data-role="footer">
</div>
@@ -113,28 +130,39 @@
<div id="baskets" data-role="page">
<div data-role="header">
<a rel="external" href="#home" data-icon="arrow-l">{{ 'Back' | trans }}</a>
<h1>{{ 'Paniers' | trans }}</h1>
<h1>{{module_name}}</h1>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div data-role="content">
<p>
<p class="basket-title">
{{ 'Paniers' | trans }}
<span>{{_self.baskets_length(baskets_collection)}}</span>
</p>
<p class="lightbox-msg">
{{ 'Voici vos paniers' | trans }}
</p>
<div class="feed-list">
<ul data-role="listview" style="width:100%;margin: 0;">
{% for basket in baskets_collection %}
{% for basket in baskets_collection | sort | reverse %}
{% if basket.getValidation() is empty %}
{% set basket_length = basket.getElements().count() %}
<li>
{% if basket.getElements().first() %}
<div class="lightbox-img">
<img src="{{ basket.getElements().first().getRecord(app).get_thumbnail.get_url()}}" />
</div>
{% endif %}
<h3><a href="{{ path('lightbox_validation', { 'basket' : basket.getId() }) }}">{{ basket.getName() }}</a></h3>
<p>{{ basket.getDescription() }}</p>
<span class="ui-li-count">{{basket_length}}</span>
{#<p>{{ basket.getDescription() }}</p>#}
<span class="ui-li-count baskets">{{basket_length}}</span>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
<div data-role="footer">
</div>

View File

@@ -1,17 +1,19 @@
{% for validationDatas in basket_element.getValidationDatas() %}
{% set is_mine = validationDatas.getParticipant().getUser().getId() == app.getAuthenticatedUser().getId() %}
{% if validationDatas.getNote() != '' or (validationDatas.getAgreement() is not null and is_mine) %}
{% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %}
<li>
<h3 style="text-align:left;">
{% if is_mine == false and validationDatas.getAgreement() is not null %}
<img style="vertical-align:middle;"
src="/assets/lightbox/images/{% if validationDatas.getAgreement() == true %}agree.png{% else %}disagree.png{% endif %}" />
{% endif %}
<div class="validate-icon">
{% if validationDatas.getAgreement() == true %}<span class="icomoon icon-agree">&#xe95f;</span>{% endif %}
{% if validationDatas.getAgreement() == false and validationDatas.getAgreement() is not null %}<span class="icomoon icon-disagree">&#xe971; {{ validationDatas.getAgreement() }}</span>{% endif %}
</div>
<div class="validate-info">
<h3>
{{ validationDatas.getParticipant().getUser().getDisplayName() }}
</h3>
{% if validationDatas.getNote() != '' %}
<p style="text-align:left;">{{ 'validation:: note' | trans }} : {{ validationDatas.getNote()|nl2br }}</p>
<p style="text-align:left;">{{ 'validation:: note' | trans }} : {{ validationDatas.getNote()|nl2br }} </p>
{% endif %}
</div>
</li>
{% endif %}
{% endfor %}

View File

@@ -31,6 +31,9 @@
data-icon="arrow-l">{{ 'Back' | trans }}</a>
<h1>{{basket.getName()}}</h1>
<a rel="external" href="{{ path('lightbox') }}" data-icon="home" data-iconpos="notext" data-direction="reverse" class="ui-btn-right jqm-home">{{ 'Home' | trans }}</a>
</div>
<div class="lightbox-user-info">
{% include 'common/menubar.html.twig' %}
</div>
<div data-role="content">
<input type="hidden" id="basket_validation_id" value="{{ basket.getId() }}">
@@ -38,22 +41,56 @@
{% set basket_length = basket.getElements().count() %}
{% trans with {'%basket_length%' : basket_length} %}%basket_length% documents{% endtrans %}
</p>
{% if basket.getValidation() %}
<div class="report_wrapper">
<a id="report_summary" class="report_btn report_summary" href="#" onclick="$.ajax({
type: 'GET',
url: '/lightbox/ajax/LOAD_REPORT/' + $('#navigation').val() + '/',
dataType: 'html',
success: function (data) {
$('#report_list_backup').empty().append($('#report').html());
$('#report').empty().append(data);
$('#report .record_image').css('height','auto');
return;
}
});
$(this).hide();
$('#report_list').show();">
{{ 'lightbox::recaptitulatif' | trans }}
</a>
<a id="report_list" class="report_btn report_list" href="#" onclick=" $(this).hide();
$('#report_summary').show();
$('#report').empty().append($('#report_list_backup').html());">
{{ 'lightbox::list' | trans }}
</a>
</div>
<div class="report_list_backup" id="report_list_backup">&nbsp;</div>
<div class="report_summary_backup " id="report_summary_backup">&nbsp;</div>
{% endif %}
<input type="hidden" id="navigation" value="{{ basket.getId() }}">
<div id="report" class="summary_block">
<ul class="image_set">
{% for basket_element in basket.getElements() %}
<li class="image_box" id="sselcontid_{{basket_element.getId()}}">
<div class="display_id">
{{basket_element.getOrd()}}
</div>
{% if basket_element.getBasket().getValidation() and basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanAgree() %}
<div class="valid_choice valid_choice_{{basket_element.getId()}} {% if basket_element.getUserValidationDatas(app.getAuthenticatedUser()).getAgreement() == true %}agree{% elseif basket_element.getUserValidationDatas(app.getAuthenticatedUser()).getAgreement() == false and basket_element.getUserValidationDatas(app.getAuthenticatedUser()).getAgreement() is not null %}disagree{% endif %}">
</div>
{% endif %}
<a href="{{ path('lightbox_ajax_load_basketelement', { 'sselcont_id' : basket_element.getId() }) }}">
{{thumbnail.format(basket_element.getRecord(app).get_thumbnail(), 80, 80, '', true, false)}}
{{thumbnail.format(basket_element.getRecord(app).get_thumbnail(), 300, 300, '', true, false)}}
</a>
<input type="hidden" class="display_id" name="display_id" value="{{basket_element.getOrd()}}" />
</li>
{% endfor %}
</ul>
</div>
<div data-role="footer">
</div>
<div class="btn-container">
{% if basket.getValidation() and basket.getValidation().getParticipant(app.getAuthenticatedUser()).getCanAgree() %}
<button class="confirm_report" style="width:100%;" title="{{ 'validation::envoyer mon rapport' | trans }}">
{{ 'validation::envoyer mon rapport' | trans }}
@@ -61,6 +98,8 @@
</button>
{% endif %}
</div>
</div>
</div>
{% endblock %}

View File

@@ -193,7 +193,7 @@
<td>
<label for="gui_editable" class="checkbox">
<input id="gui_editable" type="checkbox" <%= field.gui_editable ? "checked='checked'" : "" %> />
{% trans %}gui_editable{% endtrans %}
{% trans %}Gui-editable{% endtrans %}
</label>
</td>
</tr>
@@ -201,7 +201,7 @@
<td>
<label for="gui_visible" class="checkbox">
<input id="gui_visible" type="checkbox" <%= field.gui_visible ? "checked='checked'" : "" %> />
{% trans %}gui_visible{% endtrans %}
{% trans %}Gui-visible{% endtrans %}
</label>
</td>
</tr>
@@ -264,7 +264,7 @@
<td><input id="tbranch" type="text" value="<%= field.tbranch %>"/></td>
</tr>
<tr>
<td><label for="generate_cterms" class="checkbox">{% trans %}generate_cterms{% endtrans %}</label></td>
<td><label for="generate_cterms" class="checkbox">{% trans %}Generate-cterms{% endtrans %}</label></td>
<td><input id="generate_cterms" type="checkbox" <%= field.generate_cterms ? "checked='checked'" : "" %> /></td>
</tr>
</table>

View File

@@ -4,48 +4,49 @@
<div style="margin:0 7px;overflow:hidden;">
{% for basket_element in basket.getElements() %}
{% set record = basket_element.getRecord(app) %}
<div class="chim-wrapper wrapCHIM_{{basket_element.getId()}} valid">
<div style="margin:20px;">
<table style="width: 100%; min-width: 330px;">
<tr valign="top">
<td style="width:165px;">
<div id="CHIM_{{basket_element.getId()}}_{{record.get_serialize_key()}}"
class="CHIM diapo">
<div class="chim-wrapper-block chim-wrapper wrapCHIM_{{basket_element.getId()}} valid">
<div class="chim-block">
<div class="chim-inner">
<div class="chim-left">
<div id="CHIM_{{basket_element.getId()}}_{{record.get_serialize_key()}}" class="CHIM diapo">
<div class="display_id">
{{basket_element.getOrd()}}
</div>
{{thumbnail.format(record.get_thumbnail(),165, 125, '', true, false)}}
</div>
</td>
<td style="width:10px;">
</td>
<td>
</div>
<div class="chim-right">
{% for validationDatas in basket_element.getValidationDatas()%}
{% if basket_element.getBasket().getValidation().getParticipant(app.getAuthenticatedUser()).getCanSeeOthers() or validationDatas.getParticipant().getUser() == app.getAuthenticatedUser() %}
<div class="basket_report_user_wrapper ui-corner-all">
<div class="basket_report_user">
{% if validationDatas.getAgreement() == true %}
{% set imguser = '<img src="/assets/lightbox/images/agree.png" />' %}
{% set imguser = '<span class="icomoon icon-agree">&#xe95f;</span>' %}
{% set styleuser = '' %}
{% elseif validationDatas.getAgreement() is null %}
{% set imguser = '' %}
{% set imguser = '&nbsp;' %}
{% set styleuser = 'margin-left:18px;' %}
{% else %}
{% set imguser = '<img src="/assets/lightbox/images/disagree.png" />' %}
{% set imguser = '<span class="icomoon icon-disagree">&#xe971;</span>' %}
{% set styleuser = '' %}
{% endif %}
<b style="{{styleuser}}">{{imguser|raw}} {{validationDatas.getParticipant().getUser().getDisplayName()}}</b>
<div class="validate-icon">
{{imguser|raw}}
</div>
<div class="validate-info">
<h3> {{validationDatas.getParticipant().getUser().getDisplayName()}}</h3>
{% if validationDatas.getNote() != '' %}
: {{validationDatas.getNote()|nl2br}}
<p> {{validationDatas.getNote()|nl2br}}</p>
{% endif %}
</div>
</div>
{% endif %}
{% endfor %}
</td>
</tr>
</table>
</div>
</div>
<div><hr/></div>
</div>
</div>
{% endfor %}
</div>

View File

@@ -16,9 +16,10 @@
<a class="workzone-menu-title" href="{{ path('prod_baskets_basket', { 'basket' : basket.getId() }) }}">
<span>
{% if not basket.isRead() %}
<img src='/assets/common/images/icons/basket_push_unread.png' title=''/>
<img src='/assets/common/images/icons/basket_feedback_unread.png' title=''/>
{% else %}
<img src='/assets/common/images/icons/basket_feedback_read.png' title=''/>
{% endif %}
<img src='/assets/common/images/icons/basket.png' title=''/>
{{basket.getName()|e}}
</span>
</a>
@@ -26,11 +27,9 @@
<table>
<tr>
<td>
<img
title="{{ basket.getDescription() }}"
class="basketTips basket_title"
src="/assets/common/images/icons/valid.png"
/>
<img title="{{ basket.getDescription()|e }}"
class="basket_title"
src="/assets/common/images/icons/valid.png" />
</td>
<td>
<a class="contextMenuTrigger icon-display-grid" href="#"></a>

View File

@@ -218,8 +218,8 @@
</span>
</td>
<td class="options">
<button class="select-all round-blue-border-btn" style="width: 128px; margin-right: 10px;">{{ 'Select all' | trans }}</button>
<button class="unselect-all round-blue-border-btn" style="width: 128px;">{{ 'Deselect all' | trans }}</button>
<button class="select-all round-blue-border-btn" style="margin-right: 10px;">{{ 'Select all' | trans }}</button>
<button class="unselect-all round-blue-border-btn">{{ 'Deselect all' | trans }}</button>
<button class="delete-selection btn btn-inverse">{{ 'prod:push: delete selection' | trans }}</button>
</td>
</tr>

View File

@@ -1,4 +1,5 @@
{% include 'prod/results/record.html.twig' with {
'record': record,
'settings': settings
'settings': settings,
'plugins': plugins
} %}

View File

@@ -7,7 +7,8 @@
<td valign="top" style='width:{{ settings.images_size + 50 }}px'>
{% include 'prod/results/record.html.twig' with {
'record': record,
'settings': settings
'settings': settings,
'plugins': plugins
} %}
</td>
<td valign="middle">

View File

@@ -155,6 +155,29 @@
</div>
{% endif %}
{% endif %}
{# add plugins entries #}
{% for plugin in plugins.actionbar|default([]) %}
{% set menu = plugin.ActionBar['_context_']|default([]) %}
{% for k, action in menu %}
{% if plugin.isContextMenuOptionAvailable(k, record) %}
<div title="" class="context-menu-item"
onclick="{{ plugin.getContextMenuJS(k) }}('{{ k }}', '{{record.baseId}}', '{{record.recordId}}', '{{ record.id }}');">
<div class="context-menu-item-inner">
{% set icon = (action.icon ?? false) ? plugin_asset(plugin.PluginName, action.icon) : null %}
{% set label = (action.label ?? false) ? (action.label|trans({}, plugin.PluginLocale)) : 'undefined label' %}
<a title="{{ label }}" href="#">
{% if icon %}
<img style="cursor:pointer;" src="{{ icon }}" alt="{{ label }}">
{% endif %}
<span>{{ label }}</span>
</a>
</div>
</div>
{% endif %}
{% endfor %}
{% endfor %}
</div>
</td>
</tr>

View File

@@ -31,7 +31,8 @@
'doctype_display': doctype_display,
'handle_dblclick' : true,
'show_context_menu': true
}
},
'plugins': plugins
} %}
{% endblock %}
{% endfor %}

View File

@@ -44,270 +44,159 @@
</div>
</span>
<span class="dropdownButton">
<div class="btn-group">
<button id="TOOL_disktt" class="default_action TOOL_disktt_btn results_window btn btn-inverse" data-selection-source="search-result">
<img src="/assets/common/images/icons/disktt_history.png" height="16" width="16" class="btn-image"/> {{ 'action : exporter' | trans }}
</button>
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="TOOL_print_btn results_window" data-selection-source="search-result">
<img src="/assets/common/images/icons/print_history.png" height="16" width="16" class="btn-image"/>
{{ 'action : print' | trans }}
</a>
</li>
</ul>
</div>
</span>
{% set menus = {
'export': [
{
'class':'TOOL_disktt_btn',
'icon':'/assets/common/images/icons/disktt_history.png',
'label':'action : exporter' | trans },
{
'class':'TOOL_print_btn',
'icon':'/assets/common/images/icons/print_history.png',
'label':'action : print' | trans }
],
'edit': [],
'push': [],
'tools': [],
'delete': []
} %}
{% set actions = {} %}
{# menu "edit" #}
{% set m = [] %}
{% if acl.has_right(constant('\\ACL::CANMODIFRECORD')) %}
{% set label %}
{{ 'action : editer' | trans }}
{% endset %}
{% set actions = actions|merge( { 'edit' : {'icon': "/assets/common/images/icons/ppen_history.png", 'class':'TOOL_ppen_btn', 'label' : label} }) %}
{% set label %}
{{ 'prod::toolbar : video editor' | trans }}
{% endset %}
{% set actions = actions|merge( { 'video' : {'icon': "/assets/common/images/icons/icon-video-editor.png", 'class':'TOOL_videoeditor_btn', 'label' : label} }) %}
{% set m = m|merge([
{
'class':'TOOL_ppen_btn',
'icon':'/assets/common/images/icons/ppen_history.png',
'label':'action : editer' | trans },
{
'class':'TOOL_videoeditor_btn',
'icon':'/assets/common/images/icons/icon-video-editor.png',
'label':'prod::toolbar : video editor' | trans }
]) %}
{% endif %}
{% if acl.has_right(constant('\\ACL::CHGSTATUS')) %}
{% set label %}
{{ 'action : status' | trans }}
{% endset %}
{% set actions = actions|merge( { 'status' : {'icon': "/assets/common/images/icons/chgstatus_history.png", 'class':'TOOL_chgstatus_btn', 'label' : label} }) %}
{% if acl.has_right(constant('\\\ACL::CHGSTATUS')) %}
{% set m = m|merge([
{
'class':'TOOL_chgstatus_btn',
'icon':'/assets/common/images/icons/chgstatus_history.png',
'label':'action : status' | trans }
]) %}
{% endif %}
{% if acl.has_right(constant('\\ACL::CANDELETERECORD')) and acl.has_right(constant('\\ACL::CANADDRECORD')) %}
{% set label %}
{{ 'action : collection' | trans }}
{% endset %}
{% set actions = actions|merge( { 'move' : {'icon': "/assets/common/images/icons/chgcoll_history.png", 'class':'TOOL_chgcoll_btn', 'label' : label} }) %}
{% set m = m|merge([
{
'class':'TOOL_chgcoll_btn',
'icon':'/assets/common/images/icons/chgcoll_history.png',
'label':'action : collection' | trans }
]) %}
{% endif %}
{% set menus = menus|merge({'edit' : m}) %}
{% set n_actions = actions|length %}
{% if n_actions > 1 %}
<span class="dropdownButton">
<div class="btn-group">
{% for action in actions %}
{% if loop.first %}
<button class="default_action {{ action.class }} results_window btn btn-inverse" data-selection-source="search-result">
<img src="{{ action.icon }}" height="16" width="16" class="btn-image"/> {{ action.label }}
</button>
{# menu "push" #}
{% set m = [] %}
{% if acl.has_right(constant('\\ACL::CANPUSH')) %}
{% set m = m|merge([
{
'class':'TOOL_pushdoc_btn',
'icon':'/assets/common/images/icons/push16.png',
'label':'action : push' | trans },
{
'class':'TOOL_feedback_btn',
'icon':'/assets/common/images/icons/feedback16.png',
'label':'Feedback' | trans }
]) %}
{% endif %}
{% endfor %}
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
<ul class="dropdown-menu">
{% for action in actions %}
{% if not loop.first %}
<li>
<a class="{{ action.class }} results_window" data-selection-source="search-result">
<img src="{{ action.icon }}" height="16" width="16" class="btn-image"/>
{{ action.label }}
</a>
</li>
{% if not loop.last %}
<li class="divider"></li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
</div>
</span>
{% elseif n_actions == 1 %}
<span class="classicButton">
<div class="btn-group">
{% for action in actions %}
<button class="{{ action.class }} results_window btn btn-inverse" data-selection-source="search-result">
<img src="{{ action.icon }}" height="16" width="16" class="btn-image"/> {{ action.label }}
</button>
{% endfor %}
</div>
</span>
{% endif %}
{% if acl.has_right(constant('\\ACL::CANPUSH')) and acl.has_right(constant('\\ACL::BAS_CHUPUB')) %}
<span class="dropdownButton">
<div class="btn-group">
<button class="TOOL_pushdoc_btn default_action results_window btn btn-inverse" data-selection-source="search-result">
<img src="/assets/common/images/icons/push16.png" height="16" width="16" class="btn-image"/> {{ 'action : push' | trans }}
</button>
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
<ul class="dropdown-menu">
<li>
<a class="TOOL_feedback_btn results_window" data-selection-source="search-result">
<img src="/assets/common/images/icons/feedback16.png" height="16" width="16" class="btn-image"/>
{{ 'Feedback' | trans }}
</a>
</li>
{#<li class="divider"></li>#}
{#<li>#}
{#<a class="TOOL_bridge_btn results_window" href="{{ path("prod_bridge_manager") }}" data-selection-source="search-result">#}
{#<img src="/assets/common/images/icons/door.png" height="16" width="16" class="btn-image"/>#}
{#{{ 'action : bridge' | trans }}#}
{#</a>#}
{#</li>#}
<li class="divider"></li>
<li>
<a class="TOOL_publish_btn results_window" data-selection-source="search-result">
<img src="/assets/common/images/icons/rss16.png" height="16" width="16" class="btn-image"/>
{{ 'action : publier' | trans }}
</a>
</li>
{% if plugins.actionbar is not empty %}
{% for plugin in plugins.actionbar %}
<li class="divider"></li>
{% for key, action in plugin.getActionBar().push|default([]) %}
<li>
<a class="results_window {{ action.classes|default('') }}" data-selection-source="search-result">
{% if action.icon %}
<img src="{{ plugin_asset(plugin.PluginName, action.icon) }}" height="16" width="16" class="btn-image"/>
{% endif %}
{{ action.label|trans({}, plugin.PluginLocale) }}
</a>
</li>
{% endfor %}
{% endfor %}
{% endif %}
</ul>
</div>
</span>
{% elseif acl.has_right(constant('\\ACL::CANPUSH')) %}
<span class="dropdownButton">
<div class="btn-group">
<button class="TOOL_pushdoc_btn default_action results_window btn btn-inverse" data-selection-source="search-result">
<img src="/assets/common/images/icons/push16.png" height="16" width="16" class="btn-image"/> {{ 'action : push' | trans }}
</button>
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
<ul class="submenu dropdown-menu">
<li>
<a class="TOOL_feedback_btn results_window" data-selection-source="search-result">
<img src="/assets/common/images/icons/feedback16.png" height="16" width="16" class="btn-image"/>
{{ 'Feedback' | trans }}
</a>
</li>
{% if plugins.actionbar is not empty %}
{% for plugin in plugins.actionbar %}
<li class="divider"></li>
{% for key, action in plugin.getActionBar().push|default([]) %}
<li>
<a class="results_window {{ action.classes|default('') }}" data-selection-source="search-result">
{% if action.icon %}
<img src="{{ plugin_asset(plugin.PluginName, action.icon) }}" height="16" width="16" class="btn-image"/>
{% endif %}
{{ action.label|trans({}, plugin.PluginLocale) }}
</a>
</li>
{% endfor %}
{% endfor %}
{% endif %}
</ul>
</div>
</span>
{% elseif acl.has_right(constant('\\ACL::BAS_CHUPUB')) %}
<span class="dropdownButton">
<div class="btn-group">
{#<button class="TOOL_pushdoc_btn default_action results_window btn btn-inverse" data-selection-source="search-result">#}
{#<img src="/assets/common/images/icons/door.png" height="16" width="16" class="btn-image"/> {{ 'action : bridge' | trans }}#}
{#</button>#}
<button class="TOOL_publish_btn results_window btn btn-inverse">
<img src="/assets/common/images/icons/rss16.png" height="16" width="16" class="btn-image"/>
{{ 'action : publier' | trans }}
</button>
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
{% if plugins.actionbar is not empty %}
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
<ul class="submenu dropdown-menu">
{% for plugin in plugins.actionbar %}
<li class="divider"></li>
{% for key, action in plugin.getActionBar().push|default([]) %}
<li>
<a class="results_window {{ action.classes|default('') }}">
{% if action.icon %}
<img src="{{ plugin_asset(plugin.PluginName, action.icon) }}"
height="16" width="16" class="btn-image"/>
{% endif %}
{{ action.label|trans({}, plugin.PluginLocale) }}
</a>
</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
</div>
</span>
{% elseif plugins.actionbar is not empty %}
<span class="dropdownButton">
<div class="btn-group">
{% set firstButton = true %}
{% for plugin in plugins.actionbar %}
{% for key, action in plugin.getActionBar().push|default([]) %}
{% if firstButton %}
<button class="default_action results_window btn btn-inverse" data-selection-source="search-result">
<a class="results_window {{ action.classes|default('') }}" data-selection-source="search-result">
{% if action.icon %}
<img src="{{ plugin_asset(plugin.PluginName, action.icon) }}" height="16" width="16"/>
{% endif %}
{{ action.label|trans({}, plugin.PluginLocale) }}
</a>
</button>
{% if not (loop.last and loop.parent.loop.last) %}
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
<ul class="submenu dropdown-menu">
{% endif %}
{% if not loop.first %}<li class="divider"></li>{% endif %}
{% if not firstButton %}
<li>
<a class="results_window {{ action.classes|default('') }}" data-selection-source="search-result">
{% if action.icon %}
<img src="{{ plugin_asset(plugin.PluginName, action.icon) }}" height="16" width="16" class="btn-image"/>
{% endif %}
{{ action.label|trans({}, plugin.PluginLocale) }}
</a>
</li>
{% else %}
{% set firstButton = false %}
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
{% if not firstButton %}
</ul>
{% endif %}
</div>
</span>
{% if acl.has_right(constant('\\ACL::BAS_CHUPUB')) %}
{% set m = m|merge([
{
'class':'TOOL_publish_btn',
'icon':'/assets/common/images/icons/rss16.png',
'label':'action : publier' | trans }
]) %}
{% endif %}
{% set menus = menus|merge({'push' : m}) %}
{# menu "tools" #}
{% if acl.has_right(constant('\\ACL::IMGTOOLS')) %}
<span class="classicButton">
<div class="btn-group">
<button class="TOOL_imgtools_btn results_window btn btn-inverse" data-selection-source="search-result">
<img src="/assets/common/images/icons/imgtools_history.png" height="16" width="16" class="btn-image"/> {{ 'action : outils' | trans }}
</button>
</div>
</span>
{% set menus = menus|merge({'tools' : [
{
'class':'TOOL_imgtools_btn',
'icon':'/assets/common/images/icons/imgtools_history.png',
'label':'action : outils' | trans }
]}) %}
{% endif %}
{# menu "delete" #}
{% if acl.has_right(constant('\\ACL::CANDELETERECORD')) %}
<span class="classicButton">
{% set menus = menus|merge({'delete' : [
{
'class':'TOOL_trash_btn',
'icon':'/assets/common/images/icons/delete.png',
'label':'action : supprimer' | trans }
]}) %}
{% endif %}
{# add plugins entries #}
{% if plugins.actionbar is not empty %}
{% for plugin in plugins.actionbar %}
{% for k, menu in plugin.getActionBar() %}
{% if k != '_context_' %}
{% set m = menus[k]|default([]) %}
{% for action in menu %}
{% set m = m|merge([{
'class':action.classes|default(''),
'icon':plugin_asset(plugin.PluginName, action.icon),
'label':action.label|trans({}, plugin.PluginLocale) }])
%}
{% endfor %}
{% set menus = menus|merge({(k) : m}) %}
{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
{# print #}
{% for menu_entries in menus %}
{% if menu_entries|length > 0 %}
<span class="dropdownButton">
<div class="btn-group">
<button class="TOOL_trash_btn results_window btn btn-inverse" data-selection-source="search-result">
<img src="/assets/common/images/icons/delete.png" height="16" width="16" class="btn-image"/> {{ 'action : supprimer' | trans }}
{% set menu_entry = menu_entries[0] %}
<button class="results_window btn btn-inverse {{ menu_entry.class }}" data-selection-source="search-result">
<img src="{{ menu_entry.icon }}" class="btn-image"/>
{{ menu_entry.label }}
</button>
{% set menu_entries = menu_entries|slice(1) %}
{% if menu_entries|length > 0 %}
<button class="trigger btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span
class="caret"></span></button>
<ul class="dropdown-menu">
{% for menu_entry in menu_entries %}
<li>
<a class="results_window {{ menu_entry.class }}" data-selection-source="search-result">
<img src="{{ menu_entry.icon }}" class="btn-image"/>
{{ menu_entry.label }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</span>
{% endif %}
{% endfor %}
{% endblock %}
{% block toolbarJS %}
{% if plugins.actionbar is not empty %}
{% for plugin in plugins.actionbar %}
{{ (plugin.JS|default(''))|raw }}
{% for pluginId, plugin in plugins.actionbar %}
{% if plugin.getActionBarTemplate is defined %}
{% set template = plugin.getActionBarTemplate() %}
{% if template %}
{% include template with {'app': app, 'plugin_id': pluginId, 'plugin': plugin} only %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endblock %}

View File

@@ -3815,9 +3815,9 @@ fsevents@^1.0.0, fsevents@^1.1.2, fsevents@^1.2.7:
node-pre-gyp "^0.12.0"
fstream@^1.0.0, fstream@^1.0.2:
version "1.0.11"
resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
version "1.0.12"
resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
dependencies:
graceful-fs "^4.1.2"
inherits "~2.0.0"
@@ -4049,7 +4049,7 @@ glob@^5.0.15:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
@@ -4061,6 +4061,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.3:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@~3.1.21:
version "3.1.21"
resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
@@ -4166,10 +4178,10 @@ graceful-fs@^3.0.0:
dependencies:
natives "^1.1.0"
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.4:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.2.3"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
graceful-fs@~1.2.0:
version "1.2.3"
@@ -4181,6 +4193,11 @@ graceful-fs@~2.0.0:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0"
integrity sha1-fNLNsiiko/Nule+mzBQt59GhNtA=
graceful-fs@~4.1.4:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
@@ -4757,7 +4774,12 @@ inherits@1:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
@@ -5283,14 +5305,10 @@ jquery-simplecolorpicker@^0.3.1:
resolved "https://registry.yarnpkg.com/jquery-simplecolorpicker/-/jquery-simplecolorpicker-0.3.1.tgz#4f6befd380ab05470f585d5482e5180556e460eb"
integrity sha1-T2vv04CrBUcPWF1UguUYBVbkYOs=
"jquery-treeview@git+https://github.com/alchemy-fr/jquery-treeview.git#1e9e5a49d2875b878801e904cd08c2d25e85af1e":
version "1.4.2"
resolved "git+https://github.com/alchemy-fr/jquery-treeview.git#1e9e5a49d2875b878801e904cd08c2d25e85af1e"
"jquery-treeview@https://github.com/alchemy-fr/jquery-treeview.git":
"jquery-treeview@git+https://github.com/alchemy-fr/jquery-treeview.git", "jquery-treeview@git+https://github.com/alchemy-fr/jquery-treeview.git#1e9e5a49d2875b878801e904cd08c2d25e85af1e":
version "1.4.2"
uid "1e9e5a49d2875b878801e904cd08c2d25e85af1e"
resolved "https://github.com/alchemy-fr/jquery-treeview.git#1e9e5a49d2875b878801e904cd08c2d25e85af1e"
resolved "git+https://github.com/alchemy-fr/jquery-treeview.git#1e9e5a49d2875b878801e904cd08c2d25e85af1e"
jquery-ui-datepicker-with-i18n@^1.10.4:
version "1.10.4"
@@ -6487,9 +6505,9 @@ mitt@^1.1.3:
integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==
mixin-deep@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
version "1.3.2"
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
dependencies:
for-in "^1.0.2"
is-extendable "^1.0.1"
@@ -7547,10 +7565,10 @@ phantomjs-prebuilt@^2.1.3:
request-progress "^2.0.1"
which "^1.2.10"
phraseanet-common@^0.4.1:
version "0.4.2"
resolved "https://registry.yarnpkg.com/phraseanet-common/-/phraseanet-common-0.4.2.tgz#740de9bf254116adc506c9703015ab1533f89864"
integrity sha512-uyKULVCV9df161A970mWnZtdxAb/ZWCuUdnSTn0T9AGvwsWvKf2p6+pgEVtBQ81LIGn1m5UlhiF7dUlc6nT7iQ==
phraseanet-common@^0.4.5-d:
version "0.4.5-d"
resolved "https://registry.yarnpkg.com/phraseanet-common/-/phraseanet-common-0.4.5-d.tgz#193da1ab062f98e99729b7f98a7bbe32c495c7f3"
integrity sha512-7mmPDg0pFnFYyY1eazmUcDa18SGXp90zEBYTNzVan6goPPBjUmA0YwzBiuvDnxlcwMX8x0kDIrOouOBfWG5E1w==
dependencies:
es6-promise "^4.1.1"
humane-js "^3.2.2"
@@ -7559,10 +7577,10 @@ phraseanet-common@^0.4.1:
js-cookie "^2.1.0"
pym.js "^1.3.1"
phraseanet-production-client@0.34.76-d:
version "0.34.76-d"
resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.76-d.tgz#641e9bc4379725ee06669c7cefe0bc78996342e0"
integrity sha512-/SYoQrhVHfvtchjwmVm0/QkuWBTcmbPpNlepCKvjTMZBBPLepe+eUNHJh/vcnd+tCZkeYWu16kQvvdjs92dn5Q==
phraseanet-production-client@^0.34.86-d:
version "0.34.86-d"
resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.86-d.tgz#51e6c6fb17fcd2695cee90fb3d972c781057fd78"
integrity sha512-12o7pcRZAJ/5Ote4DbkaRxLz2GIZBUcZf53FB+GHVFxhds5ia6UNDCPhYP5vX4hhHtO/Y6Mj/BOlOjnoyi+k1g==
dependencies:
"@mapbox/mapbox-gl-language" "^0.9.2"
"@turf/turf" "^5.1.6"
@@ -7593,7 +7611,7 @@ phraseanet-production-client@0.34.76-d:
mapbox-gl-circle "^1.6.5"
mapbox.js "^2.4.0"
nouislider "^9.2.0"
phraseanet-common "^0.4.1"
phraseanet-common "^0.4.5-d"
pym.js "^1.3.1"
rx "^4.1.0"
sprintf-js "^1.1.1"
@@ -8300,9 +8318,9 @@ right-align@^0.1.1:
align-text "^0.1.1"
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.0, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"