Календарь Развернуть все по умолчанию - PullRequest
1 голос
/ 31 августа 2010

Кто-нибудь знает, как расширить представление календаря по умолчанию? Видел много информации о том, как сделать это с SP 2007, но не с SP 2010.

Ответы [ 6 ]

2 голосов
/ 11 июня 2011

Кулдип, спасибо за этот скрипт! Я немного изменил его, чтобы развернуть все строки календаря, удалив разрыв и проверив, является ли текст привязки «свернутым». Если это не «коллапс», клик выполняется. Обратите внимание, что вам нужно всего лишь нажать на один элемент в строке. В противном случае, вы можете переключиться обратно в свернутый.

Еще один проблемный побочный эффект добавления CEWP на страницу календаря заключается в том, что вы теряете раскрывающийся список Изменить вид. Вы должны использовать ленту календаря, чтобы изменить представления.

Я также хотел бы найти более надежное решение, но вот мое слегка улучшенное решение:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("myFuncAfterLoad");

function myFuncAfterLoad() {
    var oldCalendarNotify4a = SP.UI.ApplicationPages.CalendarNotify.$4a;

    SP.UI.ApplicationPages.CalendarNotify.$4a = function () {
        oldCalendarNotify4a();
        myFuncToExpandCalendar();
    }
}

function myFuncToExpandCalendar() {
    try {
        var aTags = document.getElementsByTagName('A');
        for (i = 0; i < aTags.length; i++) {

            if ((aTags[i].evtid == "expand_collapse") && (aTags[i].innerText != "collapse")) {
                (aTags[i]).click();
            }
        }
    }
    catch (err) {
        alert(err.message);
    }
}

</script>
1 голос
/ 01 июля 2011

Два варианта для этого. Вставьте одно или другое из следующего в CEWP.

Первый из них будет переопределять функцию, которая используется для определения количества отображаемых элементов перед отображением ссылки «Развернуть / Свернуть». В приведенном ниже примере я установил его на 100, чтобы в моем случае использования я даже не видел кнопок расширения / свертывания и всегда отображал каждый элемент постоянно.

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push('WaitForCalendarToLoad');

function WaitForCalendarToLoad() 
{   
    SP.UI.ApplicationPages.SummaryItemRenderer.prototype.$2u = function () 
    {
            ULSvSp: ;
            if (!this.$1A_1) this.$1A_1 = 100;
            return this.$1A_1
        }
}
</script>

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

<script type="text/javascript">

 _spBodyOnLoadFunctionNames.push('WaitForCalendarToLoad');

function WaitForCalendarToLoad() 
{   
    var old$4a = SP.UI.ApplicationPages.CalendarNotify.$4a;

    SP.UI.ApplicationPages.CalendarNotify.$4a = function () 
    {
        old$4a();

        ctrl = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();

        if (ctrl) {
            ctrl.expandAll();
        }
    }
}
</script>
1 голос
/ 17 марта 2011

Не лучший подход, но он работает, добавьте следующий скрипт на свою страницу в CEWP или inline:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("myFuncafterLoad");

function myFuncafterLoad(){var OldCalendarNotify4a = SP.UI.ApplicationPages.CalendarNotify.$4a;SP.UI.ApplicationPages.CalendarNotify.$4a = function (){myFunctoExpandCalendar();OldCalendarNotify4a();}}

function myFunctoExpandCalendar(){try{var aTags=document.getElementsByTagName('A');for(i=0;i<aTags.length;i++){try{if(aTags[i].evtid=="expand_collapse"){aTags[i].click();break;}}catch(err){ alert('Bad Call at' + aTags[i].href);}}}catch(err){alert(err.message);}}</script>

После загрузки календаря выполняется поиск первой развернутой ссылки и имитация щелчка.

Мне пришлось использовать традиционный Javascript, поскольку я не могу инициировать щелчок, используя JQuery, потому что метод щелчка не добавляется с помощью JQuery.

Дайте мне знать, если кто-нибудь найдет лучшее решение.

0 голосов
/ 06 мая 2019

Таким образом, на основе оригинальных решений, предложенных Эндрю Пикоком (предположительно для SP2010), я смог использовать их в качестве отправной точки для составления рабочего решения для SP2016.

Кажется, большая разницачто CalendarNotify устарела в SP2016, что приводит к тому, что многие решения на основе SP2010 не работают в более новых версиях.Тогда есть дополнительные осложнения при использовании накладных календарей;Похоже, что элементы HTML для событий в перекрывающихся календарях не отображаются очень поздно в процессе загрузки страницы - даже ожидание последнего исходного сценария на странице (sp.ui.socialribbon.js) с использованием SP.SOD не заставляет себя долго ждатьдостаточно, чтобы те были доступны.Я считаю, что именно поэтому большинство, если не все решения для календарей SP2016, которые полагаются на их доступность, должны в конечном итоге использовать setTimeout () или setInterval ().В нашем случае, для второго решения, нам нужно подождать, пока все наложенные события будут отображены в календаре, прежде чем вызывать функцию expandAll () календаря, иначе это не будет работать.

С учетом сказанного, этодва SP2016-совместимых решения, которые я придумал, на основе оригинальных решений SP2010, упомянутых выше.Первый полностью удаляет ссылку «Развернуть / Свернуть» и гарантирует, что календарь всегда будет раскрываться для отображения всех событий.

Первый метод переопределяет встроенную функцию, которая устанавливает «предел элемента свертывания» (числоэлементы, которые приведут к появлению ссылки «развернуть / свернуть».

<script type="text/javascript">
    function setCalendarCollapseItemLimit() {
        // Configure the calendar's "collapse item limit" so that it always shows
        // all items by default and never collapses them.
        SP.UI.ApplicationPages.SummaryItemRenderer.prototype.$3V_1 = function() {
            ULSvSp:;
            if(!this.$1B_1) {
                // This sets the "collapse item limit" to 100 events
                this.$1B_1 = 100;
            }
            return this.$1B_1;
        }
    }

    // Call our function once the necessary script is loaded (sp.ui.applicationpages.calendar.js in this case).
    ExecuteOrDelayUntilScriptLoaded(setCalendarCollapseItemLimit, "sp.ui.applicationpages.calendar.js");
</script>

Преимущество этого метода заключается в том, что он остается развернутым, даже если новые события добавляются в календарь после загрузки страницы, безНужно вручную заново развернуть или обновить страницу.Недостатком является то, что это решение может нуждаться в обновлении после обновления, поскольку измененные имена переменных могут измениться (этот пример был подтвержден как работающий с SP2016 / 7/2017 CU - v16.0.4561.1000).

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

<script type="text/javascript">
    function expandAllCalendarItems() {
        var cal = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();
        if (cal) {
            cal.expandAll();
            return true;
        } else {
            return false;
        }
    }

    // We need to use setInterval() here so that the calendar will be expanded when it becomes available and
    // after any overlaid calendar events have been rendered. An interval of 1400 seems to be sufficient for this.
    // We store the return value so that we can clear it (stop the loop) once we’ve successfully expanded it.
    var expItemsInterval = setInterval(function() {
        var retVal = expandAllCalendarItems();
        if (retVal === true) {
            // Calendar was expanded - clear interval
            clearInterval(expItemsInterval);
        }
    }, 1400);
</script>

Я не большой поклонник этого решения, так как у него есть парабольшие минусы.Во-первых, календарь будет свернут, если к нему будет добавлено новое событие после загрузки страницы.Более важно, однако, тот факт, что мы полагаемся на то, что интервал достаточно велик, чтобы ждать отображения всех наложенных событий календаря на странице (если используются наложения календаря).Поэтому у нас здесь есть своего рода состояние гонки;интервал 1400 в моем тестировании кажется достаточным для правильной работы, но теоретически, если наложенные события отнимают слишком много времени, это решение может не сработать.Если не использовать наложенные календари, тогда это не должно быть проблемой.

Более правильное решение, вероятно, будет использовать что-то вроде MutationObserver для отслеживания новых элементов, добавляемых на страницу (в частности, div с классом.ms-acal-mdiv) и снова вызовите expandAll (), если обнаружен новый.Это также решило бы проблему повторного расширения календаря после добавления нового события.

В общем, если показывать ссылку «свернуть» пользователю не требуется, я предпочитаю первое решение.Я думаю, что он самый чистый и надежный, так как он не использует setInterval () и работает как с обычными, так и с наложенными календарями.

Большое спасибо Эндрю Пикоку за оригинальные решения здесь;это помогло мне разобраться с этим для SP2016.

* РЕДАКТИРОВАТЬ: убрал зависимость jQuery, поскольку она была ненужной, и добавил теги сценария вокруг кода.Это должно быть реализовано через SharePoint Designer, прямо под тегом PlaceHolderMain (использование SEWP или CEWP, вероятно, также будет работать, но я не тестировал эти методы).

0 голосов
/ 02 мая 2019

Я использую это (в 2013 году):

<style>
.ms-cal-nav { display:none; }
</style>

<script type="text/javascript">
  LoadSodByKey("SP.UI.ApplicationPages.Calendar.js", function () {
    window.setTimeout(ExpandCalendar, 500);
  });

  function ExpandCalendar() {
    // expand always
    $('.ms-cal-nav:has(img[src$="/expandbttn.gif"])').each(function() { this.click(); });

    window.setTimeout(ExpandCalendar, 1000);
  }
</script>

Он запускается каждую секунду, что не очень хорошо, но, кажется, делает работу

0 голосов
/ 29 января 2016
function expandCalendar() 
{
    var calendar = SP.UI.ApplicationPages.CalendarInstanceRepository.firstInstance();
    if (calendar && typeof calendar.expandAll === 'function') {
        calendar.expandAll();
    }
...