var/cache/dev/twig/aa/aa76007532f857eabaa923f84d61e073d0c84a2eed47655c8c5682a53ee9a2b3.php line 46

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. /* @CompanyGroup/pages/tickets/create_ticket.html.twig */
  15. class __TwigTemplate_d3c14b32ec9a23d50656de5d8361b57237ef38bbdfdf77b3d0f40772c63c6a4a 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->parent false;
  24.         $this->blocks = [
  25.         ];
  26.     }
  27.     protected function doDisplay(array $context, array $blocks = [])
  28.     {
  29.         $macros $this->macros;
  30.         $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  31.         $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""@CompanyGroup/pages/tickets/create_ticket.html.twig"));
  32.         $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  33.         $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""@CompanyGroup/pages/tickets/create_ticket.html.twig"));
  34.         // line 1
  35.         $context["page_title"] = "New Ticket | HoneyBee";
  36.         // line 2
  37.         yield from         $this->loadTemplate("@Application/inc/central_header.html.twig""@CompanyGroup/pages/tickets/create_ticket.html.twig"2)->unwrap()->yield($context);
  38.         // line 3
  39.         yield from         $this->loadTemplate("@CompanyGroup/pages/admin/_sidebar.html.twig""@CompanyGroup/pages/tickets/create_ticket.html.twig"3)->unwrap()->yield($context);
  40.         // line 4
  41.         yield "
  42. <style>
  43. /* ── Design tokens ─────────────────────────────────────────────────────────── */
  44. :root {
  45.     --n-cream:     #F7F5F0;
  46.     --n-cream-2:   #F0EDE5;
  47.     --n-white:     #FFFFFF;
  48.     --n-dark:      #1A1D2E;
  49.     --n-dark-2:    #252840;
  50.     --n-amber:     #C07D2A;
  51.     --n-amber-lt:  #D4954A;
  52.     --n-amber-dim: rgba(192,125,42,.10);
  53.     --n-sage:      #3D6B52;
  54.     --n-sage-dim:  rgba(61,107,82,.09);
  55.     --n-muted:     #6B6E7F;
  56.     --n-muted-2:   #9395A5;
  57.     --n-border:    rgba(26,29,46,.07);
  58.     --n-border-md: rgba(26,29,46,.12);
  59.     --n-shadow-sm: 0 2px 12px rgba(26,29,46,.07);
  60.     --n-shadow-md: 0 8px 32px rgba(26,29,46,.09);
  61.     --n-radius:    12px;
  62.     --n-radius-sm: 8px;
  63.     --n-font:      'DM Sans', 'Poppins', system-ui, sans-serif;
  64. }
  65. *, *::before, *::after { box-sizing: border-box; }
  66. body { background: var(--n-cream); font-family: var(--n-font); color: var(--n-dark); text-align: left; }
  67. /* ── Layout ────────────────────────────────────────────────────────────────── */
  68. .tc-wrap { max-width: 1100px; margin: 0 auto; padding: 0 28px; }
  69. .tc-page { padding: 40px 0 80px; }
  70. /* ── Breadcrumb ────────────────────────────────────────────────────────────── */
  71. .tc-breadcrumb {
  72.     font-size: .8rem; color: var(--n-muted-2); margin-bottom: 20px;
  73.     display: flex; align-items: center; gap: 6px;
  74. }
  75. .tc-breadcrumb a { color: var(--n-muted); text-decoration: none; font-weight: 500; }
  76. .tc-breadcrumb a:hover { color: var(--n-amber); }
  77. .tc-breadcrumb .sep { color: var(--n-border-md); }
  78. .tc-breadcrumb .current { color: var(--n-dark); font-weight: 600; }
  79. /* ── Page header ───────────────────────────────────────────────────────────── */
  80. .tc-page-title {
  81.     font-family: 'Montserrat', sans-serif; font-size: clamp(1.4rem,2.5vw,1.9rem);
  82.     font-weight: 800; color: var(--n-dark); letter-spacing: -.02em; margin: 0 0 5px;
  83. }
  84. .tc-page-sub { font-size: .88rem; color: var(--n-muted); margin: 0 0 28px; }
  85. .required-star { color: #c0392b; }
  86. /* ── Form card ─────────────────────────────────────────────────────────────── */
  87. .tc-card {
  88.     background: var(--n-white); border: 1px solid var(--n-border-md);
  89.     border-radius: var(--n-radius); padding: 28px 28px 24px;
  90.     margin-bottom: 16px; box-shadow: var(--n-shadow-sm);
  91. }
  92. .tc-card-title {
  93.     font-family: monospace; font-size: .72rem; font-weight: 700;
  94.     letter-spacing: .1em; text-transform: uppercase; color: var(--n-amber);
  95.     margin-bottom: 20px; padding-bottom: 12px;
  96.     border-bottom: 1px solid var(--n-border); display: flex;
  97.     align-items: center; justify-content: space-between; gap: 8px;
  98. }
  99. .tc-card-title i { margin-right: 6px; }
  100. /* ── Form elements ─────────────────────────────────────────────────────────── */
  101. .tc-label {
  102.     display: block; font-size: .8rem; font-weight: 600;
  103.     color: var(--n-muted); margin-bottom: 5px;
  104. }
  105. .tc-input,
  106. .tc-select,
  107. .tc-textarea {
  108.     width: 100%; border-radius: var(--n-radius-sm);
  109.     border: 1.5px solid var(--n-border-md); background: var(--n-cream);
  110.     color: var(--n-dark); font-family: var(--n-font); font-size: .9rem;
  111.     padding: 9px 13px; transition: border-color .15s, box-shadow .15s;
  112.     appearance: none;
  113. }
  114. .tc-textarea { resize: vertical; min-height: 130px; }
  115. .tc-input:focus, .tc-select:focus, .tc-textarea:focus {
  116.     outline: none; border-color: var(--n-amber);
  117.     box-shadow: 0 0 0 3px var(--n-amber-dim);
  118. }
  119. .tc-select { background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%236B6E7F' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E\"); background-repeat: no-repeat; background-position: right 13px center; padding-right: 36px; }
  120. .tc-char-count { font-size: .73rem; color: var(--n-muted-2); text-align: right; margin-top: 4px; font-family: monospace; }
  121. .tc-hint { font-size: .75rem; color: var(--n-muted-2); margin-top: 4px; }
  122. /* ── Priority grid ─────────────────────────────────────────────────────────── */
  123. .tc-priority-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 10px; }
  124. .tc-prio-input { display: none; }
  125. .tc-prio-label {
  126.     display: flex; flex-direction: column; align-items: center; justify-content: center;
  127.     gap: 4px; border: 1.5px solid var(--n-border-md); border-radius: var(--n-radius);
  128.     padding: 16px 8px; cursor: pointer; text-align: center; background: var(--n-cream);
  129.     transition: border-color .15s, background .15s;
  130. }
  131. .tc-prio-label:hover { border-color: var(--n-amber-lt); background: var(--n-amber-dim); }
  132. .tc-prio-input:checked + .tc-prio-label { border-color: var(--n-amber); background: var(--n-amber-dim); }
  133. .tc-prio-input[value=\"1\"]:checked + .tc-prio-label { border-color: #c0392b; background: rgba(192,57,43,.07); }
  134. .tc-prio-input[value=\"2\"]:checked + .tc-prio-label { border-color: var(--n-amber-lt); background: var(--n-amber-dim); }
  135. .tc-prio-icon { font-size: 1.4rem; }
  136. .tc-prio-name { font-size: .8rem; font-weight: 700; color: var(--n-dark); }
  137. .tc-prio-desc { font-size: .7rem; color: var(--n-muted-2); }
  138. /* ── Source toggle ─────────────────────────────────────────────────────────── */
  139. .tc-source-toggle {
  140.     display: flex; border: 1.5px solid var(--n-border-md);
  141.     border-radius: var(--n-radius-sm); overflow: hidden;
  142. }
  143. .tc-source-toggle input { display: none; }
  144. .tc-source-toggle label {
  145.     flex: 1; text-align: center; padding: 9px 8px;
  146.     font-size: .82rem; font-weight: 600; cursor: pointer;
  147.     color: var(--n-muted); background: var(--n-cream); transition: all .15s;
  148.     border-right: 1.5px solid var(--n-border-md);
  149. }
  150. .tc-source-toggle label:last-of-type { border-right: none; }
  151. .tc-source-toggle input:checked + label { background: var(--n-dark); color: #fff; }
  152. /* ── Advanced section (collapsible) ───────────────────────────────────────── */
  153. .tc-adv-toggle {
  154.     font-size: .78rem; font-weight: 700; color: var(--n-muted);
  155.     cursor: pointer; display: flex; align-items: center; gap: 5px;
  156.     font-family: monospace; text-transform: uppercase; letter-spacing: .08em;
  157. }
  158. .tc-adv-toggle:hover { color: var(--n-amber); }
  159. .tc-adv-badge {
  160.     background: rgba(111,66,193,.09); color: #6f42c1;
  161.     font-size: .65rem; font-weight: 700; padding: 2px 8px;
  162.     border-radius: 100px; font-family: monospace; letter-spacing: .06em;
  163. }
  164. .tc-adv-body { display: none; margin-top: 16px; }
  165. .tc-adv-body.open { display: block; }
  166. .tc-mono { font-family: monospace !important; font-size: .83rem !important; }
  167. /* ── Action bar ────────────────────────────────────────────────────────────── */
  168. .tc-action-bar {
  169.     display: flex; align-items: center; gap: 12px;
  170.     padding-top: 8px;
  171. }
  172. .tc-btn-submit {
  173.     display: inline-flex; align-items: center; gap: 8px;
  174.     padding: 12px 28px; background: var(--n-dark); color: #fff;
  175.     border: none; border-radius: var(--n-radius-sm);
  176.     font-family: var(--n-font); font-size: .92rem; font-weight: 700;
  177.     cursor: pointer; transition: background .18s, transform .15s; text-decoration: none;
  178. }
  179. .tc-btn-submit:hover { background: var(--n-amber); color: #fff; transform: translateY(-1px); }
  180. .tc-btn-cancel {
  181.     display: inline-flex; align-items: center; gap: 6px;
  182.     padding: 12px 20px; background: transparent; color: var(--n-muted);
  183.     border: 1.5px solid var(--n-border-md); border-radius: var(--n-radius-sm);
  184.     font-family: var(--n-font); font-size: .9rem; font-weight: 600;
  185.     cursor: pointer; text-decoration: none; transition: all .18s;
  186. }
  187. .tc-btn-cancel:hover { border-color: var(--n-dark); color: var(--n-dark); }
  188. </style>
  189. <div class=\"hb-admin-layout\">
  190. <div class=\"tc-page\">
  191.     <div class=\"tc-wrap\">
  192.         ";
  193.         // line 167
  194.         yield "        <div class=\"tc-breadcrumb\">
  195.             <a href=\"";
  196.         // line 168
  197.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ticket_list");
  198.         yield "\"><i class=\"fa fa-ticket-alt fa-xs\"></i> Tickets</a>
  199.             <span class=\"sep\">/</span>
  200.             <span class=\"current\">New Ticket</span>
  201.         </div>
  202.         <h1 class=\"tc-page-title\">Create New Ticket</h1>
  203.         <p class=\"tc-page-sub\">Fields marked <span class=\"required-star\">*</span> are required.</p>
  204.         <form method=\"POST\"
  205.               action=\"";
  206.         // line 177
  207.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ticket_create_submit");
  208.         yield "\"
  209.               enctype=\"multipart/form-data\"
  210.               id=\"createTicketForm\">
  211.             <div class=\"row g-4\">
  212.                 ";
  213.         // line 184
  214.         yield "                <div class=\"col-lg-8\">
  215.                     ";
  216.         // line 187
  217.         yield "                    <div class=\"tc-card\">
  218.                         <div class=\"tc-card-title\">
  219.                             <span><i class=\"fa fa-info-circle\"></i>Ticket Details</span>
  220.                         </div>
  221.                         <div class=\"mb-3\">
  222.                             <label class=\"tc-label\">Title <span class=\"required-star\">*</span></label>
  223.                             <input type=\"text\" name=\"title\" class=\"tc-input\"
  224.                                    placeholder=\"Brief summary of the issue…\"
  225.                                    value=\"";
  226.         // line 196
  227.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "title", [], "any"truetruefalse196) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "title", [], "any"falsefalsefalse196)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "title", [], "any"falsefalsefalse196), "html"nulltrue)) : (yield ""));
  228.         yield "\"
  229.                                    maxlength=\"255\" required>
  230.                         </div>
  231.                         <div class=\"mb-3\">
  232.                             <label class=\"tc-label\">Description <span class=\"required-star\">*</span></label>
  233.                             <textarea name=\"description\" class=\"tc-textarea\" rows=\"6\"
  234.                                       id=\"descriptionField\"
  235.                                       placeholder=\"Describe the issue in detail…\"
  236.                                       maxlength=\"5000\"
  237.                                       required>";
  238.         // line 206
  239.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "description", [], "any"truetruefalse206) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "description", [], "any"falsefalsefalse206)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "description", [], "any"falsefalsefalse206), "html"nulltrue)) : (yield ""));
  240.         yield "</textarea>
  241.                             <div class=\"tc-char-count\" id=\"charCount\">0 / 5000</div>
  242.                         </div>
  243.                         <div class=\"mb-3\">
  244.                             <label class=\"tc-label\">Internal Note</label>
  245.                             <textarea name=\"note\" class=\"tc-textarea\" rows=\"3\"
  246.                                       placeholder=\"Internal notes (not visible to the reporter)…\">";
  247.         // line 213
  248.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "note", [], "any"truetruefalse213) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "note", [], "any"falsefalsefalse213)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "note", [], "any"falsefalsefalse213), "html"nulltrue)) : (yield ""));
  249.         yield "</textarea>
  250.                         </div>
  251.                         <div class=\"mb-0\">
  252.                             <label class=\"tc-label\">Attachments</label>
  253.                             <input type=\"file\" name=\"attachments[]\" class=\"tc-input\"
  254.                                    multiple accept=\".jpg,.jpeg,.png,.pdf,.txt,.log,.zip\">
  255.                             <div class=\"tc-hint\">JPG, PNG, PDF, TXT, LOG, ZIP — max 10 MB per file</div>
  256.                         </div>
  257.                     </div>
  258.                     ";
  259.         // line 225
  260.         yield "                    <div class=\"tc-card\">
  261.                         <div class=\"tc-card-title\">
  262.                             <span><i class=\"fa fa-sliders-h\"></i>Classification</span>
  263.                         </div>
  264.                         <div class=\"mb-4\">
  265.                             <label class=\"tc-label\">Ticket Type</label>
  266.                             <select name=\"ticketType\" class=\"tc-select\">
  267.                                 <option value=\"\">— Select type —</option>
  268.                                 <option value=\"1\" ";
  269.         // line 234
  270.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'234$this->source); })()), "ticketType", [], "any"falsefalsefalse234), 1))) ? ("selected") : (""));
  271.         yield ">Service Ticket</option>
  272.                                 <option value=\"2\" ";
  273.         // line 235
  274.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'235$this->source); })()), "ticketType", [], "any"falsefalsefalse235), 2))) ? ("selected") : (""));
  275.         yield ">To-Do</option>
  276.                                 <option value=\"3\" ";
  277.         // line 236
  278.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'236$this->source); })()), "ticketType", [], "any"falsefalsefalse236), 3))) ? ("selected") : (""));
  279.         yield ">To-Do Reply</option>
  280.                                 <option value=\"4\" ";
  281.         // line 237
  282.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'237$this->source); })()), "ticketType", [], "any"falsefalsefalse237), 4))) ? ("selected") : (""));
  283.         yield ">Query</option>
  284.                                 <option value=\"5\" ";
  285.         // line 238
  286.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'238$this->source); })()), "ticketType", [], "any"falsefalsefalse238), 5))) ? ("selected") : (""));
  287.         yield ">Development</option>
  288.                                 <option value=\"6\" ";
  289.         // line 239
  290.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'239$this->source); })()), "ticketType", [], "any"falsefalsefalse239), 6))) ? ("selected") : (""));
  291.         yield ">Supplier</option>
  292.                                 <option value=\"7\" ";
  293.         // line 240
  294.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'240$this->source); })()), "ticketType", [], "any"falsefalsefalse240), 7))) ? ("selected") : (""));
  295.         yield ">Client</option>
  296.                             </select>
  297.                         </div>
  298.                         <div class=\"mb-4\">
  299.                             <label class=\"tc-label\">Priority <span class=\"required-star\">*</span></label>
  300.                             <div class=\"tc-priority-grid\">
  301.                                 <div>
  302.                                     <input type=\"radio\" name=\"priority\" value=\"1\" id=\"prio1\" class=\"tc-prio-input\"
  303.                                            ";
  304.         // line 249
  305.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"truetruefalse249) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse249)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse249)) : (3)), 1))) ? ("checked") : (""));
  306.         yield ">
  307.                                     <label for=\"prio1\" class=\"tc-prio-label\">
  308.                                         <span class=\"tc-prio-icon\">🔴</span>
  309.                                         <span class=\"tc-prio-name\">Emergency</span>
  310.                                         <span class=\"tc-prio-desc\">Needs immediate action</span>
  311.                                     </label>
  312.                                 </div>
  313.                                 <div>
  314.                                     <input type=\"radio\" name=\"priority\" value=\"2\" id=\"prio2\" class=\"tc-prio-input\"
  315.                                            ";
  316.         // line 258
  317.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"truetruefalse258) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse258)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse258)) : (3)), 2))) ? ("checked") : (""));
  318.         yield ">
  319.                                     <label for=\"prio2\" class=\"tc-prio-label\">
  320.                                         <span class=\"tc-prio-icon\">🟡</span>
  321.                                         <span class=\"tc-prio-name\">Important</span>
  322.                                         <span class=\"tc-prio-desc\">Should be addressed soon</span>
  323.                                     </label>
  324.                                 </div>
  325.                                 <div>
  326.                                     <input type=\"radio\" name=\"priority\" value=\"3\" id=\"prio3\" class=\"tc-prio-input\"
  327.                                            ";
  328.         // line 267
  329.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"truetruefalse267) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse267)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "priority", [], "any"falsefalsefalse267)) : (3)), 3))) ? ("checked") : (""));
  330.         yield ">
  331.                                     <label for=\"prio3\" class=\"tc-prio-label\">
  332.                                         <span class=\"tc-prio-icon\">🟢</span>
  333.                                         <span class=\"tc-prio-name\">Normal</span>
  334.                                         <span class=\"tc-prio-desc\">Routine issue</span>
  335.                                     </label>
  336.                                 </div>
  337.                             </div>
  338.                         </div>
  339.                         <div class=\"mb-0\">
  340.                             <label class=\"tc-label\">Source</label>
  341.                             <div class=\"tc-source-toggle\">
  342.                                 <input type=\"radio\" name=\"source\" value=\"1\" id=\"src1\"
  343.                                        ";
  344.         // line 281
  345.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"truetruefalse281) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse281)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse281)) : (1)), 1))) ? ("checked") : (""));
  346.         yield ">
  347.                                 <label for=\"src1\"><i class=\"fa fa-user fa-xs\"></i> Manual</label>
  348.                                 <input type=\"radio\" name=\"source\" value=\"2\" id=\"src2\"
  349.                                        ";
  350.         // line 285
  351.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"truetruefalse285) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse285)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse285)) : (1)), 2))) ? ("checked") : (""));
  352.         yield ">
  353.                                 <label for=\"src2\"><i class=\"fa fa-robot fa-xs\"></i> System</label>
  354.                                 <input type=\"radio\" name=\"source\" value=\"3\" id=\"src3\"
  355.                                        ";
  356.         // line 289
  357.         yield (((=== CoreExtension::compare((((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"truetruefalse289) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse289)))) ? (CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "source", [], "any"falsefalsefalse289)) : (1)), 3))) ? ("checked") : (""));
  358.         yield ">
  359.                                 <label for=\"src3\"><i class=\"fa fa-code fa-xs\"></i> API</label>
  360.                             </div>
  361.                         </div>
  362.                     </div>
  363.                     ";
  364.         // line 296
  365.         yield "                    <div class=\"tc-card\">
  366.                         <div class=\"tc-card-title\">
  367.                             <span><i class=\"fa fa-fingerprint\"></i>System Tracking</span>
  368.                             <div style=\"display:flex;align-items:center;gap:10px;\">
  369.                                 <span class=\"tc-adv-badge\">Advanced</span>
  370.                                 <span class=\"tc-adv-toggle\" onclick=\"toggleSystemFields(this)\" id=\"sysToggleBtn\">
  371.                                     <i class=\"fa fa-chevron-down fa-xs\"></i> Expand
  372.                                 </span>
  373.                             </div>
  374.                         </div>
  375.                         <div class=\"tc-adv-body\" id=\"systemFieldsBlock\">
  376.                             <div class=\"mb-3\">
  377.                                 <label class=\"tc-label\">Problem Hash</label>
  378.                                 <input type=\"text\" name=\"problemHash\" class=\"tc-input tc-mono\"
  379.                                        placeholder=\"SHA256 — leave blank to auto-compute\"
  380.                                        value=\"";
  381.         // line 311
  382.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "problemHash", [], "any"truetruefalse311) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "problemHash", [], "any"falsefalsefalse311)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "problemHash", [], "any"falsefalsefalse311), "html"nulltrue)) : (yield ""));
  383.         yield "\">
  384.                                 <div class=\"tc-hint\">SHA256 of (errorCode + fileLocation + exceptionClass + appId). Do not include timestamps or user IDs.</div>
  385.                             </div>
  386.                             <div class=\"row g-3 mb-3\">
  387.                                 <div class=\"col-md-6\">
  388.                                     <label class=\"tc-label\">Error Code</label>
  389.                                     <input type=\"text\" name=\"errorCode\" class=\"tc-input\"
  390.                                            placeholder=\"e.g. 500, DB_CONN_FAIL\"
  391.                                            value=\"";
  392.         // line 319
  393.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "errorCode", [], "any"truetruefalse319) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "errorCode", [], "any"falsefalsefalse319)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "errorCode", [], "any"falsefalsefalse319), "html"nulltrue)) : (yield ""));
  394.         yield "\">
  395.                                 </div>
  396.                                 <div class=\"col-md-6\">
  397.                                     <label class=\"tc-label\">Server Identifier</label>
  398.                                     <input type=\"text\" name=\"serverIdentifier\" class=\"tc-input\"
  399.                                            placeholder=\"e.g. app-server-01\"
  400.                                            value=\"";
  401.         // line 325
  402.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "serverIdentifier", [], "any"truetruefalse325) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "serverIdentifier", [], "any"falsefalsefalse325)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "serverIdentifier", [], "any"falsefalsefalse325), "html"nulltrue)) : (yield ""));
  403.         yield "\">
  404.                                 </div>
  405.                             </div>
  406.                             <div class=\"mb-0\">
  407.                                 <label class=\"tc-label\">Payload JSON</label>
  408.                                 <textarea name=\"lastPayloadJson\" class=\"tc-textarea tc-mono\" rows=\"5\"
  409.                                           placeholder='{\"exception\":\"RuntimeException\",\"file\":\"src/...\",\"line\":42,...}'>";
  410.         // line 331
  411.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "lastPayloadJson", [], "any"truetruefalse331) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "lastPayloadJson", [], "any"falsefalsefalse331)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "lastPayloadJson", [], "any"falsefalsefalse331), "html"nulltrue)) : (yield ""));
  412.         yield "</textarea>
  413.                             </div>
  414.                         </div>
  415.                     </div>
  416.                 </div>
  417.                 ";
  418.         // line 339
  419.         yield "                <div class=\"col-lg-4\">
  420.                     ";
  421.         // line 342
  422.         yield "                    <div class=\"tc-card\">
  423.                         <div class=\"tc-card-title\">
  424.                             <span><i class=\"fa fa-user-check\"></i>Assignment</span>
  425.                         </div>
  426.                         <div class=\"mb-3\">
  427.                             <label class=\"tc-label\">Assign To (User ID)</label>
  428.                             <input type=\"number\" name=\"assignedToUserId\" class=\"tc-input\"
  429.                                    placeholder=\"User ID…\"
  430.                                    value=\"";
  431.         // line 350
  432.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "assignedToUserId", [], "any"truetruefalse350) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "assignedToUserId", [], "any"falsefalsefalse350)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "assignedToUserId", [], "any"falsefalsefalse350), "html"nulltrue)) : (yield ""));
  433.         yield "\">
  434.                         </div>
  435.                         <div class=\"mb-3\">
  436.                             <label class=\"tc-label\">Deadline</label>
  437.                             <input type=\"date\" name=\"deadlineDate\" class=\"tc-input\"
  438.                                    value=\"";
  439.         // line 355
  440.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "deadlineDate", [], "any"truetruefalse355) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "deadlineDate", [], "any"falsefalsefalse355)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "deadlineDate", [], "any"falsefalsefalse355), "html"nulltrue)) : (yield ""));
  441.         yield "\">
  442.                         </div>
  443.                         <div class=\"mb-0\">
  444.                             <label class=\"tc-label\">Tagged User IDs</label>
  445.                             <input type=\"text\" name=\"taggedUserIds\" class=\"tc-input\"
  446.                                    placeholder=\"Comma-separated, e.g. 12, 45, 78\"
  447.                                    value=\"";
  448.         // line 361
  449.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "taggedUserIds", [], "any"truetruefalse361) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "taggedUserIds", [], "any"falsefalsefalse361)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "taggedUserIds", [], "any"falsefalsefalse361), "html"nulltrue)) : (yield ""));
  450.         yield "\">
  451.                         </div>
  452.                     </div>
  453.                     ";
  454.         // line 366
  455.         yield "                    <div class=\"tc-card\">
  456.                         <div class=\"tc-card-title\">
  457.                             <span><i class=\"fa fa-address-card\"></i>Reporter Contact</span>
  458.                         </div>
  459.                         <div class=\"mb-3\">
  460.                             <label class=\"tc-label\">Name</label>
  461.                             <input type=\"text\" name=\"name\" class=\"tc-input\"
  462.                                    placeholder=\"Reporter's name…\"
  463.                                    value=\"";
  464.         // line 374
  465.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "name", [], "any"truetruefalse374) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "name", [], "any"falsefalsefalse374)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "name", [], "any"falsefalsefalse374), "html"nulltrue)) : (yield ""));
  466.         yield "\">
  467.                         </div>
  468.                         <div class=\"mb-3\">
  469.                             <label class=\"tc-label\">Email</label>
  470.                             <input type=\"email\" name=\"email\" class=\"tc-input\"
  471.                                    placeholder=\"reporter@example.com\"
  472.                                    value=\"";
  473.         // line 380
  474.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "email", [], "any"truetruefalse380) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "email", [], "any"falsefalsefalse380)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "email", [], "any"falsefalsefalse380), "html"nulltrue)) : (yield ""));
  475.         yield "\">
  476.                         </div>
  477.                         <div class=\"mb-3\">
  478.                             <label class=\"tc-label\">Phone</label>
  479.                             <input type=\"text\" name=\"phone\" class=\"tc-input\"
  480.                                    placeholder=\"+49 …\"
  481.                                    value=\"";
  482.         // line 386
  483.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "phone", [], "any"truetruefalse386) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "phone", [], "any"falsefalsefalse386)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "phone", [], "any"falsefalsefalse386), "html"nulltrue)) : (yield ""));
  484.         yield "\">
  485.                         </div>
  486.                         <div class=\"mb-0\">
  487.                             <label class=\"tc-label\">Preferred Contact</label>
  488.                             <select name=\"preferredContactMethod\" class=\"tc-select\">
  489.                                 <option value=\"\">— No preference —</option>
  490.                                 <option value=\"1\" ";
  491.         // line 392
  492.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'392$this->source); })()), "preferredContactMethod", [], "any"falsefalsefalse392), 1))) ? ("selected") : (""));
  493.         yield ">Email</option>
  494.                                 <option value=\"2\" ";
  495.         // line 393
  496.         yield (((=== CoreExtension::compare(CoreExtension::getAttribute($this->env$this->source, (isset($context["formData"]) || array_key_exists("formData"$context) ? $context["formData"] : (function () { throw new RuntimeError('Variable "formData" does not exist.'393$this->source); })()), "preferredContactMethod", [], "any"falsefalsefalse393), 2))) ? ("selected") : (""));
  497.         yield ">Phone</option>
  498.                             </select>
  499.                         </div>
  500.                     </div>
  501.                     ";
  502.         // line 399
  503.         yield "                    <div class=\"tc-card\">
  504.                         <div class=\"tc-card-title\">
  505.                             <span><i class=\"fa fa-sitemap\"></i>Context</span>
  506.                         </div>
  507.                         <div class=\"mb-3\">
  508.                             <label class=\"tc-label\">Company ID</label>
  509.                             <input type=\"number\" name=\"companyId\" class=\"tc-input\"
  510.                                    value=\"";
  511.         // line 406
  512.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "companyId", [], "any"truetruefalse406) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "companyId", [], "any"falsefalsefalse406)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "companyId", [], "any"falsefalsefalse406), "html"nulltrue)) : (yield ""));
  513.         yield "\">
  514.                         </div>
  515.                         <div class=\"mb-3\">
  516.                             <label class=\"tc-label\">App ID</label>
  517.                             <input type=\"number\" name=\"appId\" class=\"tc-input\"
  518.                                    value=\"";
  519.         // line 411
  520.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "appId", [], "any"truetruefalse411) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "appId", [], "any"falsefalsefalse411)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "appId", [], "any"falsefalsefalse411), "html"nulltrue)) : (yield ""));
  521.         yield "\">
  522.                         </div>
  523.                         <div class=\"mb-0\">
  524.                             <label class=\"tc-label\">Branch ID</label>
  525.                             <input type=\"number\" name=\"branchId\" class=\"tc-input\"
  526.                                    value=\"";
  527.         // line 416
  528.         (((CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "branchId", [], "any"truetruefalse416) &&  !(null === CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "branchId", [], "any"falsefalsefalse416)))) ? (yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["formData"] ?? null), "branchId", [], "any"falsefalsefalse416), "html"nulltrue)) : (yield ""));
  529.         yield "\">
  530.                         </div>
  531.                     </div>
  532.                 </div>
  533.             </div>
  534.             ";
  535.         // line 424
  536.         yield "            <div class=\"tc-action-bar\">
  537.                 <button type=\"submit\" class=\"tc-btn-submit\">
  538.                     <i class=\"fa fa-paper-plane\" style=\"font-size:.8rem\"></i> Create Ticket
  539.                 </button>
  540.                 <a href=\"";
  541.         // line 428
  542.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ticket_list");
  543.         yield "\" class=\"tc-btn-cancel\">
  544.                     Cancel
  545.                 </a>
  546.             </div>
  547.         </form>
  548.     </div>
  549. </div>
  550. <script>
  551.     // Character counter
  552.     var descField = document.getElementById('descriptionField');
  553.     var charCount = document.getElementById('charCount');
  554.     if (descField) {
  555.         descField.addEventListener('input', function () {
  556.             charCount.textContent = this.value.length + ' / 5000';
  557.         });
  558.     }
  559.     // System fields toggle
  560.     function toggleSystemFields(el) {
  561.         var block = document.getElementById('systemFieldsBlock');
  562.         var isOpen = block.classList.contains('open');
  563.         if (isOpen) {
  564.             block.classList.remove('open');
  565.             el.innerHTML = '<i class=\"fa fa-chevron-down fa-xs\"></i> Expand';
  566.         } else {
  567.             block.classList.add('open');
  568.             el.innerHTML = '<i class=\"fa fa-chevron-up fa-xs\"></i> Collapse';
  569.         }
  570.     }
  571.     // Auto-expand if values are pre-filled
  572.     (function () {
  573.         var fields = ['[name=\"problemHash\"]', '[name=\"serverIdentifier\"]', '[name=\"lastPayloadJson\"]'];
  574.         for (var i = 0; i < fields.length; i++) {
  575.             var el = document.querySelector(fields[i]);
  576.             if (el && el.value.trim() !== '') {
  577.                 var block = document.getElementById('systemFieldsBlock');
  578.                 block.classList.add('open');
  579.                 var btn = document.getElementById('sysToggleBtn');
  580.                 if (btn) btn.innerHTML = '<i class=\"fa fa-chevron-up fa-xs\"></i> Collapse';
  581.                 break;
  582.             }
  583.         }
  584.     })();
  585. </script>
  586. </div>";
  587.         // line 477
  588.         yield "
  589. ";
  590.         // line 478
  591.         yield from         $this->loadTemplate("@Application/footer/central_footer.html.twig""@CompanyGroup/pages/tickets/create_ticket.html.twig"478)->unwrap()->yield($context);
  592.         
  593.         $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
  594.         
  595.         $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
  596.         return; yield '';
  597.     }
  598.     /**
  599.      * @codeCoverageIgnore
  600.      */
  601.     public function getTemplateName()
  602.     {
  603.         return "@CompanyGroup/pages/tickets/create_ticket.html.twig";
  604.     }
  605.     /**
  606.      * @codeCoverageIgnore
  607.      */
  608.     public function isTraitable()
  609.     {
  610.         return false;
  611.     }
  612.     /**
  613.      * @codeCoverageIgnore
  614.      */
  615.     public function getDebugInfo()
  616.     {
  617.         return array (  639 => 478,  636 => 477,  585 => 428,  579 => 424,  569 => 416,  561 => 411,  553 => 406,  544 => 399,  536 => 393,  532 => 392,  523 => 386,  514 => 380,  505 => 374,  495 => 366,  488 => 361,  479 => 355,  471 => 350,  461 => 342,  457 => 339,  447 => 331,  438 => 325,  429 => 319,  418 => 311,  401 => 296,  392 => 289,  385 => 285,  378 => 281,  361 => 267,  349 => 258,  337 => 249,  325 => 240,  321 => 239,  317 => 238,  313 => 237,  309 => 236,  305 => 235,  301 => 234,  290 => 225,  276 => 213,  266 => 206,  253 => 196,  242 => 187,  238 => 184,  229 => 177,  217 => 168,  214 => 167,  50 => 4,  48 => 3,  46 => 2,  44 => 1,);
  618.     }
  619.     public function getSourceContext()
  620.     {
  621.         return new Source("{% set page_title = 'New Ticket | HoneyBee' %}
  622. {% include '@Application/inc/central_header.html.twig' %}
  623. {% include '@CompanyGroup/pages/admin/_sidebar.html.twig' %}
  624. <style>
  625. /* ── Design tokens ─────────────────────────────────────────────────────────── */
  626. :root {
  627.     --n-cream:     #F7F5F0;
  628.     --n-cream-2:   #F0EDE5;
  629.     --n-white:     #FFFFFF;
  630.     --n-dark:      #1A1D2E;
  631.     --n-dark-2:    #252840;
  632.     --n-amber:     #C07D2A;
  633.     --n-amber-lt:  #D4954A;
  634.     --n-amber-dim: rgba(192,125,42,.10);
  635.     --n-sage:      #3D6B52;
  636.     --n-sage-dim:  rgba(61,107,82,.09);
  637.     --n-muted:     #6B6E7F;
  638.     --n-muted-2:   #9395A5;
  639.     --n-border:    rgba(26,29,46,.07);
  640.     --n-border-md: rgba(26,29,46,.12);
  641.     --n-shadow-sm: 0 2px 12px rgba(26,29,46,.07);
  642.     --n-shadow-md: 0 8px 32px rgba(26,29,46,.09);
  643.     --n-radius:    12px;
  644.     --n-radius-sm: 8px;
  645.     --n-font:      'DM Sans', 'Poppins', system-ui, sans-serif;
  646. }
  647. *, *::before, *::after { box-sizing: border-box; }
  648. body { background: var(--n-cream); font-family: var(--n-font); color: var(--n-dark); text-align: left; }
  649. /* ── Layout ────────────────────────────────────────────────────────────────── */
  650. .tc-wrap { max-width: 1100px; margin: 0 auto; padding: 0 28px; }
  651. .tc-page { padding: 40px 0 80px; }
  652. /* ── Breadcrumb ────────────────────────────────────────────────────────────── */
  653. .tc-breadcrumb {
  654.     font-size: .8rem; color: var(--n-muted-2); margin-bottom: 20px;
  655.     display: flex; align-items: center; gap: 6px;
  656. }
  657. .tc-breadcrumb a { color: var(--n-muted); text-decoration: none; font-weight: 500; }
  658. .tc-breadcrumb a:hover { color: var(--n-amber); }
  659. .tc-breadcrumb .sep { color: var(--n-border-md); }
  660. .tc-breadcrumb .current { color: var(--n-dark); font-weight: 600; }
  661. /* ── Page header ───────────────────────────────────────────────────────────── */
  662. .tc-page-title {
  663.     font-family: 'Montserrat', sans-serif; font-size: clamp(1.4rem,2.5vw,1.9rem);
  664.     font-weight: 800; color: var(--n-dark); letter-spacing: -.02em; margin: 0 0 5px;
  665. }
  666. .tc-page-sub { font-size: .88rem; color: var(--n-muted); margin: 0 0 28px; }
  667. .required-star { color: #c0392b; }
  668. /* ── Form card ─────────────────────────────────────────────────────────────── */
  669. .tc-card {
  670.     background: var(--n-white); border: 1px solid var(--n-border-md);
  671.     border-radius: var(--n-radius); padding: 28px 28px 24px;
  672.     margin-bottom: 16px; box-shadow: var(--n-shadow-sm);
  673. }
  674. .tc-card-title {
  675.     font-family: monospace; font-size: .72rem; font-weight: 700;
  676.     letter-spacing: .1em; text-transform: uppercase; color: var(--n-amber);
  677.     margin-bottom: 20px; padding-bottom: 12px;
  678.     border-bottom: 1px solid var(--n-border); display: flex;
  679.     align-items: center; justify-content: space-between; gap: 8px;
  680. }
  681. .tc-card-title i { margin-right: 6px; }
  682. /* ── Form elements ─────────────────────────────────────────────────────────── */
  683. .tc-label {
  684.     display: block; font-size: .8rem; font-weight: 600;
  685.     color: var(--n-muted); margin-bottom: 5px;
  686. }
  687. .tc-input,
  688. .tc-select,
  689. .tc-textarea {
  690.     width: 100%; border-radius: var(--n-radius-sm);
  691.     border: 1.5px solid var(--n-border-md); background: var(--n-cream);
  692.     color: var(--n-dark); font-family: var(--n-font); font-size: .9rem;
  693.     padding: 9px 13px; transition: border-color .15s, box-shadow .15s;
  694.     appearance: none;
  695. }
  696. .tc-textarea { resize: vertical; min-height: 130px; }
  697. .tc-input:focus, .tc-select:focus, .tc-textarea:focus {
  698.     outline: none; border-color: var(--n-amber);
  699.     box-shadow: 0 0 0 3px var(--n-amber-dim);
  700. }
  701. .tc-select { background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%236B6E7F' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E\"); background-repeat: no-repeat; background-position: right 13px center; padding-right: 36px; }
  702. .tc-char-count { font-size: .73rem; color: var(--n-muted-2); text-align: right; margin-top: 4px; font-family: monospace; }
  703. .tc-hint { font-size: .75rem; color: var(--n-muted-2); margin-top: 4px; }
  704. /* ── Priority grid ─────────────────────────────────────────────────────────── */
  705. .tc-priority-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 10px; }
  706. .tc-prio-input { display: none; }
  707. .tc-prio-label {
  708.     display: flex; flex-direction: column; align-items: center; justify-content: center;
  709.     gap: 4px; border: 1.5px solid var(--n-border-md); border-radius: var(--n-radius);
  710.     padding: 16px 8px; cursor: pointer; text-align: center; background: var(--n-cream);
  711.     transition: border-color .15s, background .15s;
  712. }
  713. .tc-prio-label:hover { border-color: var(--n-amber-lt); background: var(--n-amber-dim); }
  714. .tc-prio-input:checked + .tc-prio-label { border-color: var(--n-amber); background: var(--n-amber-dim); }
  715. .tc-prio-input[value=\"1\"]:checked + .tc-prio-label { border-color: #c0392b; background: rgba(192,57,43,.07); }
  716. .tc-prio-input[value=\"2\"]:checked + .tc-prio-label { border-color: var(--n-amber-lt); background: var(--n-amber-dim); }
  717. .tc-prio-icon { font-size: 1.4rem; }
  718. .tc-prio-name { font-size: .8rem; font-weight: 700; color: var(--n-dark); }
  719. .tc-prio-desc { font-size: .7rem; color: var(--n-muted-2); }
  720. /* ── Source toggle ─────────────────────────────────────────────────────────── */
  721. .tc-source-toggle {
  722.     display: flex; border: 1.5px solid var(--n-border-md);
  723.     border-radius: var(--n-radius-sm); overflow: hidden;
  724. }
  725. .tc-source-toggle input { display: none; }
  726. .tc-source-toggle label {
  727.     flex: 1; text-align: center; padding: 9px 8px;
  728.     font-size: .82rem; font-weight: 600; cursor: pointer;
  729.     color: var(--n-muted); background: var(--n-cream); transition: all .15s;
  730.     border-right: 1.5px solid var(--n-border-md);
  731. }
  732. .tc-source-toggle label:last-of-type { border-right: none; }
  733. .tc-source-toggle input:checked + label { background: var(--n-dark); color: #fff; }
  734. /* ── Advanced section (collapsible) ───────────────────────────────────────── */
  735. .tc-adv-toggle {
  736.     font-size: .78rem; font-weight: 700; color: var(--n-muted);
  737.     cursor: pointer; display: flex; align-items: center; gap: 5px;
  738.     font-family: monospace; text-transform: uppercase; letter-spacing: .08em;
  739. }
  740. .tc-adv-toggle:hover { color: var(--n-amber); }
  741. .tc-adv-badge {
  742.     background: rgba(111,66,193,.09); color: #6f42c1;
  743.     font-size: .65rem; font-weight: 700; padding: 2px 8px;
  744.     border-radius: 100px; font-family: monospace; letter-spacing: .06em;
  745. }
  746. .tc-adv-body { display: none; margin-top: 16px; }
  747. .tc-adv-body.open { display: block; }
  748. .tc-mono { font-family: monospace !important; font-size: .83rem !important; }
  749. /* ── Action bar ────────────────────────────────────────────────────────────── */
  750. .tc-action-bar {
  751.     display: flex; align-items: center; gap: 12px;
  752.     padding-top: 8px;
  753. }
  754. .tc-btn-submit {
  755.     display: inline-flex; align-items: center; gap: 8px;
  756.     padding: 12px 28px; background: var(--n-dark); color: #fff;
  757.     border: none; border-radius: var(--n-radius-sm);
  758.     font-family: var(--n-font); font-size: .92rem; font-weight: 700;
  759.     cursor: pointer; transition: background .18s, transform .15s; text-decoration: none;
  760. }
  761. .tc-btn-submit:hover { background: var(--n-amber); color: #fff; transform: translateY(-1px); }
  762. .tc-btn-cancel {
  763.     display: inline-flex; align-items: center; gap: 6px;
  764.     padding: 12px 20px; background: transparent; color: var(--n-muted);
  765.     border: 1.5px solid var(--n-border-md); border-radius: var(--n-radius-sm);
  766.     font-family: var(--n-font); font-size: .9rem; font-weight: 600;
  767.     cursor: pointer; text-decoration: none; transition: all .18s;
  768. }
  769. .tc-btn-cancel:hover { border-color: var(--n-dark); color: var(--n-dark); }
  770. </style>
  771. <div class=\"hb-admin-layout\">
  772. <div class=\"tc-page\">
  773.     <div class=\"tc-wrap\">
  774.         {# ── Breadcrumb ── #}
  775.         <div class=\"tc-breadcrumb\">
  776.             <a href=\"{{ path('ticket_list') }}\"><i class=\"fa fa-ticket-alt fa-xs\"></i> Tickets</a>
  777.             <span class=\"sep\">/</span>
  778.             <span class=\"current\">New Ticket</span>
  779.         </div>
  780.         <h1 class=\"tc-page-title\">Create New Ticket</h1>
  781.         <p class=\"tc-page-sub\">Fields marked <span class=\"required-star\">*</span> are required.</p>
  782.         <form method=\"POST\"
  783.               action=\"{{ path('ticket_create_submit') }}\"
  784.               enctype=\"multipart/form-data\"
  785.               id=\"createTicketForm\">
  786.             <div class=\"row g-4\">
  787.                 {# ── LEFT column ── #}
  788.                 <div class=\"col-lg-8\">
  789.                     {# Core details #}
  790.                     <div class=\"tc-card\">
  791.                         <div class=\"tc-card-title\">
  792.                             <span><i class=\"fa fa-info-circle\"></i>Ticket Details</span>
  793.                         </div>
  794.                         <div class=\"mb-3\">
  795.                             <label class=\"tc-label\">Title <span class=\"required-star\">*</span></label>
  796.                             <input type=\"text\" name=\"title\" class=\"tc-input\"
  797.                                    placeholder=\"Brief summary of the issue…\"
  798.                                    value=\"{{ formData.title ?? '' }}\"
  799.                                    maxlength=\"255\" required>
  800.                         </div>
  801.                         <div class=\"mb-3\">
  802.                             <label class=\"tc-label\">Description <span class=\"required-star\">*</span></label>
  803.                             <textarea name=\"description\" class=\"tc-textarea\" rows=\"6\"
  804.                                       id=\"descriptionField\"
  805.                                       placeholder=\"Describe the issue in detail…\"
  806.                                       maxlength=\"5000\"
  807.                                       required>{{ formData.description ?? '' }}</textarea>
  808.                             <div class=\"tc-char-count\" id=\"charCount\">0 / 5000</div>
  809.                         </div>
  810.                         <div class=\"mb-3\">
  811.                             <label class=\"tc-label\">Internal Note</label>
  812.                             <textarea name=\"note\" class=\"tc-textarea\" rows=\"3\"
  813.                                       placeholder=\"Internal notes (not visible to the reporter)…\">{{ formData.note ?? '' }}</textarea>
  814.                         </div>
  815.                         <div class=\"mb-0\">
  816.                             <label class=\"tc-label\">Attachments</label>
  817.                             <input type=\"file\" name=\"attachments[]\" class=\"tc-input\"
  818.                                    multiple accept=\".jpg,.jpeg,.png,.pdf,.txt,.log,.zip\">
  819.                             <div class=\"tc-hint\">JPG, PNG, PDF, TXT, LOG, ZIP — max 10 MB per file</div>
  820.                         </div>
  821.                     </div>
  822.                     {# Classification #}
  823.                     <div class=\"tc-card\">
  824.                         <div class=\"tc-card-title\">
  825.                             <span><i class=\"fa fa-sliders-h\"></i>Classification</span>
  826.                         </div>
  827.                         <div class=\"mb-4\">
  828.                             <label class=\"tc-label\">Ticket Type</label>
  829.                             <select name=\"ticketType\" class=\"tc-select\">
  830.                                 <option value=\"\">— Select type —</option>
  831.                                 <option value=\"1\" {{ formData.ticketType == 1 ? 'selected' }}>Service Ticket</option>
  832.                                 <option value=\"2\" {{ formData.ticketType == 2 ? 'selected' }}>To-Do</option>
  833.                                 <option value=\"3\" {{ formData.ticketType == 3 ? 'selected' }}>To-Do Reply</option>
  834.                                 <option value=\"4\" {{ formData.ticketType == 4 ? 'selected' }}>Query</option>
  835.                                 <option value=\"5\" {{ formData.ticketType == 5 ? 'selected' }}>Development</option>
  836.                                 <option value=\"6\" {{ formData.ticketType == 6 ? 'selected' }}>Supplier</option>
  837.                                 <option value=\"7\" {{ formData.ticketType == 7 ? 'selected' }}>Client</option>
  838.                             </select>
  839.                         </div>
  840.                         <div class=\"mb-4\">
  841.                             <label class=\"tc-label\">Priority <span class=\"required-star\">*</span></label>
  842.                             <div class=\"tc-priority-grid\">
  843.                                 <div>
  844.                                     <input type=\"radio\" name=\"priority\" value=\"1\" id=\"prio1\" class=\"tc-prio-input\"
  845.                                            {{ (formData.priority ?? 3) == 1 ? 'checked' }}>
  846.                                     <label for=\"prio1\" class=\"tc-prio-label\">
  847.                                         <span class=\"tc-prio-icon\">🔴</span>
  848.                                         <span class=\"tc-prio-name\">Emergency</span>
  849.                                         <span class=\"tc-prio-desc\">Needs immediate action</span>
  850.                                     </label>
  851.                                 </div>
  852.                                 <div>
  853.                                     <input type=\"radio\" name=\"priority\" value=\"2\" id=\"prio2\" class=\"tc-prio-input\"
  854.                                            {{ (formData.priority ?? 3) == 2 ? 'checked' }}>
  855.                                     <label for=\"prio2\" class=\"tc-prio-label\">
  856.                                         <span class=\"tc-prio-icon\">🟡</span>
  857.                                         <span class=\"tc-prio-name\">Important</span>
  858.                                         <span class=\"tc-prio-desc\">Should be addressed soon</span>
  859.                                     </label>
  860.                                 </div>
  861.                                 <div>
  862.                                     <input type=\"radio\" name=\"priority\" value=\"3\" id=\"prio3\" class=\"tc-prio-input\"
  863.                                            {{ (formData.priority ?? 3) == 3 ? 'checked' }}>
  864.                                     <label for=\"prio3\" class=\"tc-prio-label\">
  865.                                         <span class=\"tc-prio-icon\">🟢</span>
  866.                                         <span class=\"tc-prio-name\">Normal</span>
  867.                                         <span class=\"tc-prio-desc\">Routine issue</span>
  868.                                     </label>
  869.                                 </div>
  870.                             </div>
  871.                         </div>
  872.                         <div class=\"mb-0\">
  873.                             <label class=\"tc-label\">Source</label>
  874.                             <div class=\"tc-source-toggle\">
  875.                                 <input type=\"radio\" name=\"source\" value=\"1\" id=\"src1\"
  876.                                        {{ (formData.source ?? 1) == 1 ? 'checked' }}>
  877.                                 <label for=\"src1\"><i class=\"fa fa-user fa-xs\"></i> Manual</label>
  878.                                 <input type=\"radio\" name=\"source\" value=\"2\" id=\"src2\"
  879.                                        {{ (formData.source ?? 1) == 2 ? 'checked' }}>
  880.                                 <label for=\"src2\"><i class=\"fa fa-robot fa-xs\"></i> System</label>
  881.                                 <input type=\"radio\" name=\"source\" value=\"3\" id=\"src3\"
  882.                                        {{ (formData.source ?? 1) == 3 ? 'checked' }}>
  883.                                 <label for=\"src3\"><i class=\"fa fa-code fa-xs\"></i> API</label>
  884.                             </div>
  885.                         </div>
  886.                     </div>
  887.                     {# System Tracking — collapsible #}
  888.                     <div class=\"tc-card\">
  889.                         <div class=\"tc-card-title\">
  890.                             <span><i class=\"fa fa-fingerprint\"></i>System Tracking</span>
  891.                             <div style=\"display:flex;align-items:center;gap:10px;\">
  892.                                 <span class=\"tc-adv-badge\">Advanced</span>
  893.                                 <span class=\"tc-adv-toggle\" onclick=\"toggleSystemFields(this)\" id=\"sysToggleBtn\">
  894.                                     <i class=\"fa fa-chevron-down fa-xs\"></i> Expand
  895.                                 </span>
  896.                             </div>
  897.                         </div>
  898.                         <div class=\"tc-adv-body\" id=\"systemFieldsBlock\">
  899.                             <div class=\"mb-3\">
  900.                                 <label class=\"tc-label\">Problem Hash</label>
  901.                                 <input type=\"text\" name=\"problemHash\" class=\"tc-input tc-mono\"
  902.                                        placeholder=\"SHA256 — leave blank to auto-compute\"
  903.                                        value=\"{{ formData.problemHash ?? '' }}\">
  904.                                 <div class=\"tc-hint\">SHA256 of (errorCode + fileLocation + exceptionClass + appId). Do not include timestamps or user IDs.</div>
  905.                             </div>
  906.                             <div class=\"row g-3 mb-3\">
  907.                                 <div class=\"col-md-6\">
  908.                                     <label class=\"tc-label\">Error Code</label>
  909.                                     <input type=\"text\" name=\"errorCode\" class=\"tc-input\"
  910.                                            placeholder=\"e.g. 500, DB_CONN_FAIL\"
  911.                                            value=\"{{ formData.errorCode ?? '' }}\">
  912.                                 </div>
  913.                                 <div class=\"col-md-6\">
  914.                                     <label class=\"tc-label\">Server Identifier</label>
  915.                                     <input type=\"text\" name=\"serverIdentifier\" class=\"tc-input\"
  916.                                            placeholder=\"e.g. app-server-01\"
  917.                                            value=\"{{ formData.serverIdentifier ?? '' }}\">
  918.                                 </div>
  919.                             </div>
  920.                             <div class=\"mb-0\">
  921.                                 <label class=\"tc-label\">Payload JSON</label>
  922.                                 <textarea name=\"lastPayloadJson\" class=\"tc-textarea tc-mono\" rows=\"5\"
  923.                                           placeholder='{\"exception\":\"RuntimeException\",\"file\":\"src/...\",\"line\":42,...}'>{{ formData.lastPayloadJson ?? '' }}</textarea>
  924.                             </div>
  925.                         </div>
  926.                     </div>
  927.                 </div>
  928.                 {# ── RIGHT column ── #}
  929.                 <div class=\"col-lg-4\">
  930.                     {# Assignment #}
  931.                     <div class=\"tc-card\">
  932.                         <div class=\"tc-card-title\">
  933.                             <span><i class=\"fa fa-user-check\"></i>Assignment</span>
  934.                         </div>
  935.                         <div class=\"mb-3\">
  936.                             <label class=\"tc-label\">Assign To (User ID)</label>
  937.                             <input type=\"number\" name=\"assignedToUserId\" class=\"tc-input\"
  938.                                    placeholder=\"User ID…\"
  939.                                    value=\"{{ formData.assignedToUserId ?? '' }}\">
  940.                         </div>
  941.                         <div class=\"mb-3\">
  942.                             <label class=\"tc-label\">Deadline</label>
  943.                             <input type=\"date\" name=\"deadlineDate\" class=\"tc-input\"
  944.                                    value=\"{{ formData.deadlineDate ?? '' }}\">
  945.                         </div>
  946.                         <div class=\"mb-0\">
  947.                             <label class=\"tc-label\">Tagged User IDs</label>
  948.                             <input type=\"text\" name=\"taggedUserIds\" class=\"tc-input\"
  949.                                    placeholder=\"Comma-separated, e.g. 12, 45, 78\"
  950.                                    value=\"{{ formData.taggedUserIds ?? '' }}\">
  951.                         </div>
  952.                     </div>
  953.                     {# Reporter contact #}
  954.                     <div class=\"tc-card\">
  955.                         <div class=\"tc-card-title\">
  956.                             <span><i class=\"fa fa-address-card\"></i>Reporter Contact</span>
  957.                         </div>
  958.                         <div class=\"mb-3\">
  959.                             <label class=\"tc-label\">Name</label>
  960.                             <input type=\"text\" name=\"name\" class=\"tc-input\"
  961.                                    placeholder=\"Reporter's name…\"
  962.                                    value=\"{{ formData.name ?? '' }}\">
  963.                         </div>
  964.                         <div class=\"mb-3\">
  965.                             <label class=\"tc-label\">Email</label>
  966.                             <input type=\"email\" name=\"email\" class=\"tc-input\"
  967.                                    placeholder=\"reporter@example.com\"
  968.                                    value=\"{{ formData.email ?? '' }}\">
  969.                         </div>
  970.                         <div class=\"mb-3\">
  971.                             <label class=\"tc-label\">Phone</label>
  972.                             <input type=\"text\" name=\"phone\" class=\"tc-input\"
  973.                                    placeholder=\"+49 …\"
  974.                                    value=\"{{ formData.phone ?? '' }}\">
  975.                         </div>
  976.                         <div class=\"mb-0\">
  977.                             <label class=\"tc-label\">Preferred Contact</label>
  978.                             <select name=\"preferredContactMethod\" class=\"tc-select\">
  979.                                 <option value=\"\">— No preference —</option>
  980.                                 <option value=\"1\" {{ formData.preferredContactMethod == 1 ? 'selected' }}>Email</option>
  981.                                 <option value=\"2\" {{ formData.preferredContactMethod == 2 ? 'selected' }}>Phone</option>
  982.                             </select>
  983.                         </div>
  984.                     </div>
  985.                     {# Context #}
  986.                     <div class=\"tc-card\">
  987.                         <div class=\"tc-card-title\">
  988.                             <span><i class=\"fa fa-sitemap\"></i>Context</span>
  989.                         </div>
  990.                         <div class=\"mb-3\">
  991.                             <label class=\"tc-label\">Company ID</label>
  992.                             <input type=\"number\" name=\"companyId\" class=\"tc-input\"
  993.                                    value=\"{{ formData.companyId ?? '' }}\">
  994.                         </div>
  995.                         <div class=\"mb-3\">
  996.                             <label class=\"tc-label\">App ID</label>
  997.                             <input type=\"number\" name=\"appId\" class=\"tc-input\"
  998.                                    value=\"{{ formData.appId ?? '' }}\">
  999.                         </div>
  1000.                         <div class=\"mb-0\">
  1001.                             <label class=\"tc-label\">Branch ID</label>
  1002.                             <input type=\"number\" name=\"branchId\" class=\"tc-input\"
  1003.                                    value=\"{{ formData.branchId ?? '' }}\">
  1004.                         </div>
  1005.                     </div>
  1006.                 </div>
  1007.             </div>
  1008.             {# ── Submit bar ── #}
  1009.             <div class=\"tc-action-bar\">
  1010.                 <button type=\"submit\" class=\"tc-btn-submit\">
  1011.                     <i class=\"fa fa-paper-plane\" style=\"font-size:.8rem\"></i> Create Ticket
  1012.                 </button>
  1013.                 <a href=\"{{ path('ticket_list') }}\" class=\"tc-btn-cancel\">
  1014.                     Cancel
  1015.                 </a>
  1016.             </div>
  1017.         </form>
  1018.     </div>
  1019. </div>
  1020. <script>
  1021.     // Character counter
  1022.     var descField = document.getElementById('descriptionField');
  1023.     var charCount = document.getElementById('charCount');
  1024.     if (descField) {
  1025.         descField.addEventListener('input', function () {
  1026.             charCount.textContent = this.value.length + ' / 5000';
  1027.         });
  1028.     }
  1029.     // System fields toggle
  1030.     function toggleSystemFields(el) {
  1031.         var block = document.getElementById('systemFieldsBlock');
  1032.         var isOpen = block.classList.contains('open');
  1033.         if (isOpen) {
  1034.             block.classList.remove('open');
  1035.             el.innerHTML = '<i class=\"fa fa-chevron-down fa-xs\"></i> Expand';
  1036.         } else {
  1037.             block.classList.add('open');
  1038.             el.innerHTML = '<i class=\"fa fa-chevron-up fa-xs\"></i> Collapse';
  1039.         }
  1040.     }
  1041.     // Auto-expand if values are pre-filled
  1042.     (function () {
  1043.         var fields = ['[name=\"problemHash\"]', '[name=\"serverIdentifier\"]', '[name=\"lastPayloadJson\"]'];
  1044.         for (var i = 0; i < fields.length; i++) {
  1045.             var el = document.querySelector(fields[i]);
  1046.             if (el && el.value.trim() !== '') {
  1047.                 var block = document.getElementById('systemFieldsBlock');
  1048.                 block.classList.add('open');
  1049.                 var btn = document.getElementById('sysToggleBtn');
  1050.                 if (btn) btn.innerHTML = '<i class=\"fa fa-chevron-up fa-xs\"></i> Collapse';
  1051.                 break;
  1052.             }
  1053.         }
  1054.     })();
  1055. </script>
  1056. </div>{# /hb-admin-layout #}
  1057. {% include '@Application/footer/central_footer.html.twig' %}
  1058. ""@CompanyGroup/pages/tickets/create_ticket.html.twig""/home/u405565514/domains/ourhoneybee.eu/public_html/honeybee_main/src/CompanyGroupBundle/Resources/views/pages/tickets/create_ticket.html.twig");
  1059.     }
  1060. }