// __('Fluidbook ":title" (#:nb) installé sur :server')
protected $_installSubject = 'Fluidbook ":title" (#:nb) installé sur :server';
+ // __('Le Fluidbook ":title" est prêt au téléchargement.');
+ protected $_text = 'Le Fluidbook ":title" est prêt au téléchargement.';
+
+ // __('Le Fluidbook ":title" a été installé sur :server.')
+ protected $_installText = 'Le Fluidbook ":title" a été installé sur :server.';
+
protected $_params = [];
public function __construct($entry, $version, $action, $user, $params = [])
{
try {
$url = $this->_compileandpackage();
- $subject = __($this->_subject, ['title' => $this->_title(), 'nb' => $this->_id()]);
- $text = '';
+ $translateVariables = ['title' => $this->_title(), 'nb' => $this->_id()];
+
+ $subject = __($this->_subject, $translateVariables);
+ $text = __($this->_text, $translateVariables);
$actions = [];
if ($this->action === 'download' || $this->action === 'scormcloud') {
$actions = ['Télécharger' => $url];
if (!$dest) {
throw new \Exception('No path defined for external server installation');
}
- $subject = __($this->_installSubject, ['title' => $this->_title(), 'nb' => $this->_id(), 'server' => $server->name]);
+
+ $translateVariables['server'] = $server->name;
+ $subject = __($this->_installSubject, $translateVariables);
+ $text = __($this->_installText, $translateVariables);
$path = $this->_compileandpackage(false);
$driver = $server->getTransferDriver();
protected $_subject;
+ protected $_text;
+
/**
* @param $entry CubistMagicAbstractModel
* @param $action string
{
try {
$url = $this->_compileandpackage();
- $subject = __($this->_subject, ['title' => $this->_title(), 'nb' => $this->_id()]);
- $text = '';
- $actions = ['Télécharger' => $url];
+ $translateVariables = $this->_getTranslateVariables();
+ $subject = __($this->_subject, $translateVariables);
+ $text = __($this->_text, $translateVariables);
+ $actions = [__('Télécharger') => $url];
try {
if ($this->action === 'scormcloud') {
$scormURL = ScormCloud::send($url, 'toolbox_' . $this->type . '_' . $this->_id());
$this->sendNotification($subject, $text, $actions);
}
+ protected function _getTranslateVariables()
+ {
+ return ['title' => $this->_title(), 'nb' => $this->_id()];
+ }
+
protected function _compileandpackage()
{
protected $type = 'elearningmedia';
// __('Media ":title" (#:nb) prêt au téléchargement')
protected $_subject = 'Media ":title" (#:nb) prêt au téléchargement';
+ // __('Le media ":title" est prêt au téléchargement');
+ protected $_text = 'Le media ":title" est prêt au téléchargement';
}
protected $type = 'elearningpackage';
// __('Package ":title" (#:nb) prêt au téléchargement')
protected $_subject = 'Package ":title" (#:nb) prêt au téléchargement';
+ // __('Le package ":title" est prêt au téléchargement');
+ protected $_text = 'Le package ":title" est prêt au téléchargement';
}
// __('Collection ":title" (#:nb) prête au téléchargement')
protected $_subject = 'Collection ":title" (#:nb) prête au téléchargement';
+ // __('La collection ":title" est prêt au téléchargement');
+ protected $_text = 'La collection ":title" est prêt au téléchargement';
public function handle()
{
+ $translateVariables = $this->_getTranslateVariables();
if ($this->action === 'install') {
$url = $this->installHosting($this->entry->getPageData());
- $this->sendNotification(__('Collection ":title" (#:nb) installée sur le serveur hosting', ['title' => $this->_title(), 'nb' => $this->_id()]), '', $url);
+ $this->sendNotification(__('Collection ":title" (#:nb) installée sur le serveur hosting', $translateVariables), '', $url);
} else if ($this->action === 'export' && in_array($this->entry->version, ['win_inss_html', 'win_ins_html'])) {
$url = $this->downloadList($this->entry->getPageData());
- $this->sendNotification(__('Collection ":title" (#:nb) prête au téléchargement', ['title' => $this->_title(), 'nb' => $this->_id()]), '', $url);
+ $this->sendNotification(__($this->_subject, $translateVariables), __($this->_text,$translateVariables), $url);
} else {
parent::handle();
}
protected $type = 'quiz';
// __('Quiz ":title" (#:nb) prêt au téléchargement')
protected $_subject = 'Quiz ":title" (#:nb) prêt au téléchargement';
+ // __('Le quiz ":title" est prêt au téléchargement')
+ protected $_text = 'Le quiz ":title" est prêt au téléchargement';
+
}
throw new \Exception('Fluidbook has not be set');
}
$this->setJobName(__('Téléchargement massif d\'assets dans un fluidbook'));
- $this->dest = '/application/protected/fluidbookpublication/working/' . $fluidbook . '/';
+ $this->dest = Files::mkdir(protected_path('fluidbookpublication/working/' . $fluidbook));
if ($folder !== 'working') {
$this->dest .= $folder . '/';
}
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
+use Illuminate\Support\HtmlString;
class DownloadReady extends Notification
{
protected $subject;
protected $text;
protected $actions = [];
+ protected $error = false;
/**
* Create a new notification instance.
*
* @return void
*/
- public function __construct($subject = '', $text = '', $actions = [])
+ public function __construct($subject = '', $text = '', $actions = [], $error = false)
{
$this->subject = $subject;
$this->text = $text;
$this->actions = $actions;
+ $this->error = $error;
}
/**
*/
public function via($notifiable)
{
+ return ['database', 'mail'];
if ($notifiable->slack) {
return ['database', FluidbookslackChannel::class];
} else {
*/
public function toMail($notifiable)
{
- return (new MailMessage)
- ->line('The introduction to the notification.')
- ->action('Notification Action', url('/'))
- ->line('Thank you for using our application!');
+ $m = (new MailMessage)->greeting(__('Bonjour !'))
+ ->subject($this->subject);
+ if ($this->text) {
+ $m->line($this->text);
+ }
+ foreach ($this->actions as $label => $url) {
+ $m->line(new HtmlString($label . __(': ') . ' <a href="' . $url . '">' . $url . '</a>'));
+ }
+ $m->salutation(new HtmlString(__('Cordialement,') . "<br>" . __('L\'équipe Fluidbook')));
+ if ($this->error) {
+ $m->error();
+ } else {
+ $m->success();
+ }
+ return $m;
+
}
/**
--- /dev/null
+<table class="action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td align="center">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td align="center">
+<table border="0" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td>
+<a href="{{ $url }}" class="button button-{{ $color ?? 'primary' }}" target="_blank" rel="noopener">{{ $slot }}</a>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
--- /dev/null
+<tr>
+<td>
+<table class="footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td class="content-cell" align="center">
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+</td>
+</tr>
+</table>
+</td>
+</tr>
--- /dev/null
+<tr>
+<td class="header">
+<a href="{{ $url }}" style="display: inline-block;">
+@if (trim($slot) === 'Laravel')
+<img src="https://laravel.com/img/notification-logo.png" class="logo" alt="Laravel Logo">
+@else
+{{ $slot }}
+@endif
+</a>
+</td>
+</tr>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="color-scheme" content="light">
+<meta name="supported-color-schemes" content="light">
+<style>
+@media only screen and (max-width: 600px) {
+.inner-body {
+width: 100% !important;
+}
+
+.footer {
+width: 100% !important;
+}
+}
+
+@media only screen and (max-width: 500px) {
+.button {
+width: 100% !important;
+}
+}
+</style>
+</head>
+<body>
+
+<table class="wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td align="center">
+<table class="content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
+{{ $header ?? '' }}
+
+<!-- Email Body -->
+<tr>
+<td class="body" width="100%" cellpadding="0" cellspacing="0">
+<table class="inner-body" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
+<!-- Body content -->
+<tr>
+<td class="content-cell">
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+
+{{ $subcopy ?? '' }}
+</td>
+</tr>
+</table>
+</td>
+</tr>
+
+{{ $footer ?? '' }}
+</table>
+</td>
+</tr>
+</table>
+</body>
+</html>
--- /dev/null
+@component('mail::layout')
+ {{-- Header --}}
+ @slot('header')
+ @component('mail::header', ['url' => config('app.url')])
+ <img src="{{url('/images/logo-email.png')}}" height="47" width="300" alt="{{ config('app.name') }}"/>
+ @endcomponent
+ @endslot
+
+ {{-- Body --}}
+ {{ $slot }}
+
+ {{-- Subcopy --}}
+ @isset($subcopy)
+ @slot('subcopy')
+ @component('mail::subcopy')
+ {{ $subcopy }}
+ @endcomponent
+ @endslot
+ @endisset
+
+ {{-- Footer --}}
+ @slot('footer')
+ @component('mail::footer')
+ © {{ date('Y') }} {{ config('app.name') }}
+@endcomponent
+@endslot
+@endcomponent
--- /dev/null
+<table class="panel" width="100%" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td class="panel-content">
+<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td class="panel-item">
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
--- /dev/null
+<table class="subcopy" width="100%" cellpadding="0" cellspacing="0" role="presentation">
+<tr>
+<td>
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+</td>
+</tr>
+</table>
--- /dev/null
+<div class="table">
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+</div>
--- /dev/null
+/* Base */
+
+body,
+body *:not(html):not(style):not(br):not(tr):not(code) {
+ box-sizing: border-box;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+ position: relative;
+}
+
+html{
+ min-height: 100%;
+ height: 100%;
+}
+
+body {
+ -webkit-text-size-adjust: none;
+ background-color: #edf2f7;
+ color: #718096;
+ min-height: 100%;
+ height: 100%;
+ line-height: 1.4;
+ margin: 0;
+ padding: 0;
+ width: 100% !important;
+}
+
+p,
+ul,
+ol,
+blockquote {
+ line-height: 1.4;
+ text-align: left;
+}
+
+a {
+ color: #3869d4;
+}
+
+a img {
+ border: none;
+}
+
+/* Typography */
+
+h1 {
+ color: #3d4852;
+ font-size: 18px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h2 {
+ font-size: 16px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h3 {
+ font-size: 14px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+p {
+ font-size: 16px;
+ line-height: 1.5em;
+ margin-top: 0;
+ text-align: left;
+}
+
+p.sub {
+ font-size: 12px;
+}
+
+img {
+ max-width: 100%;
+}
+
+/* Layout */
+
+.wrapper {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.content {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+/* Header */
+
+.header {
+ padding: 25px 0;
+ text-align: center;
+}
+
+.header a {
+ color: #3d4852;
+ font-size: 19px;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/* Logo */
+
+.logo {
+ height: 75px;
+ max-height: 75px;
+ width: 75px;
+}
+
+/* Body */
+
+.body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ border-bottom: 1px solid #edf2f7;
+ border-top: 1px solid #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.inner-body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ background-color: #ffffff;
+ border-color: #e8e5ef;
+ border-radius: 2px;
+ border-width: 1px;
+ box-shadow: 0 2px 0 rgba(0, 0, 150, 0.025), 2px 4px 0 rgba(0, 0, 150, 0.015);
+ margin: 0 auto;
+ padding: 0;
+ width: 570px;
+}
+
+/* Subcopy */
+
+.subcopy {
+ border-top: 1px solid #e8e5ef;
+ margin-top: 25px;
+ padding-top: 25px;
+}
+
+.subcopy p {
+ font-size: 14px;
+}
+
+/* Footer */
+
+.footer {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ margin: 0 auto;
+ padding: 0;
+ text-align: center;
+ width: 570px;
+}
+
+.footer p {
+ color: #b0adc5;
+ font-size: 12px;
+ text-align: center;
+}
+
+.footer a {
+ color: #b0adc5;
+ text-decoration: underline;
+}
+
+/* Tables */
+
+.table table {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ width: 100%;
+}
+
+.table th {
+ border-bottom: 1px solid #edeff2;
+ margin: 0;
+ padding-bottom: 8px;
+}
+
+.table td {
+ color: #74787e;
+ font-size: 15px;
+ line-height: 18px;
+ margin: 0;
+ padding: 10px 0;
+}
+
+.content-cell {
+ max-width: 100vw;
+ padding: 32px;
+}
+
+/* Buttons */
+
+.action {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ padding: 0;
+ text-align: center;
+ width: 100%;
+}
+
+.button {
+ -webkit-text-size-adjust: none;
+ border-radius: 4px;
+ color: #fff;
+ display: inline-block;
+ overflow: hidden;
+ text-decoration: none;
+}
+
+.button-blue,
+.button-primary {
+ background-color: #2d3748;
+ border-bottom: 8px solid #2d3748;
+ border-left: 18px solid #2d3748;
+ border-right: 18px solid #2d3748;
+ border-top: 8px solid #2d3748;
+}
+
+.button-green,
+.button-success {
+ background-color: #48bb78;
+ border-bottom: 8px solid #48bb78;
+ border-left: 18px solid #48bb78;
+ border-right: 18px solid #48bb78;
+ border-top: 8px solid #48bb78;
+}
+
+.button-red,
+.button-error {
+ background-color: #e53e3e;
+ border-bottom: 8px solid #e53e3e;
+ border-left: 18px solid #e53e3e;
+ border-right: 18px solid #e53e3e;
+ border-top: 8px solid #e53e3e;
+}
+
+/* Panels */
+
+.panel {
+ border-left: #2d3748 solid 4px;
+ margin: 21px 0;
+}
+
+.panel-content {
+ background-color: #edf2f7;
+ color: #718096;
+ padding: 16px;
+}
+
+.panel-content p {
+ color: #718096;
+}
+
+.panel-item {
+ padding: 0;
+}
+
+.panel-item p:last-of-type {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+/* Utilities */
+
+.break-all {
+ word-break: break-all;
+}
--- /dev/null
+{{ $slot }}: {{ $url }}
--- /dev/null
+{{ $slot }}
--- /dev/null
+[{{ $slot }}]({{ $url }})
--- /dev/null
+{!! strip_tags($header) !!}
+
+{!! strip_tags($slot) !!}
+@isset($subcopy)
+
+{!! strip_tags($subcopy) !!}
+@endisset
+
+{!! strip_tags($footer) !!}
--- /dev/null
+@component('mail::layout')
+ {{-- Header --}}
+ @slot('header')
+ @component('mail::header', ['url' => config('app.url')])
+ {{ config('app.name') }}
+ @endcomponent
+ @endslot
+
+ {{-- Body --}}
+ {{ $slot }}
+
+ {{-- Subcopy --}}
+ @isset($subcopy)
+ @slot('subcopy')
+ @component('mail::subcopy')
+ {{ $subcopy }}
+ @endcomponent
+ @endslot
+ @endisset
+
+ {{-- Footer --}}
+ @slot('footer')
+ @component('mail::footer')
+ © {{ date('Y') }} {{ config('app.name') }}.
+ @endcomponent
+ @endslot
+@endcomponent
--- /dev/null
+{{ $slot }}
--- /dev/null
+{{ $slot }}
--- /dev/null
+{{ $slot }}
--- /dev/null
+@component('mail::message')
+{{-- Greeting --}}
+@if (! empty($greeting))
+# {{ $greeting }}
+@else
+@if ($level === 'error')
+# @lang('Whoops!')
+@else
+# @lang('Hello!')
+@endif
+@endif
+
+@slot('header')
+
+@endslot
+
+{{-- Intro Lines --}}
+@foreach ($introLines as $line)
+{{ $line }}
+
+@endforeach
+
+{{-- Action Button --}}
+@isset($actionText)
+<?php
+ switch ($level) {
+ case 'success':
+ case 'error':
+ $color = $level;
+ break;
+ default:
+ $color = 'primary';
+ }
+?>
+@component('mail::button', ['url' => $actionUrl, 'color' => $color])
+{{ $actionText }}
+@endcomponent
+@endisset
+
+{{-- Outro Lines --}}
+@foreach ($outroLines as $line)
+{{ $line }}
+
+@endforeach
+
+{{-- Salutation --}}
+@if (! empty($salutation))
+{{ $salutation }}
+@else
+@lang('Regards'),<br>
+{{ config('app.name') }}
+@endif
+
+{{-- Subcopy --}}
+@isset($actionText)
+@slot('subcopy')
+@lang(
+ "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
+ 'into your web browser:',
+ [
+ 'actionText' => $actionText,
+ ]
+) <span class="break-all">[{{ $displayableActionUrl }}]({{ $actionUrl }})</span>
+@endslot
+@endisset
+@endcomponent