var/cache/dev/twig/e6/e6106f64e3ae728b0989130853d199c1.php line 51

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. /* admin/student/learners.html.twig */
  15. class __TwigTemplate_8d3cd4902ac0441df347031e81d3c7b5 extends Template
  16. {
  17.     private $source;
  18.     private $macros = [];
  19.     public function __construct(Environment $env)
  20.     {
  21.         parent::__construct($env);
  22.         $this->source $this->getSourceContext();
  23.         $this->blocks = [
  24.             'title' => [$this'block_title'],
  25.             'content' => [$this'block_content'],
  26.             'addJs' => [$this'block_addJs'],
  27.         ];
  28.     }
  29.     protected function doGetParent(array $context)
  30.     {
  31.         // line 1
  32.         return "admin/base.html.twig";
  33.     }
  34.     protected function doDisplay(array $context, array $blocks = [])
  35.     {
  36.         $macros $this->macros;
  37.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  38.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""admin/student/learners.html.twig"));
  39.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  40.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""admin/student/learners.html.twig"));
  41.         $this->parent $this->loadTemplate("admin/base.html.twig""admin/student/learners.html.twig"1);
  42.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  43.         
  44.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  45.         
  46.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  47.     }
  48.     // line 3
  49.     public function block_title($context, array $blocks = [])
  50.     {
  51.         $macros $this->macros;
  52.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  53.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  54.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  55.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  56.         yield "Учищиеся";
  57.         
  58.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  59.         
  60.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  61.         return; yield '';
  62.     }
  63.     // line 6
  64.     public function block_content($context, array $blocks = [])
  65.     {
  66.         $macros $this->macros;
  67.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  68.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""content"));
  69.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  70.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""content"));
  71.         // line 7
  72.         yield "    <!-- Page Heading -->
  73.     <h1 class=\"h3 mb-2 text-gray-800\">Просмотр учащихся</h1>
  74.     ";
  75.         // line 12
  76.         yield "
  77.     <!-- DataTales Example -->
  78.     <div class=\"card shadow mb-4 mt-4\">
  79.         <div class=\"card-header py-3\">
  80.             <h6 class=\"m-0 font-weight-bold text-primary\">Учащиеся</h6>
  81.         </div>
  82.         <div class=\"card-body\">
  83.             ";
  84.         // line 19
  85.         if (($this->extensions['App\Twig\AppExtension']->getUser() && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$this->extensions['App\Twig\AppExtension']->getUser(), "getSettings", [], "method"falsefalsefalse19), "isCanEditStudents", [], "method"falsefalsefalse19))) {
  86.             // line 20
  87.             yield "                ";
  88.             yield from             $this->loadTemplate("components/add_item_button.html.twig""admin/student/learners.html.twig"20)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["url" => $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("moderator_learner_edit"), "title" => "Новый учащийся"]]));
  89.             // line 24
  90.             yield "            ";
  91.         }
  92.         // line 25
  93.         yield "
  94.             <div id=\"students-table-filters\" class=\"mb-4 d-flex align-items-center\" style=\"gap: 20px; flex-wrap: wrap;\">
  95.                 ";
  96.         // line 27
  97.         yield from         $this->loadTemplate("components/table_filter.html.twig""admin/student/learners.html.twig"27)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["labelText" => "Уровень""dropdownIdPrefix" => "level""allItemsButtonText" => "Все уровни"]]));
  98.         // line 32
  99.         yield "
  100.                 ";
  101.         // line 33
  102.         yield from         $this->loadTemplate("components/table_filter.html.twig""admin/student/learners.html.twig"33)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["labelText" => "Статус""dropdownIdPrefix" => "status""allItemsButtonText" => "Все статусы"]]));
  103.         // line 38
  104.         yield "
  105.                 ";
  106.         // line 39
  107.         yield from         $this->loadTemplate("components/table_filter.html.twig""admin/student/learners.html.twig"39)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["labelText" => "Контакт Telegram найден""dropdownIdPrefix" => "telegramUserIdSet""allItemsButtonText" => "Не выбрано"]]));
  108.         // line 44
  109.         yield "
  110.                 ";
  111.         // line 46
  112.         yield "                ";
  113.         yield from         $this->loadTemplate("components/table_filter.html.twig""admin/student/learners.html.twig"46)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["labelText" => "Область""dropdownIdPrefix" => "cityRegion""allItemsButtonText" => "Все области"]]));
  114.         // line 51
  115.         yield "
  116.                 ";
  117.         // line 52
  118.         if (($this->extensions['App\Twig\AppExtension']->getUser() && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$this->extensions['App\Twig\AppExtension']->getUser(), "settings", [], "any"falsefalsefalse52), "canUseTestFeatures", [], "any"falsefalsefalse52))) {
  119.             // line 64
  120.             yield "                                    ";
  121.             // line 65
  122.             yield "                                        ";
  123.             $context['_parent'] = $context;
  124.             $context['_seq'] = CoreExtension::ensureTraversable((isset($context["calendarEvents"]) || array_key_exists("calendarEvents"$context) ? $context["calendarEvents"] : (function () { throw new RuntimeError('Variable "calendarEvents" does not exist.'65$this->source); })()));
  125.             $context['loop'] = [
  126.               'parent' => $context['_parent'],
  127.               'index0' => 0,
  128.               'index'  => 1,
  129.               'first'  => true,
  130.             ];
  131.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  132.                 $length count($context['_seq']);
  133.                 $context['loop']['revindex0'] = $length 1;
  134.                 $context['loop']['revindex'] = $length;
  135.                 $context['loop']['length'] = $length;
  136.                 $context['loop']['last'] = === $length;
  137.             }
  138.             foreach ($context['_seq'] as $context["ceId"] => $context["ce"]) {
  139.                 // line 66
  140.                 yield "                                            ";
  141.                 yield from                 $this->loadTemplate("components/table_filter.html.twig""admin/student/learners.html.twig"66)->unwrap()->yield(CoreExtension::merge($context, ["options" => ["labelText" => ("Зарегистрирован: " CoreExtension::getAttribute($this->env$this->source,                 // line 67
  142. $context["ce"], "getText", [], "method"falsefalsefalse67)), "dropdownIdPrefix" => ("calendarEvent_" .                 // line 68
  143. $context["ceId"]), "allItemsButtonText" => "Не выбрано""multipleSelect" => false"itemsHtml" => "<a class=\"dropdown-item\" href=\"#\" data-filter=\"Да\">Да</a><a class=\"dropdown-item\" href=\"#\" data-filter=\"Нет\">Нет</a>"]]));
  144.                 // line 74
  145.                 yield "                                        ";
  146.                 ++$context['loop']['index0'];
  147.                 ++$context['loop']['index'];
  148.                 $context['loop']['first'] = false;
  149.                 if (isset($context['loop']['length'])) {
  150.                     --$context['loop']['revindex0'];
  151.                     --$context['loop']['revindex'];
  152.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  153.                 }
  154.             }
  155.             $_parent $context['_parent'];
  156.             unset($context['_seq'], $context['_iterated'], $context['ceId'], $context['ce'], $context['_parent'], $context['loop']);
  157.             $context array_intersect_key($context$_parent) + $_parent;
  158.             // line 77
  159.             yield "                        ";
  160.         }
  161.         // line 79
  162.         yield "            </div>
  163.             <div class=\"border p-3 rounded\">
  164.                 <h4>Общая статистика:</h4>
  165.                 <div class=\"d-flex\">
  166.                     <div class=\"p-2\">
  167.                         ";
  168.         // line 85
  169.         $context['_parent'] = $context;
  170.         $context['_seq'] = CoreExtension::ensureTraversable((isset($context["itemsByStatusCount"]) || array_key_exists("itemsByStatusCount"$context) ? $context["itemsByStatusCount"] : (function () { throw new RuntimeError('Variable "itemsByStatusCount" does not exist.'85$this->source); })()));
  171.         foreach ($context['_seq'] as $context["status"] => $context["itemsByStatusCountItem"]) {
  172.             // line 86
  173.             yield "                            <div>
  174.                                 <label>
  175.                                     <input type=\"checkbox\" data-calc-item-name=\"";
  176.             // line 88
  177.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["status"], "html"nulltrue);
  178.             yield "\" data-calc-item-value=\"";
  179.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStatusCountItem"], "count", [], "any"falsefalsefalse88), "html"nulltrue);
  180.             yield "\">
  181.                                     Всего со статусом <b>\"";
  182.             // line 89
  183.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStatusCountItem"], "statusText", [], "any"falsefalsefalse89), "html"nulltrue);
  184.             yield "\"</b>: ";
  185.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStatusCountItem"], "count", [], "any"falsefalsefalse89), "html"nulltrue);
  186.             yield "
  187.                                 </label>
  188.                             </div>
  189.                         ";
  190.         }
  191.         $_parent $context['_parent'];
  192.         unset($context['_seq'], $context['_iterated'], $context['status'], $context['itemsByStatusCountItem'], $context['_parent'], $context['loop']);
  193.         $context array_intersect_key($context$_parent) + $_parent;
  194.         // line 93
  195.         yield "                    </div>
  196.                     <div class=\"p-2\">
  197.                         ";
  198.         // line 96
  199.         $context['_parent'] = $context;
  200.         $context['_seq'] = CoreExtension::ensureTraversable((isset($context["itemsByStudentLevelCount"]) || array_key_exists("itemsByStudentLevelCount"$context) ? $context["itemsByStudentLevelCount"] : (function () { throw new RuntimeError('Variable "itemsByStudentLevelCount" does not exist.'96$this->source); })()));
  201.         foreach ($context['_seq'] as $context["level"] => $context["itemsByStudentLevelCountItem"]) {
  202.             // line 97
  203.             yield "                            <div>
  204.                                 <label>
  205.                                     <input type=\"checkbox\" data-calc-item-name=\"level_";
  206.             // line 99
  207.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["level"], "html"nulltrue);
  208.             yield "\" data-calc-item-value=\"";
  209.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStudentLevelCountItem"], "count", [], "any"falsefalsefalse99), "html"nulltrue);
  210.             yield "\">
  211.                                     Всего c уровнем <b>\"";
  212.             // line 100
  213.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStudentLevelCountItem"], "level", [], "any"falsefalsefalse100), "html"nulltrue);
  214.             yield "\"</b>: ";
  215.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["itemsByStudentLevelCountItem"], "count", [], "any"falsefalsefalse100), "html"nulltrue);
  216.             yield "
  217.                                 </label>
  218.                             </div>
  219.                         ";
  220.         }
  221.         $_parent $context['_parent'];
  222.         unset($context['_seq'], $context['_iterated'], $context['level'], $context['itemsByStudentLevelCountItem'], $context['_parent'], $context['loop']);
  223.         $context array_intersect_key($context$_parent) + $_parent;
  224.         // line 104
  225.         yield "                    </div>
  226.                 </div>
  227.                 <div class=\"p-2\">
  228.                     <div>Всего учеников: ";
  229.         // line 108
  230.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["allStudentsCount"]) || array_key_exists("allStudentsCount"$context) ? $context["allStudentsCount"] : (function () { throw new RuntimeError('Variable "allStudentsCount" does not exist.'108$this->source); })()), "html"nulltrue);
  231.         yield "</div>
  232.                     <div>Всего числящихся учеников: ";
  233.         // line 109
  234.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["itemsWithCanSendCampaignStatusCount"]) || array_key_exists("itemsWithCanSendCampaignStatusCount"$context) ? $context["itemsWithCanSendCampaignStatusCount"] : (function () { throw new RuntimeError('Variable "itemsWithCanSendCampaignStatusCount" does not exist.'109$this->source); })()), "html"nulltrue);
  235.         yield "</div>
  236.                     <div>Всего подписчиков: ";
  237.         // line 110
  238.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["itemsByStatusCount"]) || array_key_exists("itemsByStatusCount"$context) ? $context["itemsByStatusCount"] : (function () { throw new RuntimeError('Variable "itemsByStatusCount" does not exist.'110$this->source); })()), "subscriber_virtual_status", [], "array"falsefalsefalse110), "count", [], "array"falsefalsefalse110), "html"nulltrue);
  239.         yield "</div>
  240.                     <div>Всего выбывших: ";
  241.         // line 111
  242.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["allLeavedStudentsCount"]) || array_key_exists("allLeavedStudentsCount"$context) ? $context["allLeavedStudentsCount"] : (function () { throw new RuntimeError('Variable "allLeavedStudentsCount" does not exist.'111$this->source); })()), "html"nulltrue);
  243.         yield "</div>
  244.                     <br>
  245.                     <div>
  246.                         Калькулятор: <span class=\"calc-result\"><b>выберите значения</b></span>
  247.                     </div>
  248.                 </div>
  249.             </div>
  250.             <br>
  251. ";
  252.         // line 135
  253.         yield "
  254. ";
  255.         // line 143
  256.         yield "
  257. ";
  258.         // line 151
  259.         yield "
  260. ";
  261.         // line 154
  262.         yield "
  263. ";
  264.         // line 157
  265.         yield "
  266. ";
  267.         // line 167
  268.         yield "
  269.             <div class=\"mb-4 d-flex justify-content-end\">
  270.                 <button id=\"compare-table-btn\" class=\"btn btn-primary mb-3\">Поиск по списку ФИО</button>
  271.             </div>
  272.             <div class=\"table-responsive\">
  273.                 <table class=\"table table-bordered\" id=\"students-data-table\">
  274.                     <thead>
  275.                     <tr>
  276.                         <th data-table-type=\"num\">Номер п/п</th>
  277.                         <th>Имя</th>
  278.                         <th>Город</th>
  279.                         <th data-table-dropdown-id=\"cityRegionDropdown\"
  280.                             data-table-badge-id=\"cityRegionBadge\"
  281.                             data-table-dropdown-text-for-all=\"Все области\">Область</th>
  282.                         <th>Телефон</th>
  283.                         <th>E-mail</th>
  284.                         <th data-table-dropdown-id=\"levelDropdown\"
  285.                             data-table-badge-id=\"levelBadge\"
  286.                             data-table-dropdown-text-for-all=\"Все уровни\">Уровень</th>
  287.                         <th data-export-exclude-col>Статус</th>
  288.                         <th data-table-hide-col data-table-dropdown-id=\"statusDropdown\"
  289.                             data-table-badge-id=\"statusBadge\"
  290.                             data-table-dropdown-text-for-all=\"Все статусы\">Статус (текст)</th>
  291.                         <th data-export-exclude-col>Фото</th>
  292.                         <th data-table-type=\"date-d-m-Y-asc\">Дата последнего прохождния курса уровня</th>
  293.                         <th>Комментарий</th>
  294.                         ";
  295.         // line 196
  296.         yield "                        ";
  297.         $context['_parent'] = $context;
  298.         $context['_seq'] = CoreExtension::ensureTraversable((isset($context["calendarEvents"]) || array_key_exists("calendarEvents"$context) ? $context["calendarEvents"] : (function () { throw new RuntimeError('Variable "calendarEvents" does not exist.'196$this->source); })()));
  299.         foreach ($context['_seq'] as $context["ceId"] => $context["ce"]) {
  300.             // line 197
  301.             yield "                            <th data-table-hide-col
  302.                                 data-table-dropdown-id=\"calendarEvent_";
  303.             // line 198
  304.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["ceId"], "html"nulltrue);
  305.             yield "Dropdown\"
  306.                                 data-table-badge-id=\"calendarEvent_";
  307.             // line 199
  308.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["ceId"], "html"nulltrue);
  309.             yield "Badge\"
  310.                                 data-table-dropdown-text-for-all=\"Не выбрано\"
  311.                                 data-export-exclude-col>";
  312.             // line 201
  313.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["ce"], "getText", [], "method"falsefalsefalse201), "html"nulltrue);
  314.             yield "</th>
  315.                         ";
  316.         }
  317.         $_parent $context['_parent'];
  318.         unset($context['_seq'], $context['_iterated'], $context['ceId'], $context['ce'], $context['_parent'], $context['loop']);
  319.         $context array_intersect_key($context$_parent) + $_parent;
  320.         // line 203
  321.         yield "
  322.                         <th data-table-hide-col data-export-exclude-col>Идентификатор пользователя Telegram</th>
  323.                         <th data-table-hide-col data-export-exclude-col
  324.                             data-table-dropdown-id=\"telegramUserIdSetDropdown\"
  325.                             data-table-badge-id=\"telegramUserIdSetBadge\"
  326.                             data-table-dropdown-text-for-all=\"Не выбрано\"
  327.                         >Идентификатор пользователя Telegram установлен (да/нет)</th>
  328.                         <th>Сведения</th>
  329.                         <th data-export-exclude-col>Действия</th>
  330.                         <th data-table-type=\"num\" data-table-hide-col data-table-col-id=\"id\">#</th>
  331.                         <th data-table-hide-col>Дополнить комментарий учащегося</th>
  332.                     </tr>
  333.                     </thead>
  334.                     ";
  335.         // line 222
  336.         yield "                    <tbody>
  337.                     ";
  338.         // line 223
  339.         $context["studentIndex"] =  -1;
  340.         // line 224
  341.         yield "                    ";
  342.         $context['_parent'] = $context;
  343.         $context['_seq'] = CoreExtension::ensureTraversable((isset($context["items"]) || array_key_exists("items"$context) ? $context["items"] : (function () { throw new RuntimeError('Variable "items" does not exist.'224$this->source); })()));
  344.         foreach ($context['_seq'] as $context["_key"] => $context["item"]) {
  345.             // line 225
  346.             yield "                        ";
  347.             $context["studentIndex"] = ((isset($context["studentIndex"]) || array_key_exists("studentIndex"$context) ? $context["studentIndex"] : (function () { throw new RuntimeError('Variable "studentIndex" does not exist.'225$this->source); })()) + 1);
  348.             // line 226
  349.             yield "                        ";
  350.             $context["earnLevelCandidate"] = CoreExtension::getAttribute($this->env$this->source, (isset($context["earnLevelCandidates"]) || array_key_exists("earnLevelCandidates"$context) ? $context["earnLevelCandidates"] : (function () { throw new RuntimeError('Variable "earnLevelCandidates" does not exist.'226$this->source); })()), CoreExtension::getAttribute($this->env$this->source$context["item"], "id", [], "any"falsefalsefalse226), [], "array"falsefalsefalse226);
  351.             // line 227
  352.             yield "                        <tr>
  353.                             <td>";
  354.             // line 228
  355.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(((isset($context["studentIndex"]) || array_key_exists("studentIndex"$context) ? $context["studentIndex"] : (function () { throw new RuntimeError('Variable "studentIndex" does not exist.'228$this->source); })()) + 1), "html"nulltrue);
  356.             yield "</td>
  357.                             <td>";
  358.             // line 229
  359.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['App\Twig\AppExtension']->getFirstLastNameWithOld($context["item"], falsetrue), "html"nulltrue);
  360.             yield "</td>
  361.                             <td>";
  362.             // line 230
  363.             ((CoreExtension::getAttribute($this->env$this->source$context["item"], "city", [], "any"falsefalsefalse230)) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "city", [], "any"falsefalsefalse230), "name", [], "any"falsefalsefalse230), "html"nulltrue)) : (yield "город не указан"));
  364.             yield "</td>
  365.                             <td>";
  366.             // line 231
  367.             (((CoreExtension::getAttribute($this->env$this->source$context["item"], "city", [], "any"falsefalsefalse231) && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "city", [], "any"falsefalsefalse231), "region", [], "any"falsefalsefalse231))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "city", [], "any"falsefalsefalse231), "region", [], "any"falsefalsefalse231), "name", [], "any"falsefalsefalse231), "html"nulltrue)) : (yield "область не указана"));
  368.             yield "</td>
  369.                             <td>";
  370.             // line 232
  371.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "phone", [], "any"falsefalsefalse232), "html"nulltrue);
  372.             yield "</td>
  373.                             <td>";
  374.             // line 233
  375.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "email", [], "any"falsefalsefalse233), "html"nulltrue);
  376.             yield "</td>
  377.                             <td>";
  378.             // line 234
  379.             (((CoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse234) && (CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse234), "level", [], "any"falsefalsefalse234) >  -1))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse234), "level", [], "any"falsefalsefalse234), "html"nulltrue)) : (yield "нет уровня"));
  380.             yield "</td>
  381.                             <td>
  382.                                 <span href=\"#\" class=\"btn btn-";
  383.             // line 236
  384.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "virtualStudentStatusCssClass", [], "any"falsefalsefalse236), "html"nulltrue);
  385.             yield " btn-icon-split w-max cursor-default\">
  386.                                     <span class=\"icon text-white-50\">
  387.                                         <i class=\"fas fa-tag\"></i>
  388.                                     </span>
  389.                                     <span class=\"text\">";
  390.             // line 240
  391.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "virtualStudentStatusText", [], "any"falsefalsefalse240), "html"nulltrue);
  392.             yield "</span>
  393.                                 </span>
  394.                             </td>
  395.                             <td>";
  396.             // line 243
  397.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "virtualStudentStatusText", [], "any"falsefalsefalse243), "html"nulltrue);
  398.             yield "</td>
  399.                             <td>
  400. ";
  401.             // line 256
  402.             yield "                            </td>
  403.                             <td>
  404.                                 ";
  405.             // line 259
  406.             $context["outputEarnLevelCandidate"] = ((CoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse259) && (isset($context["earnLevelCandidate"]) || array_key_exists("earnLevelCandidate"$context) ? $context["earnLevelCandidate"] : (function () { throw new RuntimeError('Variable "earnLevelCandidate" does not exist.'259$this->source); })())) && (CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["earnLevelCandidate"]) || array_key_exists("earnLevelCandidate"$context) ? $context["earnLevelCandidate"] : (function () { throw new RuntimeError('Variable "earnLevelCandidate" does not exist.'259$this->source); })()), "calendarEvent", [], "any"falsefalsefalse259), "earnLevel", [], "any"falsefalsefalse259) == CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse259), "level", [], "any"falsefalsefalse259)));
  407.             // line 260
  408.             yield "                                ";
  409.             if ((isset($context["outputEarnLevelCandidate"]) || array_key_exists("outputEarnLevelCandidate"$context) ? $context["outputEarnLevelCandidate"] : (function () { throw new RuntimeError('Variable "outputEarnLevelCandidate" does not exist.'260$this->source); })())) {
  410.                 // line 261
  411.                 yield "                                    ";
  412.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["earnLevelCandidate"]) || array_key_exists("earnLevelCandidate"$context) ? $context["earnLevelCandidate"] : (function () { throw new RuntimeError('Variable "earnLevelCandidate" does not exist.'261$this->source); })()), "calendarEvent", [], "any"falsefalsefalse261), "startDate", [], "any"falsefalsefalse261), "d.m.Y"), "html"nulltrue);
  413.                 yield "
  414.                                 ";
  415.             } else {
  416.                 // line 263
  417.                 yield "                                    –
  418.                                 ";
  419.             }
  420.             // line 265
  421.             yield "                            </td>
  422.                             <td>";
  423.             // line 267
  424.             ((CoreExtension::getAttribute($this->env$this->source$context["item"], "comment", [], "any"falsefalsefalse267)) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "comment", [], "any"falsefalsefalse267), "html"nulltrue)) : (yield "–"));
  425.             yield "</td>
  426.                             ";
  427.             // line 270
  428.             yield "                            ";
  429.             $context['_parent'] = $context;
  430.             $context['_seq'] = CoreExtension::ensureTraversable((isset($context["calendarEvents"]) || array_key_exists("calendarEvents"$context) ? $context["calendarEvents"] : (function () { throw new RuntimeError('Variable "calendarEvents" does not exist.'270$this->source); })()));
  431.             foreach ($context['_seq'] as $context["ceId"] => $context["ce"]) {
  432.                 // line 271
  433.                 yield "                                ";
  434.                 $context["registered"] = (CoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse271) && (CoreExtension::getAttribute($this->env$this->source, ($context["candidatesByStudentAndCalendarEvent"] ?? null), CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse271), "id", [], "any"falsefalsefalse271), [], "array"truetruefalse271) && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, ($context["candidatesByStudentAndCalendarEvent"] ?? null), CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "student", [], "any"falsefalsefalse271), "id", [], "any"falsefalsefalse271), [], "array"falsetruefalse271), $context["ceId"], [], "array"truetruefalse271)));
  435.                 // line 272
  436.                 yield "                                <td>";
  437.                 yield (((isset($context["registered"]) || array_key_exists("registered"$context) ? $context["registered"] : (function () { throw new RuntimeError('Variable "registered" does not exist.'272$this->source); })())) ? ("Да") : ("Нет"));
  438.                 yield "</td>
  439.                             ";
  440.             }
  441.             $_parent $context['_parent'];
  442.             unset($context['_seq'], $context['_iterated'], $context['ceId'], $context['ce'], $context['_parent'], $context['loop']);
  443.             $context array_intersect_key($context$_parent) + $_parent;
  444.             // line 274
  445.             yield "
  446.                             <td>";
  447.             // line 275
  448.             ((CoreExtension::getAttribute($this->env$this->source$context["item"], "telegramUserId", [], "any"falsefalsefalse275)) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "telegramUserId", [], "any"falsefalsefalse275), "html"nulltrue)) : (yield "–"));
  449.             yield "</td>
  450.                             <td>
  451.                                 ";
  452.             // line 277
  453.             $context["statusAdditon"] = ((CoreExtension::getAttribute($this->env$this->source$context["item"], "canSendTelegramCampaigns", [], "any"falsefalsefalse277)) ? ("") : (" (Рассылка Telegram отключена!)"));
  454.             // line 278
  455.             yield "                                ";
  456.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(((CoreExtension::getAttribute($this->env$this->source$context["item"], "telegramUserId", [], "any"falsefalsefalse278)) ? (("Да" . (isset($context["statusAdditon"]) || array_key_exists("statusAdditon"$context) ? $context["statusAdditon"] : (function () { throw new RuntimeError('Variable "statusAdditon" does not exist.'278$this->source); })()))) : (("Нет" . (isset($context["statusAdditon"]) || array_key_exists("statusAdditon"$context) ? $context["statusAdditon"] : (function () { throw new RuntimeError('Variable "statusAdditon" does not exist.'278$this->source); })())))), "html"nulltrue);
  457.             yield "
  458.                             </td>
  459.                             <td>
  460.                                 <b>Дата рождения</b>: ";
  461.             // line 281
  462.             ((CoreExtension::getAttribute($this->env$this->source$context["item"], "birthday", [], "any"falsefalsefalse281)) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->source$context["item"], "birthday", [], "any"falsefalsefalse281), "d.m.Y"), "html"nulltrue)) : (yield "–"));
  463.             yield "
  464.                                 <br><br>
  465.                                 <b>Род деятельности</b>: ";
  466.             // line 283
  467.             ((CoreExtension::getAttribute($this->env$this->source$context["item"], "job", [], "any"falsefalsefalse283)) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["item"], "job", [], "any"falsefalsefalse283), "name", [], "any"falsefalsefalse283), "html"nulltrue)) : (yield "–"));
  468.             yield "
  469.                             </td>
  470.                             <td>
  471.                                 <a title=\"Редактировать\" href=\"";
  472.             // line 286
  473.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("moderator_learner_edit", ["id" => CoreExtension::getAttribute($this->env$this->source$context["item"], "id", [], "any"falsefalsefalse286)]), "html"nulltrue);
  474.             yield "\" class=\"btn btn-primary btn-circle\">
  475.                                     <i class=\"fas fa-edit\"></i>
  476.                                 </a>
  477.                                 ";
  478.             // line 290
  479.             if (($this->extensions['App\Twig\AppExtension']->getUser() && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$this->extensions['App\Twig\AppExtension']->getUser(), "getSettings", [], "method"falsefalsefalse290), "isCanEditStudents", [], "method"falsefalsefalse290))) {
  480.                 // line 291
  481.                 yield "                                    <a title=\"Удалить\" href=\"javascript:void(0);\" class=\"btn btn-danger btn-circle\"
  482.                                        onclick='(async ()=>{
  483.                                                let msg = \"Удалить учащегося ";
  484.                 // line 293
  485.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "name", [], "any"falsefalsefalse293), "js"), "html"nulltrue);
  486.                 yield "?\";
  487.                                            let answer = await showWindowModal(\"Подтверждение\", msg, \"Удалить\", \"Отмена\");
  488.                                            if (answer === MODAL_WINDOW_BUTTON.BUTTON_1) {
  489.                                                window.location = \"";
  490.                 // line 296
  491.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("moderator_student_delete", ["id" => CoreExtension::getAttribute($this->env$this->source$context["item"], "id", [], "any"falsefalsefalse296)]), "html"nulltrue);
  492.                 yield "\";
  493.                                                }
  494.                                                })()'>
  495.                                         <i class=\"fas fa-trash\"></i>
  496.                                     </a>
  497.                                 ";
  498.             }
  499.             // line 302
  500.             yield "                            </td>
  501.                             <td>";
  502.             // line 303
  503.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["item"], "id", [], "any"falsefalsefalse303), "html"nulltrue);
  504.             yield "</td>
  505.                             <td></td>
  506.                         </tr>
  507.                     ";
  508.         }
  509.         $_parent $context['_parent'];
  510.         unset($context['_seq'], $context['_iterated'], $context['_key'], $context['item'], $context['_parent'], $context['loop']);
  511.         $context array_intersect_key($context$_parent) + $_parent;
  512.         // line 307
  513.         yield "                    </tbody>
  514.                 </table>
  515.                 ";
  516.         // line 310
  517.         $context["galleryItems"] = (isset($context["items"]) || array_key_exists("items"$context) ? $context["items"] : (function () { throw new RuntimeError('Variable "items" does not exist.'310$this->source); })());
  518.         // line 311
  519.         yield "                ";
  520.         yield from         $this->loadTemplate("admin/student/learners.html.twig""admin/student/learners.html.twig"311"630547325")->unwrap()->yield(CoreExtension::merge($context, ["options" => ["modalId" => "studentsPhotoGalleryModal""modalTitle" => "Галерея учащихся""elementClickTriggerSelector" => "#students-data-table img.gallery-trigger"]]));
  521.         // line 337
  522.         yield "
  523.                 ";
  524.         // line 339
  525.         yield "                <div class=\"mt-4 d-flex\">
  526.                     <button id=\"download-csv-btn\" class=\"btn btn-primary\">Скачать таблицу</button>
  527.                 </div>
  528. ";
  529.         // line 343
  530.         yield "            </div>
  531.         </div>
  532.     </div>
  533. ";
  534.         
  535.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  536.         
  537.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  538.         return; yield '';
  539.     }
  540.     // line 348
  541.     public function block_addJs($context, array $blocks = [])
  542.     {
  543.         $macros $this->macros;
  544.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  545.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""addJs"));
  546.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  547.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""addJs"));
  548.         // line 349
  549.         yield "    <script>
  550.         let studentsDataTableOptions =  {
  551.             // \"scrollY\": \"500px\",
  552.             \"lengthMenu\": [[10, 20, 50, 100, 200, 300, 500, 700, -1], [10, 20, 50, 100, 200, 300, 500, 700, \"Все\"]],
  553.             drawRowNumbersForColIndex: 0,
  554.         };
  555.         let table = new CustomDataTable('#students-data-table', studentsDataTableOptions);
  556.         table.initDataTable();
  557.         // compare table button - collect filtered table data and run compare
  558.         \$('#compare-table-btn').click(async () => {
  559.             let result = await showTableCompareModal();
  560.             if (result !== null) {
  561.                 let compareList = result.compareList;
  562.                 let tableData = table.getAllFilteredTableData();
  563.                 let tableList = \"\";
  564.                 for (let i = 0; i < tableData.length; i++) {
  565.                     tableList += tableData[i][1] + \"\\n\";
  566.                 }
  567.                 let compareResult = await compareData(tableList, compareList);
  568.                 const modalContent = getCompareTableHtml(tableData, compareResult, \"students-data-table\",
  569.                     \"#students-table-filters\", studentsDataTableOptions);
  570.                 let answer = await showWindowModal('Результаты поиска в таблице по списку ФИО', modalContent, \"Ок\", \"Отмена\",
  571.                     \"max-width: 95%;\");
  572.             }
  573.         });
  574.         \$('#download-csv-btn').click(() => {
  575.             table.downloadCsv()
  576.         });
  577.         let galleries = [];
  578.         \$('.gallery-modal').each(function() {
  579.             let modalId = \$(this).attr('id');
  580.             let options = {};
  581.             if (\$(this).is(\"#studentsPhotoGalleryModal\")) {
  582.                 options = {
  583.                     ...options,
  584.                     slideIdAttrName: 'data-student-id',
  585.                     dataTableInstance: table,
  586.                 }
  587.             }
  588.             let gallery = new GalleryCarousel(modalId, options);
  589.             galleries.push(gallery);
  590.         });
  591.         function updateCalc() {
  592.             const \$span = \$('.calc-result');
  593.             const \$inputs = \$('input[data-calc-item-name]');
  594.             let total = 0;
  595.             let anyChecked = false;
  596.             \$inputs.each(function() {
  597.                 const \$el = \$(this);
  598.                 if (\$el.is(':checked')) {
  599.                     anyChecked = true;
  600.                     const raw = \$el.attr('data-calc-item-value');
  601.                     const n = Number(String(raw).replace(/[^0-9.-]+/g, ''));
  602.                     if (!isNaN(n)) total += n;
  603.                 }
  604.             });
  605.             if (!anyChecked) {
  606.                 \$span.html('<b>выберите значения</b>');
  607.             } else {
  608.                 \$span.html('<b>' + total + '</b>');
  609.             }
  610.         }
  611.         // Привязываем событие и инициализируем при загрузке
  612.         \$(document).ready(function() {
  613.             \$(document).on('change', 'input[data-calc-item-name]', updateCalc);
  614.             updateCalc();
  615.         });
  616.     </script>
  617. ";
  618.         
  619.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  620.         
  621.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  622.         return; yield '';
  623.     }
  624.     /**
  625.      * @codeCoverageIgnore
  626.      */
  627.     public function getTemplateName()
  628.     {
  629.         return "admin/student/learners.html.twig";
  630.     }
  631.     /**
  632.      * @codeCoverageIgnore
  633.      */
  634.     public function isTraitable()
  635.     {
  636.         return false;
  637.     }
  638.     /**
  639.      * @codeCoverageIgnore
  640.      */
  641.     public function getDebugInfo()
  642.     {
  643.         return array (  584 => 349,  574 => 348,  560 => 343,  555 => 339,  552 => 337,  549 => 311,  547 => 310,  542 => 307,  532 => 303,  529 => 302,  520 => 296,  514 => 293,  510 => 291,  508 => 290,  501 => 286,  495 => 283,  490 => 281,  483 => 278,  481 => 277,  476 => 275,  473 => 274,  464 => 272,  461 => 271,  456 => 270,  451 => 267,  447 => 265,  443 => 263,  437 => 261,  434 => 260,  432 => 259,  427 => 256,  422 => 243,  416 => 240,  409 => 236,  404 => 234,  400 => 233,  396 => 232,  392 => 231,  388 => 230,  384 => 229,  380 => 228,  377 => 227,  374 => 226,  371 => 225,  366 => 224,  364 => 223,  361 => 222,  346 => 203,  338 => 201,  333 => 199,  329 => 198,  326 => 197,  321 => 196,  291 => 167,  288 => 157,  285 => 154,  282 => 151,  279 => 143,  276 => 135,  264 => 111,  260 => 110,  256 => 109,  252 => 108,  246 => 104,  234 => 100,  228 => 99,  224 => 97,  220 => 96,  215 => 93,  203 => 89,  197 => 88,  193 => 86,  189 => 85,  181 => 79,  178 => 77,  164 => 74,  162 => 68,  161 => 67,  159 => 66,  141 => 65,  139 => 64,  137 => 52,  134 => 51,  131 => 46,  128 => 44,  126 => 39,  123 => 38,  121 => 33,  118 => 32,  116 => 27,  112 => 25,  109 => 24,  106 => 20,  104 => 19,  95 => 12,  91 => 7,  81 => 6,  61 => 3,  38 => 1,);
  644.     }
  645.     public function getSourceContext()
  646.     {
  647.         return new Source("{% extends 'admin/base.html.twig' %}
  648. {% block title %}Учищиеся{% endblock %}
  649. {% block content %}
  650.     <!-- Page Heading -->
  651.     <h1 class=\"h3 mb-2 text-gray-800\">Просмотр учащихся</h1>
  652.     {# <p class=\"mb-4\">DataTables is a third party plugin that is used to generate the demo table below.
  653.     For more information about DataTables, please visit the <a target=\"_blank\"
  654.         href=\"https://datatables.net\">official DataTables documentation</a>.</p> #}
  655.     <!-- DataTales Example -->
  656.     <div class=\"card shadow mb-4 mt-4\">
  657.         <div class=\"card-header py-3\">
  658.             <h6 class=\"m-0 font-weight-bold text-primary\">Учащиеся</h6>
  659.         </div>
  660.         <div class=\"card-body\">
  661.             {% if getUser() and getUser().getSettings().isCanEditStudents() %}
  662.                 {% include 'components/add_item_button.html.twig' with { options: {
  663.                     url: path('moderator_learner_edit'),
  664.                     title: 'Новый учащийся'
  665.                 } } %}
  666.             {% endif %}
  667.             <div id=\"students-table-filters\" class=\"mb-4 d-flex align-items-center\" style=\"gap: 20px; flex-wrap: wrap;\">
  668.                 {% include 'components/table_filter.html.twig' with { options: {
  669.                     labelText: 'Уровень',
  670.                     dropdownIdPrefix: 'level',
  671.                     allItemsButtonText: 'Все уровни',
  672.                 }} %}
  673.                 {% include 'components/table_filter.html.twig' with { options: {
  674.                     labelText: 'Статус',
  675.                     dropdownIdPrefix: 'status',
  676.                     allItemsButtonText: 'Все статусы',
  677.                 }} %}
  678.                 {% include 'components/table_filter.html.twig' with { options: {
  679.                     labelText: 'Контакт Telegram найден',
  680.                     dropdownIdPrefix: 'telegramUserIdSet',
  681.                     allItemsButtonText: 'Не выбрано',
  682.                 }} %}
  683.                 {# Добавлен фильтр по области (city.region) #}
  684.                 {% include 'components/table_filter.html.twig' with { options: {
  685.                     labelText: 'Область',
  686.                     dropdownIdPrefix: 'cityRegion',
  687.                     allItemsButtonText: 'Все области',
  688.                 }} %}
  689.                 {% if getUser() and getUser().settings.canUseTestFeatures %}
  690. {#                    <div>#}
  691. {#                        {% embed 'components/dropdown.html.twig' with { options: {#}
  692. {#                            labelAttrs: 'style=\"display: block\"',#}
  693. {#                            dropdownMenuAttrs: 'style=\"width: 500px; max-height: 600px; overflow-y: auto;\"',#}
  694. {#                            defaultItemText: \"Выбрать\",#}
  695. {#                            labelText: \"Зарегистрирован на мероприятие:\",#}
  696. {#                            buttonClass: 'btn-primary btn',#}
  697. {#                            preventDropdownClose: true,#}
  698. {#                        } } %}#}
  699. {#                            {% block beforeDropdownItems %}#}
  700. {#                                <li class=\"px-3 py-2\">#}
  701.                                     {# Перечисляем фильтры для каждого календарного события: статичные элементы Да/Нет #}
  702.                                         {% for ceId, ce in calendarEvents %}
  703.                                             {% include 'components/table_filter.html.twig' with { options: {
  704.                                                 labelText: 'Зарегистрирован: ' ~ ce.getText(),
  705.                                                 dropdownIdPrefix: 'calendarEvent_' ~ ceId,
  706.                                                 allItemsButtonText: 'Не выбрано',
  707.                                                 multipleSelect: false,
  708.                                                 itemsHtml: '<a class=\"dropdown-item\" href=\"#\" data-filter=\"Да\">Да</a><a class=\"dropdown-item\" href=\"#\" data-filter=\"Нет\">Нет</a>',
  709.                                             }} %}
  710. {#                                            <br>#}
  711.                                         {% endfor %}
  712. {#                                {% endblock %}#}
  713. {#                            {% endembed %}#}
  714.                         {% endif %}
  715. {#                    </div>#}
  716.             </div>
  717.             <div class=\"border p-3 rounded\">
  718.                 <h4>Общая статистика:</h4>
  719.                 <div class=\"d-flex\">
  720.                     <div class=\"p-2\">
  721.                         {% for status, itemsByStatusCountItem in itemsByStatusCount %}
  722.                             <div>
  723.                                 <label>
  724.                                     <input type=\"checkbox\" data-calc-item-name=\"{{ status }}\" data-calc-item-value=\"{{ itemsByStatusCountItem.count }}\">
  725.                                     Всего со статусом <b>\"{{ itemsByStatusCountItem.statusText }}\"</b>: {{ itemsByStatusCountItem.count }}
  726.                                 </label>
  727.                             </div>
  728.                         {% endfor %}
  729.                     </div>
  730.                     <div class=\"p-2\">
  731.                         {% for level, itemsByStudentLevelCountItem in itemsByStudentLevelCount %}
  732.                             <div>
  733.                                 <label>
  734.                                     <input type=\"checkbox\" data-calc-item-name=\"level_{{ level }}\" data-calc-item-value=\"{{ itemsByStudentLevelCountItem.count }}\">
  735.                                     Всего c уровнем <b>\"{{ itemsByStudentLevelCountItem.level }}\"</b>: {{ itemsByStudentLevelCountItem.count }}
  736.                                 </label>
  737.                             </div>
  738.                         {% endfor %}
  739.                     </div>
  740.                 </div>
  741.                 <div class=\"p-2\">
  742.                     <div>Всего учеников: {{ allStudentsCount }}</div>
  743.                     <div>Всего числящихся учеников: {{ itemsWithCanSendCampaignStatusCount }}</div>
  744.                     <div>Всего подписчиков: {{ itemsByStatusCount['subscriber_virtual_status']['count'] }}</div>
  745.                     <div>Всего выбывших: {{ allLeavedStudentsCount }}</div>
  746.                     <br>
  747.                     <div>
  748.                         Калькулятор: <span class=\"calc-result\"><b>выберите значения</b></span>
  749.                     </div>
  750.                 </div>
  751.             </div>
  752.             <br>
  753. {#            <div>#}
  754. {#                Тексты писем:#}
  755. {#            </div>#}
  756. {#            <script>#}
  757. {#                let msg = null;#}
  758. {#            </script>#}
  759. {#            {% set i = -1 %}#}
  760. {#            {% set emails = \"hh099@ya.ru\\n\" %}#}
  761. {#            {% for item in items %}#}
  762. {#                {% set i = i + 1 %}#}
  763. {#                {% if item.virtualStudentStatus != \"subscriber\" %}#}
  764. {#                    <div>#}
  765. {#                        <button class=\"copy-to-buffer\" data-name=\"{{ item.name }}\"#}
  766. {#                            data-email=\"{{ item.email }}\"#}
  767. {#                        >{{ i + 1 }} - id: {{ item.id}} - {{ item.name }} {{ item.email }} - {{ item.virtualStudentStatus }}</button>#}
  768. {#                    </div>#}
  769. {#                    <br>#}
  770. {#                    {% if item.id >= 328 and item.email %}#}
  771. {#                        {% set emails = emails ~ item.email ~ \"\\n\" %}#}
  772. {#                    {% endif %}#}
  773. {#                {% endif %}#}
  774. {#            {% endfor %}#}
  775. {#            <textarea id=\"emails-textarea\" class=\"form-control\" rows=\"10\" placeholder=\"Сюда будут скопированы все email обучающихся, не являющихся подписчиками, при нажатии на кнопку выше\">{{ emails }}</textarea>#}
  776. {#            <script>#}
  777. {#                \$('.copy-to-buffer').click(function () {#}
  778. {#                    let btn = \$(this)[0];#}
  779. {#                    let name = \$(this).data('name');#}
  780. {#                    let email = \$(this).data('email');#}
  781. {#                    let msg = `\${name}, добрый день! Отправляю информацию чтобы Телеграм работал.#}
  782. {#Ссылка для телефонов Android (Samsung, Xiaomi, Huawei и др.):#}
  783. {#https://play.google.com/store/apps/details?id=com.adguard.vpn#}
  784. {#Программа для компьютера Windows AdGuard прикреплена к письму.`;#}
  785. {#                    msg = email;#}
  786. {#                    navigator.clipboard.writeText(msg).then(() => {#}
  787. {#                        // alert('Текст скопирован в буфер обмена');#}
  788. {#                        //change button class to primarey#}
  789. {#                        \$(btn).removeClass('btn-secondary').addClass('btn-primary');#}
  790. {#                    }).catch(err => {#}
  791. {#                        alert('Ошибка при копировании текста: ' + err);#}
  792. {#                    });#}
  793. {#                });#}
  794. {#            </script>#}
  795.             <div class=\"mb-4 d-flex justify-content-end\">
  796.                 <button id=\"compare-table-btn\" class=\"btn btn-primary mb-3\">Поиск по списку ФИО</button>
  797.             </div>
  798.             <div class=\"table-responsive\">
  799.                 <table class=\"table table-bordered\" id=\"students-data-table\">
  800.                     <thead>
  801.                     <tr>
  802.                         <th data-table-type=\"num\">Номер п/п</th>
  803.                         <th>Имя</th>
  804.                         <th>Город</th>
  805.                         <th data-table-dropdown-id=\"cityRegionDropdown\"
  806.                             data-table-badge-id=\"cityRegionBadge\"
  807.                             data-table-dropdown-text-for-all=\"Все области\">Область</th>
  808.                         <th>Телефон</th>
  809.                         <th>E-mail</th>
  810.                         <th data-table-dropdown-id=\"levelDropdown\"
  811.                             data-table-badge-id=\"levelBadge\"
  812.                             data-table-dropdown-text-for-all=\"Все уровни\">Уровень</th>
  813.                         <th data-export-exclude-col>Статус</th>
  814.                         <th data-table-hide-col data-table-dropdown-id=\"statusDropdown\"
  815.                             data-table-badge-id=\"statusBadge\"
  816.                             data-table-dropdown-text-for-all=\"Все статусы\">Статус (текст)</th>
  817.                         <th data-export-exclude-col>Фото</th>
  818.                         <th data-table-type=\"date-d-m-Y-asc\">Дата последнего прохождния курса уровня</th>
  819.                         <th>Комментарий</th>
  820.                         {# Для каждого календарного события добавляем скрытый столбец (значение Да/Нет). #}
  821.                         {% for ceId, ce in calendarEvents %}
  822.                             <th data-table-hide-col
  823.                                 data-table-dropdown-id=\"calendarEvent_{{ ceId }}Dropdown\"
  824.                                 data-table-badge-id=\"calendarEvent_{{ ceId }}Badge\"
  825.                                 data-table-dropdown-text-for-all=\"Не выбрано\"
  826.                                 data-export-exclude-col>{{ ce.getText() }}</th>
  827.                         {% endfor %}
  828.                         <th data-table-hide-col data-export-exclude-col>Идентификатор пользователя Telegram</th>
  829.                         <th data-table-hide-col data-export-exclude-col
  830.                             data-table-dropdown-id=\"telegramUserIdSetDropdown\"
  831.                             data-table-badge-id=\"telegramUserIdSetBadge\"
  832.                             data-table-dropdown-text-for-all=\"Не выбрано\"
  833.                         >Идентификатор пользователя Telegram установлен (да/нет)</th>
  834.                         <th>Сведения</th>
  835.                         <th data-export-exclude-col>Действия</th>
  836.                         <th data-table-type=\"num\" data-table-hide-col data-table-col-id=\"id\">#</th>
  837.                         <th data-table-hide-col>Дополнить комментарий учащегося</th>
  838.                     </tr>
  839.                     </thead>
  840.                     {# <tfoot>
  841.                     <tr>
  842.                         <th>Имя</th>
  843.                         <th>Уровень</th>
  844.                     </tr>
  845.                 </tfoot> #}
  846.                     <tbody>
  847.                     {% set studentIndex = -1 %}
  848.                     {% for item in items %}
  849.                         {% set studentIndex = studentIndex + 1 %}
  850.                         {% set earnLevelCandidate = earnLevelCandidates[item.id] %}
  851.                         <tr>
  852.                             <td>{{ studentIndex + 1 }}</td>
  853.                             <td>{{ getFirstLastNameWithOld(item, false, true) }}</td>
  854.                             <td>{{ item.city ? item.city.name : \"город не указан\" }}</td>
  855.                             <td>{{ item.city and item.city.region ? item.city.region.name : \"область не указана\" }}</td>
  856.                             <td>{{ item.phone }}</td>
  857.                             <td>{{ item.email }}</td>
  858.                             <td>{{ item.student and item.student.level > -1 ? item.student.level : \"нет уровня\" }}</td>
  859.                             <td>
  860.                                 <span href=\"#\" class=\"btn btn-{{ item.virtualStudentStatusCssClass }} btn-icon-split w-max cursor-default\">
  861.                                     <span class=\"icon text-white-50\">
  862.                                         <i class=\"fas fa-tag\"></i>
  863.                                     </span>
  864.                                     <span class=\"text\">{{ item.virtualStudentStatusText }}</span>
  865.                                 </span>
  866.                             </td>
  867.                             <td>{{ item.virtualStudentStatusText }}</td>
  868.                             <td>
  869. {#                                {% if item.image %}#}
  870. {#                                    <img src=\"{{ path('image_view', {id: item.image.id}) }}\"#}
  871. {#                                         alt=\"Фото {{ item.name }}\"#}
  872. {#                                         class=\"cursor-pointer gallery-trigger\"#}
  873. {#                                         style=\"max-width: 100px; max-height: 100px;\"#}
  874. {#                                         data-gallery-index=\"{{ studentIndex }}\"#}
  875. {#                                         data-gallery-modal-id=\"studentsPhotoGalleryModal\"#}
  876. {#                                    >#}
  877. {#                                {% else %}#}
  878. {#                                    –#}
  879. {#                                {% endif %}#}
  880.                             </td>
  881.                             <td>
  882.                                 {% set outputEarnLevelCandidate = item.student and earnLevelCandidate and earnLevelCandidate.calendarEvent.earnLevel == item.student.level %}
  883.                                 {% if outputEarnLevelCandidate %}
  884.                                     {{ earnLevelCandidate.calendarEvent.startDate|date('d.m.Y') }}
  885.                                 {% else %}
  886.                                     –
  887.                                 {% endif %}
  888.                             </td>
  889.                             <td>{{ item.comment ?: \"–\" }}</td>
  890.                             {# Для каждого события выводим 'Да' если есть кандидат для пары студент-событие, иначе 'Нет' #}
  891.                             {% for ceId, ce in calendarEvents %}
  892.                                 {% set registered = item.student and ((candidatesByStudentAndCalendarEvent[item.student.id] is defined) and (candidatesByStudentAndCalendarEvent[item.student.id][(ceId)] is defined)) %}
  893.                                 <td>{{ registered ? 'Да' : 'Нет' }}</td>
  894.                             {% endfor %}
  895.                             <td>{{ item.telegramUserId ?: \"–\" }}</td>
  896.                             <td>
  897.                                 {% set statusAdditon = item.canSendTelegramCampaigns ? \"\" : \" (Рассылка Telegram отключена!)\" %}
  898.                                 {{ item.telegramUserId ? 'Да' ~ statusAdditon : 'Нет' ~ statusAdditon }}
  899.                             </td>
  900.                             <td>
  901.                                 <b>Дата рождения</b>: {{ item.birthday ? item.birthday|date('d.m.Y') : \"–\" }}
  902.                                 <br><br>
  903.                                 <b>Род деятельности</b>: {{ item.job ? item.job.name : \"–\" }}
  904.                             </td>
  905.                             <td>
  906.                                 <a title=\"Редактировать\" href=\"{{ path('moderator_learner_edit', {id: item.id}) }}\" class=\"btn btn-primary btn-circle\">
  907.                                     <i class=\"fas fa-edit\"></i>
  908.                                 </a>
  909.                                 {% if getUser() and getUser().getSettings().isCanEditStudents() %}
  910.                                     <a title=\"Удалить\" href=\"javascript:void(0);\" class=\"btn btn-danger btn-circle\"
  911.                                        onclick='(async ()=>{
  912.                                                let msg = \"Удалить учащегося {{ (item.name)|e('js') }}?\";
  913.                                            let answer = await showWindowModal(\"Подтверждение\", msg, \"Удалить\", \"Отмена\");
  914.                                            if (answer === MODAL_WINDOW_BUTTON.BUTTON_1) {
  915.                                                window.location = \"{{ path('moderator_student_delete', {id: item.id}) }}\";
  916.                                                }
  917.                                                })()'>
  918.                                         <i class=\"fas fa-trash\"></i>
  919.                                     </a>
  920.                                 {% endif %}
  921.                             </td>
  922.                             <td>{{ item.id }}</td>
  923.                             <td></td>
  924.                         </tr>
  925.                     {% endfor %}
  926.                     </tbody>
  927.                 </table>
  928.                 {% set galleryItems = items %}
  929.                 {% embed 'components/image_carousel_modal/image_carousel_modal.html.twig' with { options: {
  930.                     modalId: 'studentsPhotoGalleryModal',
  931.                     modalTitle: 'Галерея учащихся',
  932.                     elementClickTriggerSelector: '#students-data-table img.gallery-trigger',
  933.                 } } %}
  934.                     {% block slides %}
  935.                         {% set galleryIndex = -1 %}
  936.                         {% for galleryItem in galleryItems %}
  937.                             {% set galleryIndex = galleryIndex + 1 %}
  938. {#                            {% set slideText = 'Фото: ' ~ galleryItem.name %}#}
  939. {#                            {% embed 'components/image_carousel_modal/gallery_slide.html.twig' with { options: {#}
  940. {#                                imageIndex: galleryIndex,#}
  941. {#                                imageUrl: galleryItem.image ? path('image_view', {id: galleryItem.image.id}),#}
  942. {#                                attrs: 'data-student-id=\"' ~ galleryItem.id ~ '\"',#}
  943. {#                            } } %}#}
  944. {#                                {% block text %}#}
  945. {#                                    <div><b>Имя:</b> {{ galleryItem.name }}</div>#}
  946. {#                                    <div><b>Город:</b> {{ galleryItem.city ? galleryItem.cityText : '–' }}</div>#}
  947. {#                                    <div><b>Уровень:</b> {{ galleryItem.student ? galleryItem.student.levelText : \"нет уровня\" }}</div>#}
  948. {#                                    <div class=\"mb-0\"><b>Телефон:</b> {{ galleryItem.phone ?: '–' }}</div>#}
  949. {#                                    <div class=\"mb-1\"><b>E-mail:</b> {{ galleryItem.email ?: '–' }}</div>#}
  950. {#                                {% endblock %}#}
  951. {#                            {% endembed %}#}
  952.                         {% endfor %}
  953.                     {% endblock %}
  954.                 {% endembed %}
  955.                 {#                {% if getUser() and (getUser().getSettings().canUseTestFeatures()) %}#}
  956.                 <div class=\"mt-4 d-flex\">
  957.                     <button id=\"download-csv-btn\" class=\"btn btn-primary\">Скачать таблицу</button>
  958.                 </div>
  959. {#                {% endif %}#}
  960.             </div>
  961.         </div>
  962.     </div>
  963. {% endblock %}
  964. {% block addJs %}
  965.     <script>
  966.         let studentsDataTableOptions =  {
  967.             // \"scrollY\": \"500px\",
  968.             \"lengthMenu\": [[10, 20, 50, 100, 200, 300, 500, 700, -1], [10, 20, 50, 100, 200, 300, 500, 700, \"Все\"]],
  969.             drawRowNumbersForColIndex: 0,
  970.         };
  971.         let table = new CustomDataTable('#students-data-table', studentsDataTableOptions);
  972.         table.initDataTable();
  973.         // compare table button - collect filtered table data and run compare
  974.         \$('#compare-table-btn').click(async () => {
  975.             let result = await showTableCompareModal();
  976.             if (result !== null) {
  977.                 let compareList = result.compareList;
  978.                 let tableData = table.getAllFilteredTableData();
  979.                 let tableList = \"\";
  980.                 for (let i = 0; i < tableData.length; i++) {
  981.                     tableList += tableData[i][1] + \"\\n\";
  982.                 }
  983.                 let compareResult = await compareData(tableList, compareList);
  984.                 const modalContent = getCompareTableHtml(tableData, compareResult, \"students-data-table\",
  985.                     \"#students-table-filters\", studentsDataTableOptions);
  986.                 let answer = await showWindowModal('Результаты поиска в таблице по списку ФИО', modalContent, \"Ок\", \"Отмена\",
  987.                     \"max-width: 95%;\");
  988.             }
  989.         });
  990.         \$('#download-csv-btn').click(() => {
  991.             table.downloadCsv()
  992.         });
  993.         let galleries = [];
  994.         \$('.gallery-modal').each(function() {
  995.             let modalId = \$(this).attr('id');
  996.             let options = {};
  997.             if (\$(this).is(\"#studentsPhotoGalleryModal\")) {
  998.                 options = {
  999.                     ...options,
  1000.                     slideIdAttrName: 'data-student-id',
  1001.                     dataTableInstance: table,
  1002.                 }
  1003.             }
  1004.             let gallery = new GalleryCarousel(modalId, options);
  1005.             galleries.push(gallery);
  1006.         });
  1007.         function updateCalc() {
  1008.             const \$span = \$('.calc-result');
  1009.             const \$inputs = \$('input[data-calc-item-name]');
  1010.             let total = 0;
  1011.             let anyChecked = false;
  1012.             \$inputs.each(function() {
  1013.                 const \$el = \$(this);
  1014.                 if (\$el.is(':checked')) {
  1015.                     anyChecked = true;
  1016.                     const raw = \$el.attr('data-calc-item-value');
  1017.                     const n = Number(String(raw).replace(/[^0-9.-]+/g, ''));
  1018.                     if (!isNaN(n)) total += n;
  1019.                 }
  1020.             });
  1021.             if (!anyChecked) {
  1022.                 \$span.html('<b>выберите значения</b>');
  1023.             } else {
  1024.                 \$span.html('<b>' + total + '</b>');
  1025.             }
  1026.         }
  1027.         // Привязываем событие и инициализируем при загрузке
  1028.         \$(document).ready(function() {
  1029.             \$(document).on('change', 'input[data-calc-item-name]', updateCalc);
  1030.             updateCalc();
  1031.         });
  1032.     </script>
  1033. {% endblock %}
  1034. ""admin/student/learners.html.twig""/home/sariato/www/dev.centr.sariato.ru/templates/admin/student/learners.html.twig");
  1035.     }
  1036. }
  1037. /* admin/student/learners.html.twig */
  1038. class __TwigTemplate_8d3cd4902ac0441df347031e81d3c7b5___630547325 extends Template
  1039. {
  1040.     private $source;
  1041.     private $macros = [];
  1042.     public function __construct(Environment $env)
  1043.     {
  1044.         parent::__construct($env);
  1045.         $this->source $this->getSourceContext();
  1046.         $this->blocks = [
  1047.             'slides' => [$this'block_slides'],
  1048.         ];
  1049.     }
  1050.     protected function doGetParent(array $context)
  1051.     {
  1052.         // line 311
  1053.         return "components/image_carousel_modal/image_carousel_modal.html.twig";
  1054.     }
  1055.     protected function doDisplay(array $context, array $blocks = [])
  1056.     {
  1057.         $macros $this->macros;
  1058.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1059.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""admin/student/learners.html.twig"));
  1060.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1061.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""admin/student/learners.html.twig"));
  1062.         $this->parent $this->loadTemplate("components/image_carousel_modal/image_carousel_modal.html.twig""admin/student/learners.html.twig"311);
  1063.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  1064.         
  1065.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1066.         
  1067.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1068.     }
  1069.     // line 316
  1070.     public function block_slides($context, array $blocks = [])
  1071.     {
  1072.         $macros $this->macros;
  1073.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1074.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""slides"));
  1075.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1076.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""slides"));
  1077.         // line 317
  1078.         yield "                        ";
  1079.         $context["galleryIndex"] =  -1;
  1080.         // line 318
  1081.         yield "                        ";
  1082.         $context['_parent'] = $context;
  1083.         $context['_seq'] = CoreExtension::ensureTraversable((isset($context["galleryItems"]) || array_key_exists("galleryItems"$context) ? $context["galleryItems"] : (function () { throw new RuntimeError('Variable "galleryItems" does not exist.'318$this->source); })()));
  1084.         foreach ($context['_seq'] as $context["_key"] => $context["galleryItem"]) {
  1085.             // line 319
  1086.             yield "                            ";
  1087.             $context["galleryIndex"] = ((isset($context["galleryIndex"]) || array_key_exists("galleryIndex"$context) ? $context["galleryIndex"] : (function () { throw new RuntimeError('Variable "galleryIndex" does not exist.'319$this->source); })()) + 1);
  1088.             // line 334
  1089.             yield "                        ";
  1090.         }
  1091.         $_parent $context['_parent'];
  1092.         unset($context['_seq'], $context['_iterated'], $context['_key'], $context['galleryItem'], $context['_parent'], $context['loop']);
  1093.         $context array_intersect_key($context$_parent) + $_parent;
  1094.         // line 335
  1095.         yield "                    ";
  1096.         
  1097.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1098.         
  1099.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1100.         return; yield '';
  1101.     }
  1102.     /**
  1103.      * @codeCoverageIgnore
  1104.      */
  1105.     public function getTemplateName()
  1106.     {
  1107.         return "admin/student/learners.html.twig";
  1108.     }
  1109.     /**
  1110.      * @codeCoverageIgnore
  1111.      */
  1112.     public function isTraitable()
  1113.     {
  1114.         return false;
  1115.     }
  1116.     /**
  1117.      * @codeCoverageIgnore
  1118.      */
  1119.     public function getDebugInfo()
  1120.     {
  1121.         return array (  1204 => 335,  1198 => 334,  1195 => 319,  1190 => 318,  1187 => 317,  1177 => 316,  1154 => 311,  584 => 349,  574 => 348,  560 => 343,  555 => 339,  552 => 337,  549 => 311,  547 => 310,  542 => 307,  532 => 303,  529 => 302,  520 => 296,  514 => 293,  510 => 291,  508 => 290,  501 => 286,  495 => 283,  490 => 281,  483 => 278,  481 => 277,  476 => 275,  473 => 274,  464 => 272,  461 => 271,  456 => 270,  451 => 267,  447 => 265,  443 => 263,  437 => 261,  434 => 260,  432 => 259,  427 => 256,  422 => 243,  416 => 240,  409 => 236,  404 => 234,  400 => 233,  396 => 232,  392 => 231,  388 => 230,  384 => 229,  380 => 228,  377 => 227,  374 => 226,  371 => 225,  366 => 224,  364 => 223,  361 => 222,  346 => 203,  338 => 201,  333 => 199,  329 => 198,  326 => 197,  321 => 196,  291 => 167,  288 => 157,  285 => 154,  282 => 151,  279 => 143,  276 => 135,  264 => 111,  260 => 110,  256 => 109,  252 => 108,  246 => 104,  234 => 100,  228 => 99,  224 => 97,  220 => 96,  215 => 93,  203 => 89,  197 => 88,  193 => 86,  189 => 85,  181 => 79,  178 => 77,  164 => 74,  162 => 68,  161 => 67,  159 => 66,  141 => 65,  139 => 64,  137 => 52,  134 => 51,  131 => 46,  128 => 44,  126 => 39,  123 => 38,  121 => 33,  118 => 32,  116 => 27,  112 => 25,  109 => 24,  106 => 20,  104 => 19,  95 => 12,  91 => 7,  81 => 6,  61 => 3,  38 => 1,);
  1122.     }
  1123.     public function getSourceContext()
  1124.     {
  1125.         return new Source("{% extends 'admin/base.html.twig' %}
  1126. {% block title %}Учищиеся{% endblock %}
  1127. {% block content %}
  1128.     <!-- Page Heading -->
  1129.     <h1 class=\"h3 mb-2 text-gray-800\">Просмотр учащихся</h1>
  1130.     {# <p class=\"mb-4\">DataTables is a third party plugin that is used to generate the demo table below.
  1131.     For more information about DataTables, please visit the <a target=\"_blank\"
  1132.         href=\"https://datatables.net\">official DataTables documentation</a>.</p> #}
  1133.     <!-- DataTales Example -->
  1134.     <div class=\"card shadow mb-4 mt-4\">
  1135.         <div class=\"card-header py-3\">
  1136.             <h6 class=\"m-0 font-weight-bold text-primary\">Учащиеся</h6>
  1137.         </div>
  1138.         <div class=\"card-body\">
  1139.             {% if getUser() and getUser().getSettings().isCanEditStudents() %}
  1140.                 {% include 'components/add_item_button.html.twig' with { options: {
  1141.                     url: path('moderator_learner_edit'),
  1142.                     title: 'Новый учащийся'
  1143.                 } } %}
  1144.             {% endif %}
  1145.             <div id=\"students-table-filters\" class=\"mb-4 d-flex align-items-center\" style=\"gap: 20px; flex-wrap: wrap;\">
  1146.                 {% include 'components/table_filter.html.twig' with { options: {
  1147.                     labelText: 'Уровень',
  1148.                     dropdownIdPrefix: 'level',
  1149.                     allItemsButtonText: 'Все уровни',
  1150.                 }} %}
  1151.                 {% include 'components/table_filter.html.twig' with { options: {
  1152.                     labelText: 'Статус',
  1153.                     dropdownIdPrefix: 'status',
  1154.                     allItemsButtonText: 'Все статусы',
  1155.                 }} %}
  1156.                 {% include 'components/table_filter.html.twig' with { options: {
  1157.                     labelText: 'Контакт Telegram найден',
  1158.                     dropdownIdPrefix: 'telegramUserIdSet',
  1159.                     allItemsButtonText: 'Не выбрано',
  1160.                 }} %}
  1161.                 {# Добавлен фильтр по области (city.region) #}
  1162.                 {% include 'components/table_filter.html.twig' with { options: {
  1163.                     labelText: 'Область',
  1164.                     dropdownIdPrefix: 'cityRegion',
  1165.                     allItemsButtonText: 'Все области',
  1166.                 }} %}
  1167.                 {% if getUser() and getUser().settings.canUseTestFeatures %}
  1168. {#                    <div>#}
  1169. {#                        {% embed 'components/dropdown.html.twig' with { options: {#}
  1170. {#                            labelAttrs: 'style=\"display: block\"',#}
  1171. {#                            dropdownMenuAttrs: 'style=\"width: 500px; max-height: 600px; overflow-y: auto;\"',#}
  1172. {#                            defaultItemText: \"Выбрать\",#}
  1173. {#                            labelText: \"Зарегистрирован на мероприятие:\",#}
  1174. {#                            buttonClass: 'btn-primary btn',#}
  1175. {#                            preventDropdownClose: true,#}
  1176. {#                        } } %}#}
  1177. {#                            {% block beforeDropdownItems %}#}
  1178. {#                                <li class=\"px-3 py-2\">#}
  1179.                                     {# Перечисляем фильтры для каждого календарного события: статичные элементы Да/Нет #}
  1180.                                         {% for ceId, ce in calendarEvents %}
  1181.                                             {% include 'components/table_filter.html.twig' with { options: {
  1182.                                                 labelText: 'Зарегистрирован: ' ~ ce.getText(),
  1183.                                                 dropdownIdPrefix: 'calendarEvent_' ~ ceId,
  1184.                                                 allItemsButtonText: 'Не выбрано',
  1185.                                                 multipleSelect: false,
  1186.                                                 itemsHtml: '<a class=\"dropdown-item\" href=\"#\" data-filter=\"Да\">Да</a><a class=\"dropdown-item\" href=\"#\" data-filter=\"Нет\">Нет</a>',
  1187.                                             }} %}
  1188. {#                                            <br>#}
  1189.                                         {% endfor %}
  1190. {#                                {% endblock %}#}
  1191. {#                            {% endembed %}#}
  1192.                         {% endif %}
  1193. {#                    </div>#}
  1194.             </div>
  1195.             <div class=\"border p-3 rounded\">
  1196.                 <h4>Общая статистика:</h4>
  1197.                 <div class=\"d-flex\">
  1198.                     <div class=\"p-2\">
  1199.                         {% for status, itemsByStatusCountItem in itemsByStatusCount %}
  1200.                             <div>
  1201.                                 <label>
  1202.                                     <input type=\"checkbox\" data-calc-item-name=\"{{ status }}\" data-calc-item-value=\"{{ itemsByStatusCountItem.count }}\">
  1203.                                     Всего со статусом <b>\"{{ itemsByStatusCountItem.statusText }}\"</b>: {{ itemsByStatusCountItem.count }}
  1204.                                 </label>
  1205.                             </div>
  1206.                         {% endfor %}
  1207.                     </div>
  1208.                     <div class=\"p-2\">
  1209.                         {% for level, itemsByStudentLevelCountItem in itemsByStudentLevelCount %}
  1210.                             <div>
  1211.                                 <label>
  1212.                                     <input type=\"checkbox\" data-calc-item-name=\"level_{{ level }}\" data-calc-item-value=\"{{ itemsByStudentLevelCountItem.count }}\">
  1213.                                     Всего c уровнем <b>\"{{ itemsByStudentLevelCountItem.level }}\"</b>: {{ itemsByStudentLevelCountItem.count }}
  1214.                                 </label>
  1215.                             </div>
  1216.                         {% endfor %}
  1217.                     </div>
  1218.                 </div>
  1219.                 <div class=\"p-2\">
  1220.                     <div>Всего учеников: {{ allStudentsCount }}</div>
  1221.                     <div>Всего числящихся учеников: {{ itemsWithCanSendCampaignStatusCount }}</div>
  1222.                     <div>Всего подписчиков: {{ itemsByStatusCount['subscriber_virtual_status']['count'] }}</div>
  1223.                     <div>Всего выбывших: {{ allLeavedStudentsCount }}</div>
  1224.                     <br>
  1225.                     <div>
  1226.                         Калькулятор: <span class=\"calc-result\"><b>выберите значения</b></span>
  1227.                     </div>
  1228.                 </div>
  1229.             </div>
  1230.             <br>
  1231. {#            <div>#}
  1232. {#                Тексты писем:#}
  1233. {#            </div>#}
  1234. {#            <script>#}
  1235. {#                let msg = null;#}
  1236. {#            </script>#}
  1237. {#            {% set i = -1 %}#}
  1238. {#            {% set emails = \"hh099@ya.ru\\n\" %}#}
  1239. {#            {% for item in items %}#}
  1240. {#                {% set i = i + 1 %}#}
  1241. {#                {% if item.virtualStudentStatus != \"subscriber\" %}#}
  1242. {#                    <div>#}
  1243. {#                        <button class=\"copy-to-buffer\" data-name=\"{{ item.name }}\"#}
  1244. {#                            data-email=\"{{ item.email }}\"#}
  1245. {#                        >{{ i + 1 }} - id: {{ item.id}} - {{ item.name }} {{ item.email }} - {{ item.virtualStudentStatus }}</button>#}
  1246. {#                    </div>#}
  1247. {#                    <br>#}
  1248. {#                    {% if item.id >= 328 and item.email %}#}
  1249. {#                        {% set emails = emails ~ item.email ~ \"\\n\" %}#}
  1250. {#                    {% endif %}#}
  1251. {#                {% endif %}#}
  1252. {#            {% endfor %}#}
  1253. {#            <textarea id=\"emails-textarea\" class=\"form-control\" rows=\"10\" placeholder=\"Сюда будут скопированы все email обучающихся, не являющихся подписчиками, при нажатии на кнопку выше\">{{ emails }}</textarea>#}
  1254. {#            <script>#}
  1255. {#                \$('.copy-to-buffer').click(function () {#}
  1256. {#                    let btn = \$(this)[0];#}
  1257. {#                    let name = \$(this).data('name');#}
  1258. {#                    let email = \$(this).data('email');#}
  1259. {#                    let msg = `\${name}, добрый день! Отправляю информацию чтобы Телеграм работал.#}
  1260. {#Ссылка для телефонов Android (Samsung, Xiaomi, Huawei и др.):#}
  1261. {#https://play.google.com/store/apps/details?id=com.adguard.vpn#}
  1262. {#Программа для компьютера Windows AdGuard прикреплена к письму.`;#}
  1263. {#                    msg = email;#}
  1264. {#                    navigator.clipboard.writeText(msg).then(() => {#}
  1265. {#                        // alert('Текст скопирован в буфер обмена');#}
  1266. {#                        //change button class to primarey#}
  1267. {#                        \$(btn).removeClass('btn-secondary').addClass('btn-primary');#}
  1268. {#                    }).catch(err => {#}
  1269. {#                        alert('Ошибка при копировании текста: ' + err);#}
  1270. {#                    });#}
  1271. {#                });#}
  1272. {#            </script>#}
  1273.             <div class=\"mb-4 d-flex justify-content-end\">
  1274.                 <button id=\"compare-table-btn\" class=\"btn btn-primary mb-3\">Поиск по списку ФИО</button>
  1275.             </div>
  1276.             <div class=\"table-responsive\">
  1277.                 <table class=\"table table-bordered\" id=\"students-data-table\">
  1278.                     <thead>
  1279.                     <tr>
  1280.                         <th data-table-type=\"num\">Номер п/п</th>
  1281.                         <th>Имя</th>
  1282.                         <th>Город</th>
  1283.                         <th data-table-dropdown-id=\"cityRegionDropdown\"
  1284.                             data-table-badge-id=\"cityRegionBadge\"
  1285.                             data-table-dropdown-text-for-all=\"Все области\">Область</th>
  1286.                         <th>Телефон</th>
  1287.                         <th>E-mail</th>
  1288.                         <th data-table-dropdown-id=\"levelDropdown\"
  1289.                             data-table-badge-id=\"levelBadge\"
  1290.                             data-table-dropdown-text-for-all=\"Все уровни\">Уровень</th>
  1291.                         <th data-export-exclude-col>Статус</th>
  1292.                         <th data-table-hide-col data-table-dropdown-id=\"statusDropdown\"
  1293.                             data-table-badge-id=\"statusBadge\"
  1294.                             data-table-dropdown-text-for-all=\"Все статусы\">Статус (текст)</th>
  1295.                         <th data-export-exclude-col>Фото</th>
  1296.                         <th data-table-type=\"date-d-m-Y-asc\">Дата последнего прохождния курса уровня</th>
  1297.                         <th>Комментарий</th>
  1298.                         {# Для каждого календарного события добавляем скрытый столбец (значение Да/Нет). #}
  1299.                         {% for ceId, ce in calendarEvents %}
  1300.                             <th data-table-hide-col
  1301.                                 data-table-dropdown-id=\"calendarEvent_{{ ceId }}Dropdown\"
  1302.                                 data-table-badge-id=\"calendarEvent_{{ ceId }}Badge\"
  1303.                                 data-table-dropdown-text-for-all=\"Не выбрано\"
  1304.                                 data-export-exclude-col>{{ ce.getText() }}</th>
  1305.                         {% endfor %}
  1306.                         <th data-table-hide-col data-export-exclude-col>Идентификатор пользователя Telegram</th>
  1307.                         <th data-table-hide-col data-export-exclude-col
  1308.                             data-table-dropdown-id=\"telegramUserIdSetDropdown\"
  1309.                             data-table-badge-id=\"telegramUserIdSetBadge\"
  1310.                             data-table-dropdown-text-for-all=\"Не выбрано\"
  1311.                         >Идентификатор пользователя Telegram установлен (да/нет)</th>
  1312.                         <th>Сведения</th>
  1313.                         <th data-export-exclude-col>Действия</th>
  1314.                         <th data-table-type=\"num\" data-table-hide-col data-table-col-id=\"id\">#</th>
  1315.                         <th data-table-hide-col>Дополнить комментарий учащегося</th>
  1316.                     </tr>
  1317.                     </thead>
  1318.                     {# <tfoot>
  1319.                     <tr>
  1320.                         <th>Имя</th>
  1321.                         <th>Уровень</th>
  1322.                     </tr>
  1323.                 </tfoot> #}
  1324.                     <tbody>
  1325.                     {% set studentIndex = -1 %}
  1326.                     {% for item in items %}
  1327.                         {% set studentIndex = studentIndex + 1 %}
  1328.                         {% set earnLevelCandidate = earnLevelCandidates[item.id] %}
  1329.                         <tr>
  1330.                             <td>{{ studentIndex + 1 }}</td>
  1331.                             <td>{{ getFirstLastNameWithOld(item, false, true) }}</td>
  1332.                             <td>{{ item.city ? item.city.name : \"город не указан\" }}</td>
  1333.                             <td>{{ item.city and item.city.region ? item.city.region.name : \"область не указана\" }}</td>
  1334.                             <td>{{ item.phone }}</td>
  1335.                             <td>{{ item.email }}</td>
  1336.                             <td>{{ item.student and item.student.level > -1 ? item.student.level : \"нет уровня\" }}</td>
  1337.                             <td>
  1338.                                 <span href=\"#\" class=\"btn btn-{{ item.virtualStudentStatusCssClass }} btn-icon-split w-max cursor-default\">
  1339.                                     <span class=\"icon text-white-50\">
  1340.                                         <i class=\"fas fa-tag\"></i>
  1341.                                     </span>
  1342.                                     <span class=\"text\">{{ item.virtualStudentStatusText }}</span>
  1343.                                 </span>
  1344.                             </td>
  1345.                             <td>{{ item.virtualStudentStatusText }}</td>
  1346.                             <td>
  1347. {#                                {% if item.image %}#}
  1348. {#                                    <img src=\"{{ path('image_view', {id: item.image.id}) }}\"#}
  1349. {#                                         alt=\"Фото {{ item.name }}\"#}
  1350. {#                                         class=\"cursor-pointer gallery-trigger\"#}
  1351. {#                                         style=\"max-width: 100px; max-height: 100px;\"#}
  1352. {#                                         data-gallery-index=\"{{ studentIndex }}\"#}
  1353. {#                                         data-gallery-modal-id=\"studentsPhotoGalleryModal\"#}
  1354. {#                                    >#}
  1355. {#                                {% else %}#}
  1356. {#                                    –#}
  1357. {#                                {% endif %}#}
  1358.                             </td>
  1359.                             <td>
  1360.                                 {% set outputEarnLevelCandidate = item.student and earnLevelCandidate and earnLevelCandidate.calendarEvent.earnLevel == item.student.level %}
  1361.                                 {% if outputEarnLevelCandidate %}
  1362.                                     {{ earnLevelCandidate.calendarEvent.startDate|date('d.m.Y') }}
  1363.                                 {% else %}
  1364.                                     –
  1365.                                 {% endif %}
  1366.                             </td>
  1367.                             <td>{{ item.comment ?: \"–\" }}</td>
  1368.                             {# Для каждого события выводим 'Да' если есть кандидат для пары студент-событие, иначе 'Нет' #}
  1369.                             {% for ceId, ce in calendarEvents %}
  1370.                                 {% set registered = item.student and ((candidatesByStudentAndCalendarEvent[item.student.id] is defined) and (candidatesByStudentAndCalendarEvent[item.student.id][(ceId)] is defined)) %}
  1371.                                 <td>{{ registered ? 'Да' : 'Нет' }}</td>
  1372.                             {% endfor %}
  1373.                             <td>{{ item.telegramUserId ?: \"–\" }}</td>
  1374.                             <td>
  1375.                                 {% set statusAdditon = item.canSendTelegramCampaigns ? \"\" : \" (Рассылка Telegram отключена!)\" %}
  1376.                                 {{ item.telegramUserId ? 'Да' ~ statusAdditon : 'Нет' ~ statusAdditon }}
  1377.                             </td>
  1378.                             <td>
  1379.                                 <b>Дата рождения</b>: {{ item.birthday ? item.birthday|date('d.m.Y') : \"–\" }}
  1380.                                 <br><br>
  1381.                                 <b>Род деятельности</b>: {{ item.job ? item.job.name : \"–\" }}
  1382.                             </td>
  1383.                             <td>
  1384.                                 <a title=\"Редактировать\" href=\"{{ path('moderator_learner_edit', {id: item.id}) }}\" class=\"btn btn-primary btn-circle\">
  1385.                                     <i class=\"fas fa-edit\"></i>
  1386.                                 </a>
  1387.                                 {% if getUser() and getUser().getSettings().isCanEditStudents() %}
  1388.                                     <a title=\"Удалить\" href=\"javascript:void(0);\" class=\"btn btn-danger btn-circle\"
  1389.                                        onclick='(async ()=>{
  1390.                                                let msg = \"Удалить учащегося {{ (item.name)|e('js') }}?\";
  1391.                                            let answer = await showWindowModal(\"Подтверждение\", msg, \"Удалить\", \"Отмена\");
  1392.                                            if (answer === MODAL_WINDOW_BUTTON.BUTTON_1) {
  1393.                                                window.location = \"{{ path('moderator_student_delete', {id: item.id}) }}\";
  1394.                                                }
  1395.                                                })()'>
  1396.                                         <i class=\"fas fa-trash\"></i>
  1397.                                     </a>
  1398.                                 {% endif %}
  1399.                             </td>
  1400.                             <td>{{ item.id }}</td>
  1401.                             <td></td>
  1402.                         </tr>
  1403.                     {% endfor %}
  1404.                     </tbody>
  1405.                 </table>
  1406.                 {% set galleryItems = items %}
  1407.                 {% embed 'components/image_carousel_modal/image_carousel_modal.html.twig' with { options: {
  1408.                     modalId: 'studentsPhotoGalleryModal',
  1409.                     modalTitle: 'Галерея учащихся',
  1410.                     elementClickTriggerSelector: '#students-data-table img.gallery-trigger',
  1411.                 } } %}
  1412.                     {% block slides %}
  1413.                         {% set galleryIndex = -1 %}
  1414.                         {% for galleryItem in galleryItems %}
  1415.                             {% set galleryIndex = galleryIndex + 1 %}
  1416. {#                            {% set slideText = 'Фото: ' ~ galleryItem.name %}#}
  1417. {#                            {% embed 'components/image_carousel_modal/gallery_slide.html.twig' with { options: {#}
  1418. {#                                imageIndex: galleryIndex,#}
  1419. {#                                imageUrl: galleryItem.image ? path('image_view', {id: galleryItem.image.id}),#}
  1420. {#                                attrs: 'data-student-id=\"' ~ galleryItem.id ~ '\"',#}
  1421. {#                            } } %}#}
  1422. {#                                {% block text %}#}
  1423. {#                                    <div><b>Имя:</b> {{ galleryItem.name }}</div>#}
  1424. {#                                    <div><b>Город:</b> {{ galleryItem.city ? galleryItem.cityText : '–' }}</div>#}
  1425. {#                                    <div><b>Уровень:</b> {{ galleryItem.student ? galleryItem.student.levelText : \"нет уровня\" }}</div>#}
  1426. {#                                    <div class=\"mb-0\"><b>Телефон:</b> {{ galleryItem.phone ?: '–' }}</div>#}
  1427. {#                                    <div class=\"mb-1\"><b>E-mail:</b> {{ galleryItem.email ?: '–' }}</div>#}
  1428. {#                                {% endblock %}#}
  1429. {#                            {% endembed %}#}
  1430.                         {% endfor %}
  1431.                     {% endblock %}
  1432.                 {% endembed %}
  1433.                 {#                {% if getUser() and (getUser().getSettings().canUseTestFeatures()) %}#}
  1434.                 <div class=\"mt-4 d-flex\">
  1435.                     <button id=\"download-csv-btn\" class=\"btn btn-primary\">Скачать таблицу</button>
  1436.                 </div>
  1437. {#                {% endif %}#}
  1438.             </div>
  1439.         </div>
  1440.     </div>
  1441. {% endblock %}
  1442. {% block addJs %}
  1443.     <script>
  1444.         let studentsDataTableOptions =  {
  1445.             // \"scrollY\": \"500px\",
  1446.             \"lengthMenu\": [[10, 20, 50, 100, 200, 300, 500, 700, -1], [10, 20, 50, 100, 200, 300, 500, 700, \"Все\"]],
  1447.             drawRowNumbersForColIndex: 0,
  1448.         };
  1449.         let table = new CustomDataTable('#students-data-table', studentsDataTableOptions);
  1450.         table.initDataTable();
  1451.         // compare table button - collect filtered table data and run compare
  1452.         \$('#compare-table-btn').click(async () => {
  1453.             let result = await showTableCompareModal();
  1454.             if (result !== null) {
  1455.                 let compareList = result.compareList;
  1456.                 let tableData = table.getAllFilteredTableData();
  1457.                 let tableList = \"\";
  1458.                 for (let i = 0; i < tableData.length; i++) {
  1459.                     tableList += tableData[i][1] + \"\\n\";
  1460.                 }
  1461.                 let compareResult = await compareData(tableList, compareList);
  1462.                 const modalContent = getCompareTableHtml(tableData, compareResult, \"students-data-table\",
  1463.                     \"#students-table-filters\", studentsDataTableOptions);
  1464.                 let answer = await showWindowModal('Результаты поиска в таблице по списку ФИО', modalContent, \"Ок\", \"Отмена\",
  1465.                     \"max-width: 95%;\");
  1466.             }
  1467.         });
  1468.         \$('#download-csv-btn').click(() => {
  1469.             table.downloadCsv()
  1470.         });
  1471.         let galleries = [];
  1472.         \$('.gallery-modal').each(function() {
  1473.             let modalId = \$(this).attr('id');
  1474.             let options = {};
  1475.             if (\$(this).is(\"#studentsPhotoGalleryModal\")) {
  1476.                 options = {
  1477.                     ...options,
  1478.                     slideIdAttrName: 'data-student-id',
  1479.                     dataTableInstance: table,
  1480.                 }
  1481.             }
  1482.             let gallery = new GalleryCarousel(modalId, options);
  1483.             galleries.push(gallery);
  1484.         });
  1485.         function updateCalc() {
  1486.             const \$span = \$('.calc-result');
  1487.             const \$inputs = \$('input[data-calc-item-name]');
  1488.             let total = 0;
  1489.             let anyChecked = false;
  1490.             \$inputs.each(function() {
  1491.                 const \$el = \$(this);
  1492.                 if (\$el.is(':checked')) {
  1493.                     anyChecked = true;
  1494.                     const raw = \$el.attr('data-calc-item-value');
  1495.                     const n = Number(String(raw).replace(/[^0-9.-]+/g, ''));
  1496.                     if (!isNaN(n)) total += n;
  1497.                 }
  1498.             });
  1499.             if (!anyChecked) {
  1500.                 \$span.html('<b>выберите значения</b>');
  1501.             } else {
  1502.                 \$span.html('<b>' + total + '</b>');
  1503.             }
  1504.         }
  1505.         // Привязываем событие и инициализируем при загрузке
  1506.         \$(document).ready(function() {
  1507.             \$(document).on('change', 'input[data-calc-item-name]', updateCalc);
  1508.             updateCalc();
  1509.         });
  1510.     </script>
  1511. {% endblock %}
  1512. ""admin/student/learners.html.twig""/home/sariato/www/dev.centr.sariato.ru/templates/admin/student/learners.html.twig");
  1513.     }
  1514. }