Как правильно установить максимальную высоту в Kendo Scheduler?

Мне интересно, есть ли у кого-нибудь идея о том, как добиться следующего поведения с помощью планировщика кендо:

Я хочу, чтобы высота планировщика была высотой его содержимого, ПОКА он не достигнет высоты браузера (которую я уже рассчитал), а затем сделайте это насколько это возможно и станет прокручиваемым.

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

Я добился этого, установив максимальную высоту моего, которую я инициализирую как планировщик, на высоту браузера. Единственная проблема с этим заключается в том, что он делает весь планировщик прокручиваемым (включая заголовок с инструментами навигации по дате, чего я не хочу). Я хочу, чтобы содержимое под заголовком можно было прокручивать.


person Tyler Dahle    schedule 02.11.2017    source источник


Ответы (1)


Загляните в ДОМ. Вы заметите, что содержимое планировщика отображается внутри <table>, отделенного от заголовка.

Технически, вы можете обернуть <div> вокруг таблицы виджета и установить его CSS-свойство height или max-height на желаемую высоту, а overflow-y на scroll или auto. Таким образом, вы могли бы достичь того, что вы хотите.

Взгляните на следующий фрагмент кода. Это должно сделать трюк:

$("#scheduler > table.k-scheduler-layout").wrap("<div style='max-height: 200px; overflow-y: auto;'></div>")

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

ОБНОВЛЕНИЕ: во время процесса рендеринга при переходе к другому представлению кендо удаляет старый table, чтобы отрендерить новый - очевидно - используя ту же процедуру, что и раньше. Остается пустой <div>, который мы создали выше, и новый table, оба непосредственно под родительским узлом виджетов $("#scheduler"). Это означает, что приведенный выше код должен выполняться после привязки данных сетки. Вы можете использовать событие dataBound для этой цели. Документы: https://docs.telerik.com/kendo-ui/api/javascript/ui/scheduler#events-dataBound)

Обновленный фрагмент кода, показывающий, как может выглядеть метод события:

  function scheduler_DataBound() {
    $("#scheduler > .scheduler-content-wrapper").remove();//Reset the DOM after changing page
    $("#scheduler > table.k-scheduler-layout").wrap("<div class='scheduler-content-wrapper' style='max-height: 200px; overflow-y: auto;'></div>");
    $("#scheduler .k-scheduler-content").css("overflow-x", "hidden");//Fix horizontal scrollbar
  }

ОБНОВЛЕНИЕ 2: я обнаружил, что сетка рухнет в случае, если событие dataBound будет запущено после изменения размера страницы или открытия всплывающего окна редактора. Моей первой мыслью было, что dataBound — неподходящее место для изменения размера сетки. После попытки запустить код через событие navigate, что, как мне кажется, должно быть в нужном месте, я обнаружил, что единственный способ заставить его работать — окружить код setTimeout(function(){ /* code... */ }). Хотя это работает, отложенный рендеринг в браузере выглядит ужасно. Наконец, я изменил код, чтобы установить флаг всякий раз, когда сетка должна быть изменена после dataBound. Конечно, неудобно раскидывать столько кода только для того, чтобы изменить размер виджета. Но с моей текущей точки зрения это единственное приемлемое решение, если пользовательский опыт имеет значение.

<script>
  var resizeScheduler = true;
  function scheduler_DataBound() {
    if (!resizeScheduler) {//Prevent grid crash, when event fired on page resize
      return; 
    }

    resizeScheduler = false;
    $("#scheduler > .scheduler-content-wrapper").remove();
    $("#scheduler > table.k-scheduler-layout").wrap("<div class='scheduler-content-wrapper' style='max-height: 200px; overflow-y: auto;'></div>");
    $("#scheduler .k-scheduler-content").css("overflow-x", "hidden");//Fix horizontal scrollbar
  }
  function scheduler_Navigate() {
    resizeScheduler = true;
  }
</script>

Надеюсь, это поможет.

person Alan    schedule 20.11.2017
comment
Интересно... Я должен посмотреть, сработает ли обертывание div вокруг стола. Если вы не укажете высоту для планировщика, планировщик будет расти вместе со своим содержимым, поэтому, если бы div обернул его максимальной высотой, и это просто сработало бы, это было бы намного проще. - person Tyler Dahle; 20.11.2017
comment
Возиться с этим ... это работает, пока вы не измените что-то, переключаясь между полным днем ​​​​и рабочим временем (просто используя их демонстрацию и изменяя вещи в додзё). Похоже, что после перехода на рабочее время требуется изменение размера, но изменение размера и обновление вида не работают должным образом в Dojo, не уверен, что это их демонстрация или своего рода «взлом». - person Tyler Dahle; 20.11.2017
comment
@TylerDahle Я проверил это на своей машине. Как вы правильно заметили, макет вылетает после перехода на другую страницу. я обновлю свой ответ - person Alan; 20.11.2017
comment
В настоящее время я пересчитываю и переустанавливаю высоту каждый раз, когда планировщик изменяется, это усложняется с представлением повестки дня (потому что я скрываю и раскрываю дополнительную информацию с помощью кнопки для событий) и требует установки и проверки флагов. И делать это таким образом включает в себя многократное изменение размеров и обновление просмотра... но это может быть единственным реальным способом. Однако, если бы что-то столь простое, как вы предложили, сработало, это было бы намного проще. - person Tyler Dahle; 20.11.2017
comment
@TylerDahle Я только что обновил ответ. Посмотрите на это и дайте мне знать, помогло ли это. - person Alan; 20.11.2017
comment
Спасибо за обновление. Это хорошо работает при навигации по представлениям и датам. Единственная проблема заключается в переходе с полного рабочего дня на рабочий день. Я не думаю, что планировщик обновляется, когда вы нажимаете «Показать рабочие часы», поэтому он получает двойную полосу прокрутки, и если вы прокручиваете полностью вниз, нижняя часть становится действительно странной. К сожалению, если вы обновите представление в планировщике, оно случайным образом загрузит всю демонстрационную страницу, а не просто обновит представление планировщика. - person Tyler Dahle; 21.11.2017
comment
@TylerDahle Горизонтальная полоса прокрутки, о которой вы упомянули, появляется из-за дополнительной ширины, вызванной вертикальной полосой прокрутки. Установка для свойства overflow-x k-scheduler-content css-класса значения hidden должна решить проблему. Я снова обновил ответ. - person Alan; 21.11.2017