• Как сделать так что бы инпут не терял фокус?

    neuotq
    @neuotq
    Прокрастинация
    Ставьте ему фокус насильно после смены "режима".
    document.getElementById("myPasswordField").focus();

    Это строку, с вашим айди поля, добавьте после строчки со сменой режима. Возможно там уже тем или иным способом находится элемент инпута, тогда просто у этого элемента вызвать метод focus()
    Ответ написан
    1 комментарий
  • Почему переменная не меняет значение, если обернуть действие в функцию?

    neuotq
    @neuotq
    Прокрастинация
    В первом случае происходят простое прямое изменение переменной existence1, вы там напрямую к ней обращаетесь и меняете значение.
    Во втором случае в момент вызова addcartProduct(existence1) значение в переменной existence1 копируется и дальше используется внутри функции addcartProduct в переменной num. При передаче параметров переменные в javascript копируются по значению, те создаётся новая переменная и туда копируется значение из переденной в параметре(есть нюансы с объектами!). Во многих язык программирования есть инструменты позволяющие передавать переменную по ссылке, но javascript такого не поддерживает.
    Поэтому будем использовать нюансы передачи значения в переменных объектах(и массивах).
    Если огрубить, то при создании объекта в js сам объект создаётся где-то в памяти, а в переменную помещается идентификатор(ссылка) на то что это за объект. Так вот, при передаче объекта в функцию, в локальную переменную внутри копируется именно это значение(а не поля и элементы как кажется), поэтому переменная внутри функции хоть и другая, но ссылается на этот же объект в памяти.
    Поэтому если мы изменим свойства этого объекта, то они поменяются и в оригинале. При это если бы эту локальную переменную перепишем(например создадим новый объект) то внешняя переменная не изменится, ведь во внешней осталась оригинальная ссылка на старый объект, а во внутреннем будет новая уже.
    Кажется непонятным, но все просто если понять что у объектов(и массивов) значение переменной это айди объекта в памяти, а переменные в js передаются всегда по значению, поэтому всё логично.
    Итак перепишем ваш пример, чтобы мы могли менять значение снаружи из функции через локальную переменную.

    //Объекты обычно объявляют как константы, чтобы случайно не переписать сам объект
    //при это свойства объекта менять можно
    //потому что константа это значение переменной - ссылка на объект в памяти
    const existence1=  { 
    value: false
    };
    
    function addcartProduct (num) {
      if (num.value) {console.log('+1')}
        else {
          console.log(num)
          num.value = true;
        }
    }
    
    //false
    console.log(existence1.value)
    
    addcartProduct(existence1);
    //true
    console.log(existence1.value)
    Ответ написан
    Комментировать
  • Как передать значение свойства в ::before класса динамически?

    neuotq
    @neuotq
    Прокрастинация
    В целом если такое происходит повод избавиться от псевдоэлемента, в подобных случаях почти всегда это можно сделать заменив его на настоящий с теми же свойствами.
    В свойстве style нельзя обращаться к псевдоэлементам, поэтому для интерактивности в схожем стиле можно использовать styled components:
    Где-то в ваших стилях:
    .testClass {
      font-size: 1.5em;
      text-align: center;
      color: #bf4f74;
    }
    
    .testClass::before {
      content: 'QQ';
      position: absolute;
      top: 10px;
    }

    В компоненте:
    // ... 
    const [textColour, setTextColour] = useState('blue');
    const TestElement = styled.h1`  
      &:before {
        color: ${textColour}
      }
    `;
    
     return (
        <>  
      <button
              onClick={() =>
                setTextColour((color) => (color === 'black' ? 'red' : 'black'))
              }
            >
              Change color of :before
            </button>   
          <Title TestElement="testClass"> HELLO </Title>
        </>
      );

    Таким образом можно будет менять интерактивно свойства псевдоэлемента.
    Ответ написан
    4 комментария
  • Зачем нужен второй интерфейс в определении класса, если первый интерфейс - наследник второго?

    neuotq
    @neuotq
    Прокрастинация
    Serializable много может быть разных ещё, и чтобы не плодить классы для некоторых проверок используют маркер интерфейсы, которые с одной стороны не навредят, а другой стороны сократят код и позволят сделать проверки типов где нужно для различных операций при всяких там наследованиях. Погуглите Marker Interfaces

    Там прямо в комментах написано:
    /**
     * A marker interface for entity reference classes.
     * <p>
     * This is used primarily as a means of ensuring type safety in collections
     * of mixed type references.
     * 
     * @see org.alfresco.service.cmr.repository.NodeService#removeChild(NodeRef, NodeRef)
     * 
     * @author Derek Hulley
     */
    Ответ написан
    2 комментария
  • Почему при работе с inertia на сервере идет обращение к локальным адресам?

    neuotq
    @neuotq
    Прокрастинация
    Судя по всему идёт обращение словно бы dev сервер vite запущен. Он как раз по умолчанию порт 5173.
    При выкатке приложения на продашн сервер нужно сделать npm run build, чтобы построить фронт.

    Либо альтернативно билдить на локалке, но тогда нужно изменить штатные .gitignore файлы, чтобы не игнорировалась папка public/assets/build (hot пусть игнорируется) и его тоже коммитить. И уже собранный фронт деплоить на сервер без сборки.

    Ну и не забываем проверять наш .env на установку всех нужных перемнных, а так же очистку кеша и тп
    Ответ написан
    3 комментария
  • Как сделать перевод динамических данных с БД laravel-vue-i18n?

    neuotq
    @neuotq
    Прокрастинация
    Советую не мучатся делая свой велосипед и использовать пакет типа https://github.com/spatie/laravel-translatable .
    Если не хочется прям привязываться к их реализации можно взять лайт версию этой идеи:
    • в базе поля что будут мультиязычными хранить в json
    • создать свой аналогичный трейт с мутаторами eloquent что будут брать и возвращать нужное значение на основе локали(можно акссесорами и другими способами, но будет не так "красиво")
    • добавить разных хелпер функций по вкусу.
    • Профит.

    Почитайте код пакета выше, там всё просто в целом.
    Ответ написан
    Комментировать
  • Как работать с Vite в Laravel?

    neuotq
    @neuotq
    Прокрастинация
    В исходном коде должно быть что-то вроде этого:
    @vite(['resources/css/app.css', 'resources/js/app.js'])

    А уже дальше, в зависимости от контекста окружения, запущен ли dev сервер vite и тп будет то что вы написали(в самом браузере).
    Тот код что вы прислали обычно при запущенном дев сервере(тот что npm run dev).
    Если команда npm run build выполнена успешно, и код выше(тот что с @vite) в основном layout присутствует, то вам не о чем беспокоится. Для проверки остановите дев сервер и проверьте код в браузере, он должен изменить пути в соответствии с настройками, обычно подставляя хост из .env переменной APP_URL и у вас будет нечто вроде(на локальной машине с APP_URL=http://localhost )
    <!-- Scripts -->
    <link rel="preload" as="style" href="http://localhost/build/assets/app.2c8c25ff.css" />
    <link rel="modulepreload" href="http://localhost/build/assets/app.d7d1b58b.js" />
    <link rel="stylesheet" href="http://localhost/build/assets/app.2c8c25ff.css" />
    <script type="module" src="http://localhost/build/assets/app.d7d1b58b.js"></script>
    <!-- Styles -->

    На сервере или в другом окружении с другим значением APP_URL вместо http://localhost будет иное значение.
    Ну и о дополнительной и особой настройке можно почитать в официальной документации.
    Ответ написан
    Комментировать
  • Как перевести пиксели в REM?

    neuotq
    @neuotq
    Прокрастинация
    Есть плагин https://plugins.jetbrains.com/plugin/11187-px2rem , но лучше наверное styleint и для него плагин https://github.com/a-tokyo/stylelint-rem-over-px который и чекает на пиксели и автоисправляет.

    А и забыл конечно вариант в целом забить и с помощью postCSS и плагина исправлять уже на продакшн коде.
    Ответ написан
    Комментировать
  • Как остановить обратный отсчет?

    neuotq
    @neuotq
    Прокрастинация
    countdown возвращает объект с разными свойствами в тч со свойством value, которое при случае когда дата "от" больше даты "до" будет отрицательным. Значит нужно добавить проверку на это значение.

    Примерно так:

    const standart = moment().tz("Europe/Moscow");  
    const nowDay = moment(standart, 'YYYY-MM-DD HH:mm');
      
    const eventDay = moment('2023-05-21 02:05', 'YYYY-MM-DD HH:mm'); 
    
    
    const countDown = () => {     
      const timers = moment(nowDay, 'YYYY-MM-DD HH:mm')
        .countdown(eventDay, "YYYY-MM-DD HH:mm");
      console.log(timers.value)
      if(interval && timers.value <= 0) {
            clearInterval(interval)
       }
          console.log(timers.toString())
       }
    
    const interval = setInterval(countDown, 1000);


    Под себя адаптируйте этот код. Ну и конечно от momentjs и компашки нужно избавиться, но это уже отдельная легаси история.
    Ответ написан
    Комментировать
  • Не работает slick слайдер после того, как отображаю слайды с помощью JS с подгрузкой json данных?

    neuotq
    @neuotq
    Прокрастинация
    А где и как инициализируется сам слик?
    Возможно вы забыли после обновления html его заново инициализировать, чтобы он узнал об изменениях.
    Отдельно отмечу что в Slick есть функции динамического добавления слайдов программно. Может быть вам такой способ больше подойдёт?
    Ответ написан
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    neuotq
    @neuotq
    Прокрастинация
    Вас проверяли на знание того, как передаются переменные в функция в php. Переменные передаются всегда по значению, те передаёте переменную в функцию, туда копируется в новую переменную значение оригинальной.

    С помощью амперсанда & мы можем заставить передавать ссылку на эту же переменную в памяти. И тогда манипуляции с ней внутри функции будут равны манипуляциям вне.

    С объектами не большая путаница происходит, но только из-за того что многие не думают/забывают что хранится в переменной когда создаётся объект. При создании объекта в саму переменную помещается его идентификатор, по которому php и обращается к этому объекту.
    Ну и соответственно при передаче такой переменной в функцию, мы копируем этот идентификатор в новую переменную. Переменная уже другая, независимая от той что была, но идентификатор объекта тот же. Поэтому манипуляции с объектом в функции(обращение к свойствам/методам) отразятся на объекте с этим идентификатором. И со стороны выглядит словно переменная с объектом всегда передаётся по ссылке(словно стоит амперсанд), но это не так. Например внутри функции вы перезапишете переменную(к примеру присвоите null) то оригинальная переменная с объектом не поменяется.

    А вот есть если передать её по ссылке, те с амперсандом, то внутри функции будет переменная со ссылкой на переменную вне, и поэтому не только манипуляции с объектом, но и перетирание переменной в целом повлияет.

    class A {
        public $foo = 1;
    }
    
    //создали переменную
    //в ней хранится id объекта, сам объект где-то в памяти оптимизированно лежит
    $newObj = new A;
    
    //Вывод 1
    echo $newObj->foo;
    
    function foo($obj) {
    	//в obj скопирован id объекта
    	//тк он тот же, то меняется и оригинальный объект
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//на внешнюю не повлияло
    	$obj = null;
    	
    }
    
    foo($newObj);
    // получили 2
    echo $newObj->foo;
    
    
    function bar(&$obj) {
    	//obj ссылается на тоже место в памяти, что и внешняя переменная с id объета
    	//тк он тот же, то меняется и оригинальный объект (тут логично, тк по ссылке)
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//внешняя тоже перетрётся
    	$obj = null;
    }
    
    
    bar($newObj);
    //ошибка предупреждение, нельзя читать свойства на null
    echo $newObj->foo;


    Ну и зная всё это, вы можете написать свою простую функцию, по типа прегматча.
    function mySum($a, $b, &$result) {
    	$result = $a + $b;
    }
    //первые два параметра по значению, в третий передаём переменную
    //она тут же инициализируется (как если бы её до этого написать просто $res;)
    // и передаётся её ссылка внутрь функции
    mySum(1,2, $res);
    
    //3
    echo $res;
    Ответ написан
    Комментировать
  • Как сделать анимацию курсора под текстом?

    neuotq
    @neuotq
    Прокрастинация
    У вас другие слои перехватывают события poiner-events, поэтому конвас как бы не видит их.
    Для этого, например, можно для main__section отключить : pointer-events: none;, а потом для нужных элементов включать, в данном случае для canvasFluid: pointer-events: all;

    PS и помним что такой эффект крайне ресурсоемкий, советую протестировать на "слабых" устройствах, на многих будет МНОГО меньше 60 fps, да даже меньше 10.
    Ответ написан
    4 комментария
  • Как выделить селектор?

    neuotq
    @neuotq
    Прокрастинация
    Пффф, легко.
    Берём вычисляем свгешку, и родитель родителя.
    Да не супер надёжно, но работает) Можно ещё доработать специфичность.
    document.querySelector('[d="M5.293 8.293a1 1 0 0 1 1.414 0L12 13.586l5.293-5.293a1 1 0 1 1 1.414 1.414l-6 6a1 1 0 0 1-1.414 0l-6-6a1 1 0 0 1 0-1.414Z"]').parentElement.parentElement;
    Ответ написан
  • Как выводить несколько значений подряд при клике?

    neuotq
    @neuotq
    Прокрастинация
    Ваш код грязный конечно, даже стили немного.
    Вот я тоже набросал грязное решение. Вам я бы рекомендовал немного переверстать, но в целом(обратите внимание я добавил pointer-events none на .types-select__option-text в css на кодпене это видно)
    Саму идею я думаю вы поймёте и под себя переделаете. Ниже код и кодпен.

    //Данные по содержанию меню
    const furnTypes = [
      {
        'id' : 1,
        'title' : 'Офисная&nbsp;<span>меб</span>ель'
      },
      {
        'id' : 2,
        'title' : 'Техника / сантехника'
      },
      {
        'id' : 3,
        'title' : 'Сборка кухни'
      },
    ];
    
    //Каждое активно может быть только один раз
    const activeMenuItems =   new Set();
    
    const clickHandler = e => {
      if(activeMenuItems.add(parseInt(e.target.getAttribute("furn-id"))) ) {
        //Если поменялся перестроим меню
        updateActiveMenuItems(activeMenuItems);
      }  
    };
    
    //Строим меню на основе данных items, вставляем в target
    //на элементы вешаем событие clickHandler
    buildSelectMenu = (target, items, clickHandler) => 
    {
      //создаем родителя
      const parentUl = document.createElement("ul");
      parentUl.classList.add('types-select__options');
      //Каждый из пунктов
      items.forEach(
        item => {
          const childLi = document.createElement("li");
          childLi.classList.add('types-select__option');
          childLi.setAttribute('furn-id', item['id']);
          childLi.addEventListener("click",clickHandler);
          const childTextBlock = document.createElement("div");
          childTextBlock.classList.add('types-select__option-text');
          // Лучше потом на setHtml заменить, но пока нет поддержки
          childTextBlock.innerHTML = item['title'];
          childLi.appendChild(childTextBlock);
          parentUl.appendChild(childLi);
        }
      )
      //Запихиваем туда куда нужно
      target.appendChild(parentUl);  
      return parentUl; 
    }
    
    const updateActiveMenuItems = ids => {
      
      const parent = document.querySelector('.types-select__active-items');
      parent.innerHTML = '';
      ids.forEach( id => {
        const curItem = furnTypes.find( el => el['id'] === id)
        const activeMenuItemEl = document.createElement("div");
        const activeMenuItemTitleEl = document.createElement("span");
        activeMenuItemTitleEl.innerHTML = curItem['title'];
        const activeMenuItemdeleteButtonEl = document.createElement("button");
        //Лучше через текстовую ноду
        activeMenuItemdeleteButtonEl.innerHTML = 'x';
        activeMenuItemdeleteButtonEl.setAttribute('active-furn-id', curItem['id']);
        
        activeMenuItemdeleteButtonEl.addEventListener("click", e => {
          //Чтобы кликалась не взирая на клик событие родителя
          if(e && e.stopPropagation) e.stopPropagation();
          
          if(activeMenuItems.delete(parseInt(e.target.getAttribute("active-furn-id"))) ) {
            //Если поменялся перестроим меню
             updateActiveMenuItems(activeMenuItems);
          } 
        }); 
        
        activeMenuItemEl.appendChild(activeMenuItemTitleEl);
        activeMenuItemEl.appendChild(activeMenuItemdeleteButtonEl);
        parent.appendChild(activeMenuItemEl);
        
      })
      
    }
    
    // Строим меню
    const furnitureMenu = buildSelectMenu(
      document.querySelector('#furnitureMenu'), 
      furnTypes, 
      clickHandler
    );
    
    document.querySelector('.types-select__btn')
      .addEventListener("click", e => {
        // Странное имя класса, наверное должн быть types-select__menu_active
        document.querySelector('.types-select__menu').classList.toggle("_active");
    } )


    Ответ написан
    1 комментарий
  • Почему не удается получить доступ к смещению типа string в строке?

    neuotq
    @neuotq
    Прокрастинация
    Сама ошибка вполне однозначная, вы обращаетесь к строке по индексу.
    У вас в коде в строке 30:
    $aUnit[$server['unit']][$server['game']]
    Но выше мы видим что
    $aUnit[$unit['id']] = '';
    Ну так делать нельзя. В PHP 7* на этот счёт были предупреждения, видимо вы их игнорировали.
    Ответ написан
    5 комментариев
  • Как задать следующий вопрос chatGPT по API?

    neuotq
    @neuotq
    Прокрастинация
    Контекст вы должны сохранять, а передавать в следующем запросе через роли.
    Простое объяснение тут, пример оттуда:

    completion = openai.ChatCompletion.create(
      model="gpt-3.5-turbo", 
      messages = [
    # system - системная базовая роль, грубо говоря это сама база "Я" gpt
    {"role": "system", "content" : "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-02"},
    # user - роль юзера кто задаёт вопросы
    {"role": "user", "content" : "How are you?"},
    # Асистент одна из ролей, можно задать ранее в запросе, типа Act as bla blah
    # либо он поймёт что должен быть именно ассистентом смотрите оп ответу в API
    {"role": "assistant", "content" : "I am doing well"},
    # Снова юзер
    {"role": "user", "content" : "How long does light take to travel from the sun to the eart?"}]
    )


    Ну и примерно так строишь цепочку. Ну и да, ресурсо(читай денежно) пожирающе, а что делать. Значит приносить $$ должно больше чем тратится.
    Ответ написан
    Комментировать
  • Как сохранить строку в JS в Windows1251 ANSI?

    neuotq
    @neuotq
    Прокрастинация
    Привет друг.
    Лучше пользоваться любезно представленным для нас Encoding API

    //Создаем энкодер, который нам сделает ArrayBuffer в utf8
    //Без параметра будет кодировка UTF8
    const encoderUTF8 = new TextEncoder();
    //Закодируем строку
    const arrayUTF8 = encoderUTF8.encode("Привет!");
    //Теперь создадим декодер в cp1251, список кодировок и их метки здесь 
    // https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings
    let encToCP1251 = new TextDecoder('cp1251');
    //Получаем строку в нужной кодировке
    const strCP1251 = encToCP1251.decode(arrayUTF8);
    
    
    //Генерируем URL
    const url = URL.createObjectURL(
      //Создаем файл
      new File([strCP1251], "foo.txt", {
      type: "text/plain",})
    );
    
    //Создаём ссылку
    let aElement = document.createElement('a');
    aElement.href = url;
    aElement.download = 'filenameCP1251.txt';
    aElement.textContent = 'Скачай меня полностью!';
    document.body.appendChild(aElement);


    Живая демка

    Ответ написан
  • Почему у некоторых людей не работает сайт при переходе из инстаграм?

    neuotq
    @neuotq
    Прокрастинация
    Я бы смотрел в сторону VPN которые используют люди.
    Cloudflare будет грузиться и показывать хоть что-то, даже есть доступ к ресурсу запрещен.
    Поэтому остаются сетевые проблемы и задержки/таймауты из лагов VPN. У народа часто фигня разная стоит.
    Поэтому этот пресловутый белый экран как раз таки и показывает проблемы с отправкой/получением данных. Бразуер(не важно встроенный или нет) будет в таких случаях частенько висеть.
    Попробуйте несколько дней потестить с включенными бесплатными разными VPN из топа Маркета/Апстора. Проследить статистику. Особенно полезно это сделать на мобильном интернете среднего качества с просадками, а не на стабильном wifi
    Ответ написан
    Комментировать
  • Почему нет(?) популярного REST API для IMAP?

    neuotq
    @neuotq
    Прокрастинация
    Как верно выше сказали вы путаете протокол и сервисы/серверы.
    IMAP - это протокол(прикладного уровня, почитайте про модель OSI), те некое соглашение чтобы всё по сети работало одинаково везде и всегда.
    REST API - это совсем другое, работает внутри другого протокола HTTP.
    Поэтому вам нужно искать не API к IMAP, а сервер IMAP в котором есть нужные API. Такие есть, гуглить нечто вроде
    "imap server with rest api"
    И там уже сами разработчики серверов реализовывают разные штуки, от управление аккаунтами, до манипуляция с самыми почтовыми ящиками и почтой.
    Ответ написан
    2 комментария
  • Есть ли у этого название?

    neuotq
    @neuotq
    Прокрастинация
    Это называется деление с остатком, берёте целую часть - неполное частное.
    Реализуется либо через специальные операторы в языке(в некоторых есть сразу целочисленное деление), либо округлением вниз.
    Ответ написан
    Комментировать