email_comunications.blade.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. <div class="col card--ui" id="card--dashboard">
  2. @if(!$add && !$update)
  3. <header id="title--section" style="display:none !important" class="d-flex align-items-center justify-content-between">
  4. <div class="title--section_name d-flex align-items-center justify-content-between">
  5. <i class="ico--ui title_section utenti me-2"></i>
  6. <h2 class="primary">@if(!$add && !$update)Email Templates @else Inserimento/modifica template Email @endif</h2>
  7. </div>
  8. @if(!$add && !$update)
  9. <div class="title--section_addButton" wire:click="add()" style="cursor: pointer;">
  10. <div class="btn--ui entrata d-flex justify-items-between">
  11. <a href="#" wire:click="add()" style="color:white">Aggiungi</a>
  12. </div>
  13. </div>
  14. @endif
  15. </header>
  16. <a class="btn--ui lightGrey" href="/settings?type=comunicazioni"><i class="fa-solid fa-arrow-left"></i></a><br>
  17. <section id="resume-table">
  18. <div class="compare--chart_wrapper d-none"></div>
  19. <table class="table tablesaw tableHead tablesaw-stack" id="tablesaw-350" width="100%">
  20. <thead>
  21. <tr>
  22. <th scope="col">Oggetto</th>
  23. <th scope="col">Messaggio</th>
  24. <th scope="col">Parole</th>
  25. <th scope="col">Data Creazione</th>
  26. <th scope="col">...</th>
  27. </tr>
  28. </thead>
  29. <tbody id="checkall-target">
  30. @foreach($records as $record)
  31. <tr>
  32. <td>
  33. <strong>{{$record->name}}</strong>
  34. </td>
  35. <td>
  36. {{ Str::limit(strip_tags($record->content), 80) }}
  37. </td>
  38. <td>
  39. @php
  40. $wordCount = str_word_count(strip_tags($record->content));
  41. $badgeClass = $wordCount > 500 ? 'bg-warning' : 'bg-info';
  42. @endphp
  43. <span class="badge {{ $badgeClass }}">{{ $wordCount }} parole</span>
  44. </td>
  45. <td>{{ $record->created_at->format('d/m/Y H:i') }}</td>
  46. <td>
  47. <button type="button" class="btn" wire:click="sendTemplate({{ $record->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Invia Email"><i class="fa-solid fa-envelope"></i></button>
  48. <button type="button" class="btn" wire:click="edit({{ $record->id }})" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-placement="bottom" data-bs-content="Modifica"><i class="fa-regular fa-pen-to-square"></i></button>
  49. </td>
  50. </tr>
  51. @endforeach
  52. </tbody>
  53. </table>
  54. </section>
  55. @else
  56. <a class="btn--ui lightGrey" href="/email_comunications"><i class="fa-solid fa-arrow-left"></i></a><br>
  57. <div class="container">
  58. @if (session()->has('error'))
  59. <div class="alert alert-danger" role="alert">
  60. {{ session()->get('error') }}
  61. </div>
  62. @endif
  63. <div class="row">
  64. <div class="col">
  65. <form action="">
  66. @if ($add)
  67. {{-- <div class="row mb-4">
  68. <div class="col">
  69. <label class="form-label">Destinatari</label>
  70. <div class="mb-2">
  71. <button type="button" class="btn btn-outline-primary btn-sm" onclick="selectAllUsers()">
  72. <i class="fas fa-users me-1"></i>Seleziona Tutti
  73. </button>
  74. <button type="button" class="btn btn-outline-secondary btn-sm ms-2" onclick="deselectAllUsers()">
  75. <i class="fas fa-times me-1"></i>Deseleziona Tutti
  76. </button>
  77. </div>
  78. <div style="max-height: 200px; overflow-y: auto; border: 1px solid #dee2e6; border-radius: 0.375rem; padding: 10px;">
  79. @foreach($users as $user)
  80. <div class="form-check mb-1">
  81. <input class="form-check-input" type="checkbox" value="{{ $user->id }}" wire:model="selectedRecipients" id="recipient_{{ $user->id }}">
  82. <label class="form-check-label" for="recipient_{{ $user->id }}">
  83. <strong>{{ $user->name }}</strong>
  84. @if($user->email)
  85. <small class="text-muted">({{ $user->email }})</small>
  86. @else
  87. <small class="text-danger">(no email)</small>
  88. @endif
  89. </label>
  90. </div>
  91. @endforeach
  92. </div>
  93. <div class="form-text">
  94. <small class="text-muted">Selezionati: <span id="selectedCount">{{ count($selectedRecipients) }}</span> utenti</small>
  95. </div>
  96. @error('selectedRecipients')
  97. <div class="text-danger">{{ $message }}</div>
  98. @enderror
  99. </div>
  100. </div> --}}
  101. <div class="row mb-4">
  102. <div class="col-xs-12">
  103. <div class="showFilter" style="display: none">
  104. <hr size="1">
  105. <div class="row g-3">
  106. <div class="col-md-3">
  107. <div class="row">
  108. <div class="col-md-12" style="margin-bottom:10px;">
  109. <b>Età</b>
  110. </div>
  111. <div class="col-12">
  112. <div class="row mb-2">
  113. <div class="col-3"><label class="form-check-label ms-2" >Da</label></div>
  114. <div class="col-9"><input class="form-control " type="number" name="txtFromYear"></div>
  115. </div>
  116. </div>
  117. <div class="col-12">
  118. <div class="row">
  119. <div class="col-3"><label class="form-check-label ms-2" >A</label></div>
  120. <div class="col-9"><input class="form-control " type="number" name="txtToYear"></div>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. <div class="col-md-3">
  126. <div class="row">
  127. <div class="col-md-12" style="margin-bottom:10px;">
  128. <b>Tipologia di tesseramento</b>
  129. </div>
  130. <div class="col-12">
  131. <select name="filterCards" class="form-select filterCards">
  132. <option value="">Tutte
  133. @foreach(getCards() as $card)
  134. <option value="{{$card->id}}">{{$card->name}}
  135. @endforeach
  136. </select>
  137. </div>
  138. </div>
  139. </div>
  140. <div class="col-md-3">
  141. <div class="row">
  142. <div class="col-md-12" style="margin-bottom:10px;">
  143. <b>Stato tesseramento</b>
  144. </div>
  145. <div class="col-12">
  146. <select name="filterStatus" class="form-select filterStatus" multiple="multiple">
  147. <option value="2">Attivo
  148. <option value="1">Sospeso
  149. <option value="0">Non tesserato
  150. </select>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="col-md-3">
  155. <div class="row">
  156. <div class="col-md-12" style="margin-bottom:10px;">
  157. <b>Gruppo di appartenenza</b>
  158. </div>
  159. <div class="col-12">
  160. <select name="filterCategories" class="form-select filterCategories" multiple="multiple">
  161. <option value="">Tutte</option>
  162. @foreach($categories as $category)
  163. <option value="{{$category["id"]}}">
  164. {!! str_repeat('&bull; ', $category["indentation"] ?? 0) !!}{{$category["name"]}}
  165. </option>
  166. @endforeach
  167. </select>
  168. </div>
  169. </div>
  170. </div>
  171. <div class="col-md-3">
  172. <div class="row">
  173. <div class="col-md-12" style="margin-bottom:10px;">
  174. <b>Anno di nascita</b>
  175. </div>
  176. <div class="col-12">
  177. <div class="row mb-2">
  178. <div class="col-3"><label class="form-check-label ms-2" >Da</label></div>
  179. <div class="col-9"><input class="form-control " type="number" name="txtFromYearYear"></div>
  180. </div>
  181. </div>
  182. <div class="col-12">
  183. <div class="row">
  184. <div class="col-3"><label class="form-check-label ms-2" >A</label></div>
  185. <div class="col-9"><input class="form-control " type="number" name="txtToYearYear"></div>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. <div class="col-md-3">
  191. <div class="row">
  192. <div class="col-md-12" style="margin-bottom:10px;">
  193. <b>Scadenza certificato medico</b>
  194. </div>
  195. <div class="col-12">
  196. <select name="filterScadenza" class="form-select filterScadenza" multiple="multiple">
  197. <option value="1">Scaduti
  198. <option value="2">In scadenza
  199. <option value="3">Non consegnato
  200. <option value="4">Validi
  201. </select>
  202. </div>
  203. </div>
  204. </div>
  205. <div class="col-md-3">
  206. <div class="row">
  207. <div class="col-md-12" style="margin-bottom:10px;">
  208. <b>Tipologia certificato medico</b>
  209. </div>
  210. <div class="col-12">
  211. <select name="filterCertificateType" class="form-select filterCertificateType" multiple="multiple">
  212. <option value="">Tutti
  213. <option value="N">Non agonistico
  214. <option value="A">Agonistico
  215. </select>
  216. </div>
  217. </div>
  218. </div>
  219. </div>
  220. <div class="row g-3">
  221. <div class="col-md-12" style="text-align:right">
  222. <button class="btn--ui lightGrey" onclick="resetFilters(event)">Reset</button>
  223. <button class="btn--ui" onclick="loadDataTable(event)">FILTRA</button>
  224. </div>
  225. </div>
  226. <hr size="1">
  227. </div>
  228. </div>
  229. <div class="col-xs-12">
  230. <table id="recipients-table" class="table tablesaw tableHead tablesaw-stack">
  231. <thead>
  232. <tr>
  233. <th>Cognome</th>
  234. <th>Nome</th>
  235. {{-- <th>Email</th> --}}
  236. <th>Telefono</th>
  237. <th>Età</th>
  238. <th>Anno</th>
  239. <th>Stato</th>
  240. <th>Certificato</th>
  241. {{-- <th>Gruppi di interesse</th>
  242. <th>Corsi</th>
  243. <th>Certificato</th>
  244. <th>Tesseramento</th>
  245. <th>Rresidenza</th> --}}
  246. </tr>
  247. </thead>
  248. <tbody></tbody>
  249. </table>
  250. </div>
  251. </div>
  252. @endif
  253. <div class="row mb-4">
  254. <div class="col">
  255. <div class="form--item">
  256. <label for="subject" class="form-label">Oggetto</label>
  257. <input type="text" class="form-control @error('subject') is-invalid @enderror" id="subject" wire:model="subject" placeholder="Inserisci l'oggetto del template">
  258. @error('subject')
  259. <div class="invalid-feedback">{{ $message }}</div>
  260. @enderror
  261. </div>
  262. </div>
  263. </div>
  264. <div class="row mb-4">
  265. <div class="col">
  266. <div wire:ignore class="form--item">
  267. <label for="message" class="form-label">Messaggio</label>
  268. {{-- @if(false)
  269. <textarea class="form-control @error('message') is-invalid @enderror" id="message" wire:model="message" rows="10" placeholder="Inserisci il contenuto del messaggio (supporta HTML)"></textarea>
  270. <div class="form-text">
  271. <small class="text-muted">Puoi utilizzare HTML per formattare il messaggio. Parole: <span class="fw-bold">{{ str_word_count(strip_tags($message)) }}</span></small>
  272. </div>
  273. @endif --}}
  274. {{-- <div class="editor-container editor-container_classic-editor editor-container_include-style editor-container_include-block-toolbar" id="editor-container">
  275. <div class="editor-container__editor">
  276. <div id="editor"></div>
  277. </div>
  278. </div> --}}
  279. <textarea wire:model="message" class="form-control required" name="message" id="message"></textarea>
  280. @error('message')
  281. <div class="invalid-feedback">{{ $message }}</div>
  282. @enderror
  283. </div>
  284. </div>
  285. </div>
  286. @if($add)
  287. <div class="row mb-4">
  288. <div class="col">
  289. <label class="form-label">Opzioni di Invio</label>
  290. <div class="d-flex gap-2 comunication-send-options">
  291. <label class="form-check" for="sendNow">
  292. <input class="form-check-input" type="radio" name="sendOption" id="sendNow" wire:model="sendNow" value="1">
  293. <i class="fas fa-envelope me-2"></i>
  294. <span>Invia Immediatamente</span>
  295. </label>
  296. <label class="form-check" for="scheduleFor">
  297. <input class="form-check-input" type="radio" name="sendOption" id="scheduleFor" wire:model="sendNow" value="0">
  298. <i class="fas fa-clock me-2"></i>
  299. <span>Programma per dopo</span>
  300. </label>
  301. </div>
  302. </div>
  303. </div>
  304. @if(!$sendNow)
  305. <div class="row mb-4">
  306. <div class="col-md-6">
  307. <label for="scheduledDateTime" class="form-label">Data e Ora di Invio</label>
  308. <input type="datetime-local" class="form-control @error('scheduledDateTime') is-invalid @enderror" id="scheduledDateTime" wire:model="scheduledDateTime">
  309. @error('scheduledDateTime')
  310. <div class="invalid-feedback">{{ $message }}</div>
  311. @enderror
  312. </div>
  313. </div>
  314. @endif
  315. @endif
  316. <div class="form--item mt-5">
  317. <button type="button" class="btn--ui lightGrey" wire:click="cancel()">Annulla</button>
  318. @if($add)
  319. <button type="submit" class="btn--ui" wire:click.prevent="store()">
  320. @if($sendNow)
  321. Salva e Invia
  322. @else
  323. Salva e Programma
  324. @endif
  325. </button>
  326. @endif
  327. @if($update)
  328. <button type="submit" class="btn--ui" wire:click.prevent="update()">Salva</button>
  329. @endif
  330. </div>
  331. </form>
  332. </div>
  333. </div>
  334. </div>
  335. @endif
  336. </div>
  337. @if (session()->has('success'))
  338. <div class="alert alert-success alert-dismissible fade show mt-3" role="alert">
  339. {{ session()->get('success') }}
  340. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  341. </div>
  342. @endif
  343. @if (session()->has('error'))
  344. <div class="alert alert-danger alert-dismissible fade show mt-3" role="alert">
  345. {{ session()->get('error') }}
  346. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  347. </div>
  348. @endif
  349. @push('scripts')
  350. <link href="/css/datatables.css" rel="stylesheet" />
  351. <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
  352. <script src="/assets/js/datatables.js"></script>
  353. <script src="https://cdn.datatables.net/buttons/3.0.2/js/buttons.dataTables.js"></script>
  354. <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
  355. <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
  356. <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
  357. <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
  358. <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
  359. @endpush
  360. @push('scripts')
  361. <script type="text/javascript">
  362. $(document).ready(function() {
  363. loadDataTable();
  364. loadArchiveDataTable();
  365. });
  366. Livewire.on('load-data-table', () => {
  367. loadDataTable();
  368. loadArchiveDataTable();
  369. });
  370. function loadArchiveDataTable(){
  371. if ($.fn.DataTable.isDataTable('#tablesaw-350')) {
  372. $('#tablesaw-350').DataTable().destroy();
  373. }
  374. $('#tablesaw-350').DataTable({
  375. thead: {
  376. 'th': {'background-color': 'blue'}
  377. },
  378. layout: {
  379. topStart : null,
  380. topEnd : null,
  381. top1A: {
  382. buttons: [
  383. {
  384. extend: 'collection',
  385. text: 'ESPORTA',
  386. buttons: [
  387. {
  388. extend: 'excelHtml5',
  389. title: 'Templates Email',
  390. exportOptions: {
  391. columns: ":not(':last')"
  392. }
  393. },
  394. {
  395. extend: 'pdfHtml5',
  396. title: 'Templates Email',
  397. exportOptions: {
  398. columns: ":not(':last')"
  399. }
  400. },
  401. {
  402. extend: 'print',
  403. text: 'Stampa',
  404. title: 'Templates Email',
  405. exportOptions: {
  406. columns: ":not(':last')"
  407. }
  408. }
  409. ],
  410. dropup: true
  411. }
  412. ]
  413. },
  414. top1B : {
  415. pageLength: {
  416. menu: [[10, 25, 50, 100, 100000], [10, 25, 50, 100, "Tutti"]]
  417. }
  418. },
  419. top1C :'search',
  420. },
  421. pagingType: 'numbers',
  422. "language": {
  423. "url": "/assets/js/Italian.json"
  424. },
  425. "fnInitComplete": function (oSettings, json) {
  426. var html = '&nbsp;<a href="#" class="addData btn--ui"><i class="fa-solid fa-plus"></i></a>';
  427. $(".dt-search").append(html);
  428. }
  429. });
  430. $('#tablesaw-350 thead tr th').addClass('col');
  431. $('#tablesaw-350 thead tr th').css("background-color", "#f6f8fa");
  432. $(document).ready(function() {
  433. $(document).on("click",".addData",function() {
  434. $(".title--section_addButton").trigger("click")
  435. });
  436. });
  437. }
  438. $(document).ready(function() {
  439. $(document).on("click",".showHideFilter",function() {
  440. $(".showFilter").toggle();
  441. $('.filterCards').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
  442. $('.filterStatus').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
  443. $('.filterScadenza').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
  444. $('.filterCertificateType').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
  445. $('.filterCategories').select2({"language": {"noResults": function(){return "Nessun risultato";}}});
  446. });
  447. });
  448. function resetFilters(event)
  449. {
  450. if (event) event.preventDefault();
  451. $('.filterCards').val('').trigger('change');
  452. $('.filterStatus').val('').trigger('change');
  453. $('.filterScadenza').val('-1').trigger('change');
  454. $('.filterCertificateType').val('-1').trigger('change');
  455. $('.filterCategories').val('-1').trigger('change');
  456. $('input[name="txtFromYear"]').val('');
  457. $('input[name="txtToYear"]').val('');
  458. $('input[name="txtFromYearYear"]').val('');
  459. $('input[name="txtToYearYear"]').val('');
  460. loadDataTable();
  461. }
  462. function loadDataTable(event = null) {
  463. if (event) event.preventDefault();
  464. if ($.fn.DataTable.isDataTable('#recipients-table')) {
  465. $('#recipients-table').DataTable().destroy();
  466. }
  467. var fromYear = $('input[name="txtFromYear"]').val();
  468. localStorage.setItem("fromYearMember", fromYear);
  469. var toYear = $('input[name="txtToYear"]').val();
  470. localStorage.setItem("toYearMember", toYear);
  471. var fromYearYear = $('input[name="txtFromYearYear"]').val();
  472. localStorage.setItem("fromYearYearMember", fromYearYear);
  473. var toYearYear = $('input[name="txtToYearYear"]').val();
  474. localStorage.setItem("toYearYearMember", toYearYear);
  475. var filterCards = $('.filterCards').val();
  476. localStorage.setItem("filterCardsMember", filterCards);
  477. var filterStatus = $('.filterStatus').val();
  478. localStorage.setItem("filterStatusMember", filterStatus);
  479. var filterScadenza = $('.filterScadenza').val();
  480. localStorage.setItem("filterScadenzaMember", filterScadenza);
  481. var filterCertificateType = $('.filterCertificateType').val();
  482. localStorage.setItem("filterCertificateTypeMember", filterCertificateType);
  483. var filterCategories = $('.filterCategories').val();
  484. localStorage.setItem("filterCategoriesMember", filterCategories)
  485. const pageLength = 10;
  486. const dataTable = $('#recipients-table').DataTable({
  487. serverSide: true,
  488. ajax: '/get_members?cards=' + filterCards + "&filterCategories=" + filterCategories + "&filterCertificateType=" + filterCertificateType + "&filterScadenza=" + filterScadenza + "&filterStatus=" + filterStatus + "&fromYear=" + fromYear + "&toYear=" + toYear + "&fromYearYear=" + fromYearYear + "&toYearYear=" + toYearYear,
  489. columns: [
  490. {
  491. data: "last_name",
  492. render: function (data){
  493. const d = data.split("|");
  494. var ret = '<a style="cursor:pointer" onclick="showData(' + d[1] + ')">' + d[0] + '</a>';
  495. return ret;
  496. }
  497. },
  498. {
  499. data: "first_name",
  500. render: function (data){
  501. const d = data.split("|");
  502. var ret = '<a style="cursor:pointer" onclick="showData(' + d[1] + ')">' + d[0] + '</a>';
  503. return ret;
  504. }
  505. },
  506. { data: "phone"},
  507. { data: "age", "type": "num", className:"dt-type-numeric"},
  508. { data: "year", className:"dt-type-numeric"},
  509. {
  510. data: "status",
  511. render: function (data){
  512. const d = data.split("|");
  513. var ret = '<span class="tablesaw-cell-content"><span class="badge tessera-badge ' + d[0] + '">' + d[1] + '</span></span>';
  514. return ret;
  515. }
  516. },
  517. {
  518. data: "certificate",
  519. render: function (data){
  520. var ret = '';
  521. if (data != "") {
  522. const d = data.split("|");
  523. ret += '<span class="tablesaw-cell-content d-flex align-items-center">';
  524. if (d[0] == "0") {
  525. ret += '<i class="ico--ui check suspended me-2"></i>';
  526. ret += 'Scaduto : ';
  527. }
  528. if (d[0] == "1") {
  529. ret += '<i class="ico--ui check due me-2"></i>';
  530. ret += 'In scadenza : ';
  531. }
  532. if (d[0] == "2") {
  533. ret += '<i class="ico--ui check active me-2"></i>';
  534. ret += 'Scadenza : ';
  535. }
  536. ret += d[1];
  537. ret += '</span>';
  538. }
  539. if(data == ""){
  540. ret += '<span class="tablesaw-cell-content d-flex align-items-center">';
  541. ret += '<i class="ico--ui check absent me-2"></i>';
  542. ret += 'Non consegnato';
  543. ret += '</span>';
  544. }
  545. return ret;
  546. }
  547. },
  548. ],
  549. fixedHeader: false,
  550. thead: {
  551. 'th': {'background-color': 'blue'}
  552. },
  553. layout: {
  554. topStart : null,
  555. topEnd : null,
  556. top1A: null,
  557. top1B : {
  558. pageLength: {
  559. menu: [[10, 25, 50, 100, 100000], [10, 25, 50, 100, "Tutti"]]
  560. }
  561. },
  562. top1C :'search',
  563. },
  564. pagingType: 'numbers',
  565. "language": {
  566. "url": "/assets/js/Italian.json"
  567. },
  568. "fnInitComplete": function (oSettings, json) {
  569. var html = '&nbsp;<a style="cursor:pointer" class="showHideFilter btn--ui"><i class="fa-solid fa-sliders"></i></a>';
  570. $(".dt-search").append(html);
  571. }
  572. });
  573. $('#recipients-table thead tr th').addClass('col');
  574. $('#recipients-table thead tr th').css("background-color", "#f6f8fa");
  575. $('#recipients-table').on('draw.dt', function() {
  576. $('[data-bs-toggle="popover"]').popover()
  577. });
  578. }
  579. </script>
  580. {{-- CKEditor --}}
  581. <link rel="stylesheet" href="/assets/libraries/ckeditor5/ckeditor5.css" />
  582. <script type="importmap">
  583. {
  584. "imports": {
  585. "ckeditor5": "/assets/libraries/ckeditor5/ckeditor5.js",
  586. "ckeditor5/": "/assets/libraries/ckeditor5/"
  587. }
  588. }
  589. </script>
  590. <script type="module">
  591. import { ClassicEditor } from "ckeditor5";
  592. import { editorConfig } from "/assets/libraries/ckeditor5/config.js";
  593. Livewire.on("load-editor", () => {
  594. let messageField = document.querySelector('#message');
  595. if (messageField) {
  596. if (messageField.ckeditorInstance) messageField.ckeditorInstance.destroy();
  597. editorConfig.simpleUpload = {
  598. uploadUrl: "{{route('ckeditor.upload', ['_token' => csrf_token()])}}"
  599. }
  600. console.log(editorConfig);
  601. ClassicEditor
  602. .create(messageField, editorConfig)
  603. .then(editor => {
  604. editor.model.document.on('change:data', () => {
  605. @this.set('message', editor.getData());
  606. })
  607. })
  608. .catch(error => {
  609. console.error(error);
  610. });
  611. }
  612. });
  613. </script>
  614. {{-- END CKEditor --}}
  615. @endpush