0

This is a question on how to get a hyperlink into a SharePoint table where the hyperlink has to be generated from variables containing certain parts of the link (unless there is a different or better way). My apologies if I am asking my question in an unclear or improper fashion - I am quite new to this type of integration and some of these technologies. I may have included a lot more detail than necessary.

What I am doing:

Basically what I have is a SharePoint List that contains task items (called Task Test List). This is is published to a section of the site whose link looks like this:

https://myteam.thiscompany.com/techdev/sandbox/lists/Task%20Test%20List/Task%20List2.aspx

We have created a .js file and published it to the Site Assets section. This JavaScript file also uses jQuery and a CAML query. What it does is pulls data from the Test Task List and uses it in a new task list (for testing) called SortList. This new list lives in a section called WebPart pages. The link for this site looks like this:

https://myteam.thiscompany.com/techdev/sandbox/WebPart%20Pages/Forms/AllItems.aspx

The link for the actual page (called SortList) looks like this:

https://myteam.thiscompany.com/techdev/Sandbox/WebPart%20Pages/SortList.aspx

Basically, what all this does is: using a webpart, allow us in a test segment of the SP site to take that test task list and re-sort it using drag and drop (we select any row and drag it to where we want it to be in the list and it drops right there).

The problem: On this drag and drop list (SortList), one of the columns is an Edit column. It pulls a hyperlink field from the source task list. Clicking the link allows us to edit the task item (whose data makes up the row) - it does this by using the task ID.

However that link, when clicked, is going to the webparts page, and I need it to go to the Test Task List. So for example, it goes here on click:

https://myteam.thiscompany.com/techdev/Sandbox/WebPart%20Pages/Edit

But I need it to go here:

https://myteam.thiscompany.com/techdev/Sandbox/Lists/AI%20Test%20List/Task/editifs.aspx?List=532ed23b%2D1041%2D4600%2D887f%2D58b08e1f4b9d&ID=1909&Source=https%3A%2F%2Fmyteam%2Ethiscompany%2com%2FSandbox%2FLists%2FTask%2520Test%2520List%2FTask%2520List2%2Easpx&Web=ba8a673c%2D8072%2D4a44%2Db895%2D4e1c1f962b2f

All of this from the above link is what I think I need to change:

List=532ed23b%2D1041%2D4600%2D887f%2D58b08e1f4b9d&ID=1909&Source=https%3A%2F%2Fmyteam%2Ethiscompany%2com%2FSandbox%2FLists%2FTask%2520Test%2520List%2FTask%2520List2%2Easpx&Web=ba8a673c%2D8072%2D4a44%2Db895%2D4e1c1f962b2f

In my current URL I am pointing to “Task%20List” and the correct name should be: “Task%20Test%List”.

The GUID to use for the List is “532ed23b%2D1041%2D4600%2D887f%2D58b08e1f4b9d”

As far as I can tell, the important parameters are the list= (which will need to be hardcoded so I was thinking to add a list variable in the JS file and reference that) and the ID= (which I already have).

If that is correct, I am looking for advice on how to do that because I don't know. Or if there are other methods I would be grateful to know them.

Here is the CAML query, looking at the data from the list:

function loadPrioritizedList() {
    $("#tasksUL").empty();
// TDs below have to be 3 more width than the headers 
    $().SPServices({
        operation: "GetListItems",    
        webURL: myURL,
        listName: targetListName,
        CAMLViewFields: "<ViewFields><FieldRef Name='Priority_x0020_Number' /><FieldRef Name='Edit_x0020_Link' /><FieldRef Name='Priority' /><FieldRef Name='Top_x0020_Item_x003f_' /><FieldRef Name='Purpose' /><FieldRef Name='Work_x002d_Task_x0020_Order' /><FieldRef Name='Work_x0020_Status' /><FieldRef Name='DueDate' /><FieldRef Name='Task_x0020_Type' /></ViewFields>",
        CAMLQuery: '<Query>' +
        '<OrderBy>' +
        '<FieldRef Name="Priority_x0020_Number" />' +
        '</OrderBy>' +
        '</Query>', 
        CAMLRowLimit: listrowlimit,  

And here is where I am using the data:

  CAMLRowLimit: listrowlimit,  
            completefunc: function (xData, Status) {
                $(xData.responseXML).SPFilterNode("z:row").each(function() {
                    var tdHtml = "<tr class='sortable_row' id=" + $(this).attr("ows_ID") + ">";
                    tdHtml = tdHtml + "<td style=\"width:40px;\">" + PriorityFormat($(this).attr("ows_Priority_x0020_Number"));  + "</td>";
tdHtml = tdHtml + "<td style=\"width:40px;\">" + ($(this).attr("ows_Edit_x0020_Link")).split(", ")[1] + "</td>"; 
 tdHtml = tdHtml + "<td style=\"width:46px;\">" + $(this).attr("ows_Priority") + "</td>";
tdHtml = tdHtml + "<td style=\"width:40px;\">" + TopItem($(this).attr("ows_Top_x0020_Item_x003f_")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:300px;\">" + StringChk($(this).attr("ows_Purpose")) + "</td>";
 tdHtml = tdHtml + "<td style=\"width:125px;\">" + StringChk($(this).attr("ows_Work_x002d_Task_x0020_Order")) + "</td>";    
tdHtml = tdHtml + "<td style=\"width:150px;\">" + StringChk($(this).attr("ows_Work_x0020_Status")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:100px;\">" + FormatDate($(this).attr("ows_DueDate")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:75px;\">" + StringChk($(this).attr("ows_Task_x0020_Type")) + "</td>";
 tdHtml = tdHtml + "</tr>";
                    $("#tasksUL").append(tdHtml);

The code for the link is currently:

tdHtml = tdHtml + '<td style=\"width:40px;\"><a href=\"'+($(this).attr("ows_Edit_x0020_Link")).split(", ")[1]+'\">'+ ($(this).attr("ows_Edit_x0020_Link")).split(", ")[1] +'</a></td>';

Here is what the SortList looks like: task test list

Here is the full code from the whole .js file:

<link href="../SiteAssets/jquery-ui.custom.css" rel="stylesheet" type="text/css"/>
<style type="text/css">
    #tasksUL {
        PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    }
    #tasksUL LI {
        PADDING-BOTTOM: 0.4em; MARGIN: 0px 3px 3px; PADDING-LEFT: 1.5em; PADDING-RIGHT: 0.4em; HEIGHT: 10px; FONT-SIZE: 1.4em; CURSOR: pointer; PADDING-TOP: 0.4em
    }
    #tasksUL LI SPAN {
        POSITION: absolute; MARGIN-LEFT: -1.3em
    }
    .listtable {
        font-size:10px;
        color:#333333;
        border-width: 1px;
        border-color: #729ea5;
        border-collapse: collapse !important;
        position: relative;
overflow-y:auto;
float:left !important; 
    }
    .listtable_hdr th {
        font-size:10px;
        background-color:#acc8cc;
        border-width: 1px;
        padding: 4px;
        border-style: solid;border-color: #729ea5;
        text-align:left;
    }
    .listtable tr {
        background-color:#d4e3e5;
    }
    .listtable td {
        font-size:10px;
        border-width: 1px;
        padding: 4px;
        border-style: solid;
        border-color: #729ea5;
        vertical-align:center;
border-collapse: collapse;
    }
    .listtable_hdr
    {   /* this div used as a fixed column header above the porfolio table, so we set bkgrnd color here */
        position: static;    float: left;                        
    }
</style>
<script language="javascript" src="../SiteAssets/jquery-1.8.3.min.js" type="text/javascript"></script>
<script language="javascript" src="../SiteAssets/jquery-ui-1.9.2.min.js" type="text/javascript"></script>
<script language="javascript" src="../SiteAssets/jquery.SPServices.min.js" type="text/javascript"></script>


<script language="javascript" type="text/javascript">

    //CONFIGURATION VARIABLES
    //Assumes that this list is on the same site as the WebPart
    var targetListName = "Task Test List";
    var myURL = "https://myteam.thiscompany.com/techdev/Sandbox"
    var updatecount = 100;
    var listrowlimit = 50;
    var tablewidth = 975;

    var fixHelperModified = function(e, tr) {

        var $originals = tr.children();
        var $helper = tr;

        $helper.children().each(function(index) {
            $(this).width($originals.eq(index).width())
        });
    $helper.width(tablewidth);

        $helper.css('background-color', '#d3e324');

        return $helper;
    };

    function PriorityFormat(item) {
        if (typeof item === 'undefined')
            return 0;
        else
            return parseInt(item);
    }

    function TopItem(item) {
        if (item == "1")
            return "Yes";
        else 
            return "No";
    }

    function StringChk(item) {
        if (typeof item === 'undefined')
            return "&nbsp;";
        else
            return item;
    }

    function FormatDate(item) {
        if (typeof item === 'undefined')
            return "&nbsp;";
        else {
            var d = $.datepicker.parseDate("yy-mm-dd",  item);
            var dt_to = $.datepicker.formatDate('dd/mm/yy', d);
            return dt_to;
        }
    }

    function loadPrioritizedList() {
        $("#tasksUL").empty();
    // TDs below have to be 3 more width than the headers 
        $().SPServices({
            operation: "GetListItems",    
            webURL: myURL,
            listName: targetListName,
            CAMLViewFields: "<ViewFields><FieldRef Name='Priority_x0020_Number' /><FieldRef Name='Edit_x0020_Link' /><FieldRef Name='Priority' /><FieldRef Name='Top_x0020_Item_x003f_' /><FieldRef Name='Purpose' /><FieldRef Name='Work_x002d_Task_x0020_Order' /><FieldRef Name='Work_x0020_Status' /><FieldRef Name='DueDate' /><FieldRef Name='Task_x0020_Type' /></ViewFields>",
            CAMLQuery: '<Query>' +
            '<OrderBy>' +
            '<FieldRef Name="Priority_x0020_Number" />' +
            '</OrderBy>' +
            '</Query>', 
            CAMLRowLimit: listrowlimit,  
            completefunc: function (xData, Status) {
                $(xData.responseXML).SPFilterNode("z:row").each(function() {
                    var tdHtml = "<tr class='sortable_row' id=" + $(this).attr("ows_ID") + ">";
                    tdHtml = tdHtml + "<td style=\"width:40px;\">" + PriorityFormat($(this).attr("ows_Priority_x0020_Number"));  + "</td>";
tdHtml = tdHtml + '<td style=\"width:40px;\"><a href=\"'+($(this).attr("ows_Edit_x0020_Link")).split(", ")[1]+'\">'+ ($(this).attr("ows_Edit_x0020_Link")).split(", ")[1] +'</a></td>';
 tdHtml = tdHtml + "<td style=\"width:46px;\">" + $(this).attr("ows_Priority") + "</td>";
tdHtml = tdHtml + "<td style=\"width:40px;\">" + TopItem($(this).attr("ows_Top_x0020_Item_x003f_")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:300px;\">" + StringChk($(this).attr("ows_Purpose")) + "</td>";
 tdHtml = tdHtml + "<td style=\"width:125px;\">" + StringChk($(this).attr("ows_Work_x002d_Task_x0020_Order")) + "</td>";    
tdHtml = tdHtml + "<td style=\"width:150px;\">" + StringChk($(this).attr("ows_Work_x0020_Status")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:100px;\">" + FormatDate($(this).attr("ows_DueDate")) + "</td>";
tdHtml = tdHtml + "<td style=\"width:75px;\">" + StringChk($(this).attr("ows_Task_x0020_Type")) + "</td>";
 tdHtml = tdHtml + "</tr>";
                    $("#tasksUL").append(tdHtml);
                });
            }
        });

        $("#tasksUL").sortable({
            containment: "#scroll2",
            helper: fixHelperModified,
            scroll: true,
            axis: "y",
            cursor: "move"
        }).disableSelection();
    }

    //Beginning to save items
    function saveListOrder() {
        $("#Dialog").dialog({ width: 200, height: 100, title: "Saving...", resizable: false, closeOnEscape: false, modal: true });
        alert('Saving new list order.');        
        var total = 0;
        var itemcnt = 0;
        var msgstart = "<Method ID='1' Cmd='Update'>";
        var msgend = "</Method>";
        var updatestart = "<Batch OnError='Continue'>";
        var updateend = "</Batch>";
        // process each
        var updatemsg = updatestart;
        $('#tasksUL tr').each(function(index) {
            // here we want to do 'updatecount' at a time to the list
            itemcnt = itemcnt + 1;
            total = total + 1;
            // create the update method for this item
            updatemsg = updatemsg + msgstart;
            updatemsg = updatemsg + "<Field Name='Priority_x0020_Number'>" + total + "</Field>";
            var itemId = $(this).attr("id");
            updatemsg = updatemsg + "<Field Name='ID'>" + itemId + "</Field>";
            updatemsg = updatemsg + msgend;

            // if we hit 100 then save to list and reset counter
            if (itemcnt == 100) {
                itemcnt = 0;
                updatemsg = updatemsg + updateend;
                SaveItem(updatemsg, total);
                updatemsg = updatestart;
            }
        });
        // Now we need to update the last items
        if (itemcnt > 0) {
            updatemsg = updatemsg + updateend;
            SaveItem(updatemsg, total);
        }
        alert('List items saved.  Reloading list.');
        $("#saveid").html("");
        loadPrioritizedList();
        $("#Dialog").dialog('close');
    }

    function SaveItem(updatemsg, total) {
        $().SPServices({
            operation: "UpdateListItems",
            debug:false,
            async: false,
            batchCmd: "Update",
            listName: targetListName,
            updates: updatemsg,
            completefunc: function(xData, Status) {
                $("#saveid").html("Updated " + total + " list items");
            }
        });
    } 


    $(document).ready(function() {
        //alert("jQuery");   
        //alert($().SPServices.SPGetCurrentSite());
        //$('.listtable').css('cursor', 'pointer');
        $("#Dialog").dialog({ width: 200, height: 100, title: "Loading...", resizable: false, closeOnEscape: false, modal: true });
        $("#msgid").html("Drag list items to save priority.");
        loadPrioritizedList();
        $("#Dialog").dialog('close');
    });
</script>

<div id="msgid">Drag rows to new position to change List Order.</div>
<br/><a id="saveLink" onclick="saveListOrder();" href="#">Save List Order</a> <br/>
<br/>

<!-- Make the widths 3 pixels smaller than the column widths because of styling -->
<div id="scroll2">
<div class="listtable_hdr" width="100%">
<table width="975px">
    <thead>
        <tr>
            <th class="contents_header" style="width:37px;">List Order</th>
            <th class="contents_header" style="width:42px;">Edit</th>
            <th class="contents_header" style="width:42px;">Priority</th>
            <th class="contents_header" style="width:37px;">Top Item?</th>
            <th class="contents_header" style="width:297px;">Effort/Purpose</th>
            <th class="contents_header" style="width:122px;">Contract-Task Order</th>
            <th class="contents_header" style="width:147px;">Work Status</th>
            <th class="contents_header" style="width:97px;">Action Need Date</th>
            <th class="contents_header" style="width:72px;">Action Type</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
</div>
<div id="scrolldiv" class="listtable" style="height:500px;width:995px;">
<table width="975px" >
    <tbody id="tasksUL" >
    </tbody>
</table>
</div>
</div>
<div id="savemsg"></div>
<div id="Dialog" title="Loading..." style="display:none;text-align:center;padding-top:20px;"><img src="../SiteAssets//LoadingAnimationBlue.gif" /></div>

Thanks again for any help!

WCS
  • 93
  • 1
  • 3
  • 17
  • What does "$(this).attr('ows_Edit_x0020_Link').split(', ')[1]" return to you exactly? Is it just "https://myteam.thiscompany.com/techdev/Sandbox/WebPart%20Pages/Edit" for all items? – AymKdn Jun 19 '13 at 16:48
  • @AymKdn - Thank you for your response. Yes, per your question that is exactly what is returned for all items. However, the values for the "`ows_Edit_x0020_Link`" should be akin to https://myteam.thiscompany.com/techdev/Sandbox/Lists/Task%20List/Task/editifs.aspx?ID=5115 where ID=5115 is the task ID (each ID for each row would be the ID of that individual task so clicking the link only opens the edit page for that task). That link is what it looks like in the SP list. It also inclides a ", Edit" after the link so I am using the ".split" to only show "Edit". – WCS Jun 19 '13 at 17:25
  • Oh, also, for that link: https://myteam.thiscompany.com/techdev/Sandbox/Lists/Task%20List/Task/editifs.aspx?ID=5115 it is pointing to "Task%20List" but it should be pointing to the "Task%20Test%List" - my SortList however does not have the SP list column pulling from that site/List - just the https://myteam.thiscompany.com/techdev/Sandbox/Lists/Task%20List/Task/editifs.aspx?ID=5115 – WCS Jun 19 '13 at 17:32

1 Answers1

0

Actually you have to use $(this).attr('ows_Edit_x0020_Link').split(', ')[0] (note the [0] instead of [1]) for the "href". If you use [1] then you'll have "Edit" and not the URL

AymKdn
  • 3,327
  • 23
  • 27
  • Thank you for your answer. I set the ".split" to 1 as indicated, and while it is showing the URL, the URL is not returning the edit page (it is going to a page that doesn't exist). The URL is pointing to the wrong site (the one the SortList is on, or "Task%20List" but I need the URLs to point to "Task%20Test%List". Do you know how I might accomplish this? Thanks again for working with me on this! – WCS Jun 19 '13 at 17:51
  • It's not 1 but 0 .... And it's going to return you the link ``https://myteam.thiscompany.com/techdev/Sandbox/Lists/Task%20List/Task/editifs.aspx?ID=5115`` then you can just apply a ``.replace`` like ``$(this).attr('ows_Edit_x0020_Link').split(', ')[0].replace(/Task%20List/,'Task%20Test%20List')`` – AymKdn Jun 20 '13 at 07:28
  • Hello. Thanks for the updated code. I made the mod as you suggested, but it is not executing the replace. Is it possible that this is because it is pulling from the SP list "`ows_Edit_x0020_Link`"? This is what the new code with your mods looks like in the JavaScript: `tdHtml = tdHtml + ''+ ($(this).attr("ows_Edit_x0020_Link")).split(", ")[0].replace(/Task%20List/,'Task%20Test%20List')+'';` Did I implement that correctly? Thanks! – WCS Jun 20 '13 at 14:09
  • No, that should be: ``tdHtml = tdHtml + ''+ ($(this).attr("ows_Edit_x0020_Link")).split(", ")[1]+'';`` But if ``.replace(/Task%20List/,'Task%20Test%20List')`` doesn't work you may want to try ``.replace(/Task List/,'Task Test List')`` This is a very basic operation... you should be able to fix that alone... – AymKdn Jun 20 '13 at 17:27