Показаны сообщения с ярлыком SharePoint 2013. Показать все сообщения
Показаны сообщения с ярлыком SharePoint 2013. Показать все сообщения

пятница, 13 августа 2021 г.

Проверить наличие файла и требуемого расширения в элементе при сохранении.

В этой статье я расскажу, как можно проверить наличие вложений в элементе и расширение файла.

К примеру, у нас есть два вложения, и мы можем к ним обратиться с помощью jQuery

 


var attachments = jQuery("#idAttachmentsTable tbody" ).children();



Так же мы можем прочитать расширение файлов

			for(var i =0; i< attachments.length;i++){
                var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
                var extension =    fileName.match(/\.[0-9a-z]+$/i)[0];
                console.log(extension);

            }


Собираем все единое решение и добавляем в функцию PreSaveAction

 

function PreSaveAction()   
{ 
    var attachments = jQuery("#idAttachmentsTable tbody" ).children();
    if(attachments || attachments.length > 0){ 
        var excelFileExist = false;
        for(var i =0; i< attachments.length; i++){
            var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
            var extension =    fileName.match(/\.[0-9a-z]+$/i)[0];
            console.log(extension);
            if(extension == ".xls" || extension == ".xlsx"){
               excelFileExist = true;
            }
        }
        

        if(!excelFileExist){
            alert("вложите файл Excel");
            return false;
        }else{
            return true;
        }
    }else{
        alert("нужно вложить файлы");
        return false;
    }
}




этот код можно добавить в веб-часть редактор скриптов или редактор контента

четверг, 17 декабря 2020 г.

Кнопка на Ribbon (userCustomActions только с помощью JS)

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

Как основное решение для формы печати было React приложение, размещенное на страницу, а в представлении добавил кастомную кнопку на риббон которая отрывала новый таб с требуемой страницей и передавала ID выделенных элементов как параметр.


вторник, 6 октября 2020 г.

Получение всех рабочих процессов WorkFlow 2010 в tenant

 Я упустил новость о том, что WorkFlow 2010 будут отключены и только недавно увидел сообщение

Starting 11/1/2020 6:00:00 AM, SharePoint 2010 workflows will be retired and users will no longer have the ability to run or create 2010 Workflows. 


SharePoint Modernization Scanner  у меня так и не завелся.
возникала аналогичная ошибка https://github.com/pnp/sp-dev-modernization/issues/524 

тогда решил сам найти все активные WorkFlow. Так же выводится информация количестве всех элементов списка, так же созданных и измененых с 1 августа.


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.WorkflowServices.dll"


$UserName = "adm@company.com"
$Cred= Get-Credential $UserName


$SiteUrl = "https://contoso.sharepoint.com" #tenant

$array = @()  

function GetSubWebs($sWeb){    
            
    $Ctx.Load($sWeb)

    $WorkflowServicesManager = New-Object Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager($Ctx, $sWeb)
    $WorkflowSubscriptionService = $workflowServicesManager.GetWorkflowSubscriptionService()

    $allLists = $sWeb.Lists
    $Ctx.Load($allLists)
    $Ctx.ExecuteQuery()

    $webUrl = $sWeb.Url

    foreach($list in $allLists){
        $list.Title               
       
        $listTitle = $list.Title

        $List = $sWeb.Lists.GetByTitle($listTitle)
        $Ctx.Load($List)
        $WFassociation =  $List.WorkflowAssociations

        $Ctx.Load($WFassociation)
        $Ctx.ExecuteQuery() 

        $wfCount = 0
        foreach($wf in $WFassociation){
            if($wf.Enabled -eq $true){
                $wfCount++

            }
        }


        if($wfCount -gt 0){
            $wfCount

            $allItemCount = $List.ItemCount
            $camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();  
            $camlQuery.ViewXml = "2020-07-31T14:48:24Z"

            $addItems = $List.GetItems($camlQuery)
                    

            $camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();  
            $camlQuery.ViewXml =  "2020-07-31T14:48:24Z"

            $modyItems = $List.GetItems($camlQuery)                    

                   
            $Ctx.Load($addItems )
            $Ctx.Load($modyItems )


            $Ctx.ExecuteQuery()
                 
            $modyItemsCount = $modyItems.Count
            $addItemsCount = $addItems.Count

            $object = New-Object PSObject

            $object | Add-Member -Name 'Title' -MemberType Noteproperty -Value $listTitle
            $object | Add-Member -Name 'All Items' -MemberType Noteproperty -Value $allItemCount
            $object | Add-Member -Name 'Add Items' -MemberType Noteproperty -Value $addItemsCount 
            $object | Add-Member -Name 'Modified Items' -MemberType NoteProperty -Value  $modyItemsCount
            $object | Add-Member -Name 'WF Count' -MemberType NoteProperty -Value  $wfCount
            $object | Add-Member -Name 'URL' -MemberType NoteProperty -Value $webUrl

                     
            $Global:array += $object
        }
    }

    $webs= $sWeb.Webs
    $Ctx.Load($webs)
    $Ctx.ExecuteQuery()
    if($webs.Count -gt 0)
    {
        Write-Host $aWeb.Url  " - " $aWeb.Webs.Count
         
        foreach($aWeb in $webs)
        {
        
            $Ctx.Load($aWeb)
           
            GetSubWebs $aWeb 
        }
    }

    
}

$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
     

    
$Web = $Ctx.Web
$Ctx.Load($Web)
$webs= $Web.Webs
GetSubWebs($Web)

$array | Format-Table

$array | Export-Csv -NoTypeInformation -Path  C:\Temp\lists.csv  -encoding "utf8" -Delimiter ";"
На выходе таблица и можно экспортировать в csv


понедельник, 20 апреля 2020 г.

Решение проблем с Multiple lines of text с параметрами Plain text и Append Changes to Existing Text

В одном из списков в поле Многострочный текст используются настройки
"Обычный текст" и "Вносить изменения в существующий текст"

как результат - на форме редактирования история не читается.

понедельник, 23 марта 2020 г.

Вывести ID элемента на форму редактирования/просмотра


Появилась задача вывести ID элемента на форму и эту задачу можно решить несколькими способами.
1. Добавить вычисляемое поле, которое будет брать данные из поля ID.
Минус – на форме редактирования не отображается.
2. Создать поле и писать в него или с помощью РП или JS.
Можно сделать другим способом. Прибегнув к jQuery и написав немного кода.



ссылка на код

понедельник, 13 января 2020 г.

вторник, 24 декабря 2019 г.

Свои цвета в календаре.


Как возможно вы уже знаете, календари (представления календарей) можно объединять в один и разные календари выделить цветом. Но цветов не много и свои указать нет возможности.

пятница, 31 мая 2019 г.

Копирование верхней навигационной панели между коллекциями с помощью PowerShell. SharePoint 2013, 2016


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

среда, 28 ноября 2018 г.

Заполнение текущего пользователя в PeoplePicker

В этой статье я расскажу, как можно заполнять текущего пользователя в поле PeoplePicker
Для этого нам понадобятся две функции:
1. Получает текущего пользователя
2. Меняет значение в поле PeoplePicker

конечный резульрат

понедельник, 27 ноября 2017 г.

Отображение Ribbon для конкретного пользователя

Рассмотрим задачу, когда нужно скрыть риббон и верхнюю панель.
это сделать не так сложно, нужно добавить всего пару строчек CSS
#suiteBarDelta{
  display: none;
}
#s4-ribbonrow{
     display: none;
}


Но возникает проблема, ведь часть кнопок скрыта и администрировать становится не возможным. Конечно можно открыть панель разработчика в браузере и отобразить требуемы контент, но при частой работе с риббоном это не удобно.

вторник, 10 октября 2017 г.

Как получить значение поля в DispForm

Некоторое время назад появилась задача произвести манипуляции с полем (скрыть/показать) на форме просмотра.
Можно пойти по пути обращения к полю по его названию, но мне этот вариант не нравиться.

среда, 27 сентября 2017 г.

Заполнение пользователя в поле, если форма изменена в дизайнере

Допустим  мы изменили форму через дизайнер и у нас есть задача указать поле "Пользователь или группа" определенного пользователя.
мы можем это сделать прибегнув к jQuery


jQuery("table.ms-usereditor").find("div").text("user login");
jQuery("table.ms-usereditor").find("td:eq(2)").children().eq(0).click();




данное решение будет работать если в форме поле выбора пользователя только одно.

четверг, 7 сентября 2017 г.

Всплывающие подсказки - callout

В этой статье я расскажу, как можно добавить Callout (popover от MS).

Я не буду в даваться в детали, т.к. примеров в инете достаточно, а покажу как можно сделать универсальное решение.

пятница, 4 августа 2017 г.

Утверждение задач WorkFlow через PowerShell

В этой статье я расскажу, как можно массово через PowerShell утвердить задачи РП созданные через рабочий процесс "Утверждение"

и так нам понадобится 

U2U Caml Query Builder  

с помощью которого мы формируем CAML
полученный CAML вставляем в скрипт

$web = Get-SPWeb http://portal/sites/Doct
$List = $web.Lists["Задачи"]

$Query = New-Object Microsoft.SharePoint.SPQuery;
$Query.Folder = $List.RootFolder;
$camlQuery =   "9"
$camlQuery
$Query.Query = $camlQuery;
$Query.RowLimit = 100;
$List.GetItems($Query)  |  foreach-object {

    $item = $_
    write-host $item.Name $item.Id  
    $item['WorkflowOutcome']='Утверждено'
    $item['ExtendedProperties'] = $item['ExtendedProperties'] + "ows_TaskStatus='Утверждено' ows_FieldName_Comments=''"         
    $item['PercentComplete']= 1
    $item['Completed']=1
    $item['Status']= 'Завершена'
    $item.Update()

}
$web.Dispose()


понедельник, 5 июня 2017 г.

Опрос с картинками (Sharepoint Survey Image Question)

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


И пришлось прибегнуть к кастомизации страницы с помощью jQuery. Так же для зумирования изображения была использована библиотека ImageViewer.

вторник, 18 апреля 2017 г.

Итоги (суммирование) для вычисляемого поля в представлении.

В этой статье я расскажу как можно вывести итоги для вычисляемого поля.
по умолчанию SharePoint не предоставляет возможности вывести сумму по Calculated field, но мы можем это исправить и изменить шаблон рендера представления CSR и самостоятельно посчитать сумму.

вторник, 28 марта 2017 г.

ValidateCredentialClaims - Access Denied: Claims stored in the credentials did not match with the group claim for a group app.

Сегодня планировал настроить синхронизацию внешнего списка с «Настраиваемым списком» SharePoint по средствам PowerShell, но столкнулся с ошибкой 

The shim execution failed unexpectedly - Access is denied to the Secure Store Service 



В ULS нашел:
ValidateCredentialClaims - Access Denied: Claims stored in the credentials did not match with the group claim for a group app.

пятница, 27 января 2017 г.

Проверка выбранного значение в PeoplePicker при сохранении элемента

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


среда, 11 января 2017 г.

Копирование и применение мастер страницы на все сайты веб приложения.

replacement master page across all sites Web application copying master
Думаю, что многие сталкивались с задачей замены мастер страницы в большом количестве сайтов. В моем случае это было порядка 30 коллекций в которых есть под сайты. Если менять страницу руками, то это будет занимать продолжительное время. Поэтому мне было проще написать скрип, который все сделает сам.

понедельник, 28 ноября 2016 г.

EventID 4965 Не удалось инициализировать некоторые свойства сайта для веб-сайта по адресу

Пару недель назад, на одном из серверов, произошёл сбой. В целом проблему решили, но была замечена ошибка. На одном подсайте пропали меню в левой навигационной панели и сайт провал из верхней навигационной панели.
При обращении в меню «Навигация» в настройках сайта была ошибка доступа. Пробовал и из под SPfarm, но доступа не было. В even’ах было замечена ошибка: