SharePoint : Как сделать иконку в библиотеке докментов кликабельной

 

Недавно наш клиент попросил сделать так, чтобы при нажатии на иконку документа (в библиотеке документов) открывался сам документ. Говорят, в старых версиях так и было. Сейчас же нажатие на иконку вызывает выбор документа для последующих операций (ставится checkbox).

Я нашел в сети несколько решений, но они все меня не устроили.

Официальный совет от Майкрософт.

https://support.microsoft.com/en-us/kb/2457975

Хм, надо менять xsl файл на сервере? У нас Office 365.

Одно из наиболее интересных решений нашлось здесь

https://spdociconlink.codeplex.com

(

Ключевой файл в решении тут :

https://spdociconlink.codeplex.com/SourceControl/latest#SPDocIconLink/SPDocIconLink/ControlTemplates/SPDocIconLink/SPDocIconLink.ascx

С помощью CSR перекрывается поле DocIcon .

)

Недостатки решения:

  1. Не показывается дополнительная иконка, которая должна показывать статус Checkin/Checkout .
  2. В случае OWA, ссылка на документ вызывает скачивание вместо того, чтобы открыть документ в редакторе.

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

    function CustomIcon(ctx, field, listItem, listSchema) {

        if (ctx.CurrentItem.FSObjType == '1') {

            var ret = [];

            ret.push(ComputedFieldWorker.DocIcon(ctx, field, listItem, listSchema));

        }

        else {

            var ret = [];

            ret.push("<a href=\"" + ctx.CurrentItem.FileRef);

                ret.push("\" onmousedown=\"return VerifyHref(this,event,'");

                ret.push(listSchema.DefaultItemOpen);

                ret.push("','");

                ret.push(listItem["HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon"]);

                ret.push("','");

                ret.push(listItem["serverurl.progid"]);

                ret.push("')\" ");

            ret.push(">");

            ret.push(ComputedFieldWorker.DocIcon(ctx, field, listItem, listSchema));

            ret.push("</a>");

        }

        return ret.join('');

    }

 

    (function () {

        var overrideCtx = {};

 

        overrideCtx.Templates = {};

        overrideCtx.Templates.Fields = { 'DocIcon': { 'View': CustomIcon } };

        SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);

    })();