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