• Как выделять данные в столбце таблицы различными цветами?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Определить классы для выделения текста:

    .waiting { background: yellow; }
    .working { background: green; }
    .completed { background: blue; }

    Определить, какому тексту какой класс соответствует:

    const highlight = {
      'Ожидание': 'waiting',
      'Работа': 'working',
      'Завершено': 'completed',
    };

    Дальше остаётся эти классы назначить кому надо.

    Класс получает элемент внутри ячейки:

    <el-table-column label="Процесс">
      <template #default="{ row: { process } }">
        <span :class="highlight[process]">{{ process }}</span>
      </template>
    </el-table-column>

    Или, класс получает сама ячейка таблицы:

    const cellClassName = ({ column, row }) =>
      column.property === 'process'
        ? (highlight[row.process] ?? '')
        : '';

    <el-table
      :cell-class-name="cellClassName"
      ...
    >
    Ответ написан
  • Как изменить иконку календаря по умолчанию у date picker element plus?

    0xD34F
    @0xD34F Куратор тега Vue.js
    prefix-icon="calendar-icon"

    Да ну? В документации говорится, что это должна быть не строка, а компонент. Давайте будем делать, как сказано.

    UPD. Документацию с первого раза полностью прочитать не осилил, как подсказывают в комментариях - строку указывать всё-таки можно. Окей, вот строка с именем компонента.
    Ответ написан
  • Как добавить иконку в Select ElementPlus?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Разберитесь с версией vue, для которой смотрите примеры кода.

    - <template slot="prefix">
    + <template #prefix>
    Ответ написан
    Комментировать
  • Как реализовать подобный паттерн на CSS?

    0xD34F
    @0xD34F Куратор тега CSS
    Ответ написан
    Комментировать
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    0xD34F
    @0xD34F
    function combine($ids, $keys, ...$values) {
      return array_combine(
        $ids,
        array_map(
          fn($i) => array_combine($keys, array_column($values, $i)),
          array_keys($ids)
        )
      );
    }
    
    
    $result = combine($input, $params, $array1, $array2);
    Ответ написан
    2 комментария
  • Как изменять цвет текста в progress bar'е?

    0xD34F
    @0xD34F Куратор тега CSS
    Ответ написан
    Комментировать
  • Как перевести дату в строке в формат UNIX?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function parseDate(str) {
      const months = Array.from(
        { length: 12 },
        (_, i) => new Date(0, i).toLocaleString('ru-RU', { month: 'long' })
      );
    
      const [ , month, day, year, hour, minute ] = str.match(/(\S+) (\d+), (\d+) (\d+):(\d+)/);
    
      return +new Date(
        year,
        months.indexOf(month.toLowerCase()),
        day,
        hour,
        minute
      );
    }
    Ответ написан
    1 комментарий
  • Как отрендерить календарь, чтобы числа дней выводились в соответствии с днями недели?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Отдельные циклы для чисел за текущий и предыдущий месяцы (кстати, а где у вас следующий?) не нужны. Чтобы получить число, надо не на счётчик цикла смотреть, а на дату - начальным значением будет первое число месяца минус количество дней, прошедших с последнего понедельника. Цикл крутить надо не до конца месяца, а немного дальше - чтобы общее количество чисел было кратно семи (т.е., чтобы в последней неделе не было отсутствующих дней) и всегда одно и то же (чтобы размер календаря не зависел от отображаемого месяца). Вот так.
    Ответ написан
    Комментировать
  • Как в react выделить все чекбоксы?

    0xD34F
    @0xD34F Куратор тега React
    const Checkbox = forwardRef(({ label, ...props }, ref) =>
      <label>
        <input type="checkbox" ref={ref} {...props} />
        {label}
      </label>
    );
    
    function CheckboxGroup({
      items,
      label = item => item,
      selected,
      setSelected,
    }) {
      const onChange = ({ target: { checked, dataset: { index } } }) =>
        setSelected(selected => checked
          ? [ ...selected, items[index] ]
          : selected.filter(n => n !== items[index])
        );
    
      const allSelectedRef = useRef();
      const onAllSelectedChange = ({ target: { checked } }) =>
        setSelected(checked ? [...items] : []);
    
      useEffect(() => {
        const isAllSelected = items.length === selected.length;
        allSelectedRef.current.checked = isAllSelected;
        allSelectedRef.current.indeterminate = !isAllSelected && !!selected.length;
      }, [ selected ]);
    
      return (
        <div className="checkbox-group">
          <Checkbox
            label="SELECT ALL"
            defaultChecked={false}
            onChange={onAllSelectedChange}
            ref={allSelectedRef}
          />
          {items.map((n, i) => (
            <Checkbox
              label={label(n)}
              data-index={i}
              checked={selected.includes(n)}
              onChange={onChange}
            />
          ))}
        </div>
      );
    }

    https://jsfiddle.net/kj9wet6L/
    Ответ написан
    Комментировать
  • Как сделать такой фильтр опций на js или jq?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собираем селектор на основе состояния чекбоксов (выставлен - класс должен присутствовать, не выставлен - помещаем класс внутрь :not), проверяем фильтруемые элементы на соответствие селектору:

    document.querySelector('.options').addEventListener('change', e => {
      const [ not, has ] = Array.prototype.reduce.call(
        e.currentTarget.querySelectorAll('input'),
        (acc, n) => (acc[+n.checked].push(`.${n.value}`), acc),
        [ [], [] ]
      );
    
      const selector = `${has.join('')}:not(${not.join(',')})`;
    
      for (const n of document.querySelector('.box').children) {
        n.classList.toggle('hidden', !n.matches(selector));
      }
    });

    Или, при обработке элемента перебираем чекбоксы и проверяем, что их состояния соответствуют наличию классов:

    const checkboxes = [...document.querySelectorAll('.options input')];
    const items = [...document.querySelector('.box').children];
    
    checkboxes.forEach(n => n.addEventListener('change', onChange));
    
    function onChange() {
      items.forEach(({ classList: cl }) => {
        cl.toggle('hidden', checkboxes.some(n => n.checked !== cl.contains(n.value)));
      });
    }
    Ответ написан
  • Как добавить/ удалить класс каждые 3 секунды в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    const blocks = ref(Array.from({ length: 5 }, (_, i) => (-~i) ** 2));
    const active = ref(0);
    
    function next() {
      active.value = (active.value + 1 + blocks.value.length) % blocks.value.length;
    }
    
    let intervalId = null;
    onMounted(() => intervalId = setInterval(next, 500));
    onUnmounted(() => clearInterval(intervalId));

    <div
      v-for="(n, i) in blocks"
      v-text="n"
      :class="[ 'box-item', { active: i === active } ]"
    ></div>

    Конечно, зашивать в стили цвета блоков и их количество - все эти :nth-child - не круто. Лучше сделать компонент, принимающий массив цветов и создающий блоки на его основе. Соответственно, вместо класса будет назначаться цвет фона напрямую, как-то так:

    <div
      v-for="(n, i) in colors"
      :style="{ backgroundColor: i === active ? n : '' }"
      ...
    Ответ написан
    2 комментария
  • Как осуществлять фильтрацию по нескольким свойствам?

    0xD34F
    @0xD34F Куратор тега React
    Вместо общего массива выбранных значений сделать отдельные для каждого из свойств.

    Чтобы не дублировались чекбоксы, создавать их на основе уникализированных массивов значений свойства вместо массива данных.

    Чтобы поменьше копипастить, оформить чекбоксы в отдельный компонент - принимает массив доступных значений, массив выбранных значений, функцию установки выбранных значений.

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

    https://jsfiddle.net/bqyxa0kL/
    Ответ написан
    Комментировать
  • Как убрать фокус с компонента DateTimePicker при нажатии на ok?

    0xD34F
    @0xD34F Куратор тега Vue.js
    function onVisibleChange(state) {
      if (!state) {
        document.activeElement.blur();
      }
    }

    <el-date-picker
      @visible-change="onVisibleChange"
      ...
    Ответ написан
    Комментировать
  • Почему не обновляется пропс?

    0xD34F
    @0xD34F Куратор тега Vue.js
    почему при изменении даты передаваемой в пропс не обновляется значение в самом компоненте таймера?

    Встречный вопрос - почему вы решили, что внутреннее состояние компонента обновляться должно? Покажите, где вы обновляете targetDate при изменении props.date. Нет, можете себя не утруждать - ничего такого у вас нет.

    Не надо никакого targetDate, рассчитываем дни-часы-минуты-секунды сразу на основе props.date - так при изменении props.date не придётся предпринимать никаких дополнительных телодвижений, всё посчитается как надо при следующем вызове updateCountdown. Вот как-то так.
    Ответ написан
    Комментировать
  • Как разбить многостроковый текст на массив с помощью регулярного выражения?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Понимаю что можно сделать проще с помощью split, но хочу научиться именно с помощью регулярного выражения

    Одно другому не мешает:

    str.split(/\n(?=#EXTINF)/)
    Ответ написан
    Комментировать
  • Как кликать на вложенные элементы так, чтобы не кликался родительский элемент?

    0xD34F
    @0xD34F Куратор тега JavaScript
    .dropdown.show {
      display: block;
    }

    const accordionItemSelector = '.data-accordion--summary-container';
    const contentSelector = '.dropdown';
    const activeClass = 'show';
    
    document.body.addEventListener('click', ({ target: t }) => {
      if (t.matches(accordionItemSelector)) {
        document.querySelectorAll(contentSelector).forEach(n => {
          if (!n.contains(t) && !t.contains(n)) {
            n.classList.remove(activeClass);
          };
        });
    
        t.querySelector(contentSelector).classList.toggle(activeClass);
      }
    });
    Ответ написан
    Комментировать
  • Как из query string получить объект следующего вида?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Просто исправить существующий код:

    - acc[key] = [value];
    + (acc[key] ??= []).push(value);

    Но можно его ещё и сократить:

    const convertQueryStringToObject = str => Array
      .from(new URLSearchParams(str))
      .reduce((acc, n) => ((acc[n[0]] ??= []).push(n[1]), acc), {});

    Или неоправданно усложнить и изуродовать:

    const convertQueryStringToObject = str => Array
      .from(str.matchAll(/([^&]+)=([^&]+)/g))
      .reduce((acc, [ , k, v ]) => (
        Object.hasOwn(acc, k) || (acc[k] = []),
        acc[k][acc[k].length] = v,
        acc
      ), {});
    Ответ написан
    1 комментарий
  • Как убрать scroll у body при открытии модальных окон через vue watch?

    0xD34F
    @0xD34F Куратор тега Vue.js
    .no-overflow {
      overflow: hidden;
    }

    mounted() {
      this.$watch(
        () => this.isModalAddVisible || this.activeId,
        val => document.body.classList.toggle('no-overflow', val),
        { immediate: true }
      );
    },

    Одно непонятно - зачем отслеживать несколько разных свойств, если наличием скролла может управлять само модальное окно? Открылось - убирает скролл, закрылось - возвращает. Разные окна для разных задача? - сделайте общий компонент, а разницу для конкретных экземпляров определяйте через слоты.
    Ответ написан
    Комментировать
  • Как переместить элемент в блоке вверх по клику?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Данные слайдов сложить в массив. Сделать вычисляемое свойство - данные всех слайдов кроме верхнего. Создать верхний слайд, создать остальные слайды на основе вычисляемого свойства. Если нужна анимация перемещения, завернуть слайды в transition-group. Вот так всё просто.
    Ответ написан
    1 комментарий
  • Как динамически добавлять текстовые поля в форму редактирования строки таблицы с использованием Quasar?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложить имена основных полей в массив.

    Сделать вычисляемое свойство, представляющее имена дополнительных полей - надо получить список ключей editedItem и выкинуть из него имена основных полей.

    В диалоговом окне сделать v-for по массиву дополнительных полей.

    Всё.
    Ответ написан
    Комментировать