Need a link to create a new document from an Office template?

Hi everyone!

I found this blog post the other day and you can’t imagine the thrill I felt 🙂

This is something I have wanted to be able to do so many times and didn’t know how to, now I do and I want you to do as well.

As you can see (and read in the blog post) the saveLocation is set from where the template is located. I did a little change to route the save location to a place I decided. I also added a little change to wait until the page is loaded before the function is executed, always a good thing to do.

This is the original code:

<script type="text/javascript" src="/_layouts/jquery.min.js"></script>
<script type="text/javascript">
$( function () {
$("a[href$='.dot'], a[href$='.dotx'], a[href$='.xlt'], a[href$='.xltx']").attr("onclick", "").click( function () {
saveLocation = $(this).attr("href").split("/").slice(0, -2).join("/")
createNewDocumentWithProgID(window.location.protocol + '//' + window.location.host + $(this).attr("href"), window.location.protocol + '//' + window.location.host + saveLocation, 'SharePoint.OpenDocuments', false)
return false
})
})
</script>

and this is my modified one with a hard coded save location:

<script type="text/javascript" src="/Style%20Library/Scripts/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("a[href$='.dot'], a[href$='.dotx'], a[href$='.xlt'], a[href$='.xltx']").attr("onclick", "").click( function () {
createNewDocumentWithProgID(window.location.protocol + '//' + window.location.host + $(this).attr("href"), makeAbsUrl('http://MyIntranet/sitename/sitename/librar%20name'), 'SharePoint.OpenDocuments', false)
return false
})
})
</script>

Here is another one that prompts to save the document in the logged in users local Document library.

<script type="text/javascript">
$(document).ready(function(){
$("a[href$='.dot'], a[href$='.dotx'], a[href$='.xlt'], a[href$='.xltx']").attr("onclick", "").click( function () {
createNewDocumentWithProgID(window.location.protocol + '//' + window.location.host + $(this).attr("href"),'C:\Users\{login}\Documents' , 'SharePoint.OpenDocuments', false)
return false
})
})
</script>

As always when we are working with jQuery you have to make sure that you reference the location of that .js-file

CU

/Niax


Validation in InfoPath

Hi everyone!

Due to a discussion in a thread at Microsoft Forum, I decided to create a post about a couple of ways to handle validation in InfoPath.

The two ways I will show you are these:

  • Disable a button until all questions are answered.
  • Showing a message if a question is missed.

This is the how the form looks like.

As you can see we have a couple of questions to answer and then we can move on to the next view to continue with more questions. To stop the user from being able to go to the next view we could disable the button, this is how.

First click on the button Next view, and then on Manage Rules in the ribbon.

Now for the button Next view create a Formatting rule called DisableButton, that looks like this.

Now the button can’t be used until Question1 and Question2 is answered. Use Prereview to make sure it works.

Ok, so now lets move over of how to show a message if the user missed to answer a question. First you have to delete the rule from the previous example.

These are the fields in the form.

First of all, above the button I have placed the field called Message, and it is formatted like this.

No border, read only and with the same color as the rest of the cell, this way it’s invisible until a message is written to it.

As before, choose Manage Rules for the button Next view, this time create two Action rules.

The first rule I name Message_Blank and this rule looks like this.

As you can see I use the action Set a field’s value and the only thing we do here is to set the field Message to nothing/blank. You should not add the apostrophes, InfoPath will do that for you, just leave the field blank.

Now we need to create one more rule to show the message. Let’s call it Message_Error, it’s the same kind of rule with a few differences and it looks like this.

As you can see we I have a condition, the message is not blank, but actually holds the text we would like to show the user. And last but not least, I have check marked Don’t run remaining rules… That is because the last rule this button should have is to switch view, but not if this rules condition is met.

This is how it will look like if the user trys to move on before all questions are answered.

That’s it!

Try it in preview to make sure you done it the right way.

CU!

/Niax


Add customizable information to a library page

Hi everyone!

As you know when you add a web part to a library page, like Allitems.aspx or a page of a custom view that you’ve made, the ribbon gets wacky. That’s because it doesn’t know which web part it should have its focus on.

So what could we do if we really want some information, let’s say above the library web part?

And the information should be able to edit in an easy manner without using SharePoint Designer (SPD).

In this example I have a top site and underneath this I have some sub sites that are created from a site template I made. The things we are going to do now is made to that template so it could be reused.

First of all we have to edit the page’s code a bit, so bring up the page in your favorite editing tool SPD!

Find where the web part zone for the library begins and add two DIV’s right before it starts, like this:

PlaceHolderMain" runat="server">
<div id="success"></div>
<div id="error"></div>
<WebPartPages:WebPartZone runat="server" FrameType="None" ID="Main" Title="loc:Main">

As you can see I have added two DIV’s right after PlaceHolderMain with the ID’s of success and error. Don’t close this page, we are coming back here real soon.

What we are going to do now is to add some content to the success DIV.

First we need to have some content, right?

On the top site, let’s create a new Web Part Page, call it content.aspx and choose Full Page, Vertical.

Add a Content Editor to the page, click inside it, choose to Edit HTML Source…

…and paste this code:

</pre>
<div id="<span class=">MyDiv"></div>
<pre>
The content within this DIV will be shown above the document library.
<div>
<ol>
<li>To think about...</li>
<li>And this as well...</li>
</ol></div></div>

Ok, so now we have som content and as you can see the content is kept inside a DIV with the ID of MyDiv.

Now we are going back to the first page (where we have the library and added the two DIV’s) to add this information to the success DIV.

Let’s add som jQuery!

Find AdditionalPageHeader and add this code:

<asp:content contentplaceholderid="PlaceHolderAdditionalPageHead" runat="server">
 <SharePoint:RssLink runat="server"/>
<script type="text/<span class=">// <![CDATA[
javascript</span>" src="/sitename/Shared%20documents/jquery-1.6.2.min.js">
// ]]></script>
<script type="text/javascript">
 $(document).ready(function() {
 $("#success").load("/sitename/sitename/SitePages/content.aspx #MyDiv",
 function(response, status, xhr) {
 if (status == "error") {
 var msg = "Page is missing: ";
 $("#error").html(msg + xhr.status + " " + xhr.statusText);
 }
 });
});
</script>
</asp:content>

As you can see, first I have a reference to my jQuery file, you should replace the URL so that it corresponds to your environment.
Then in the next section we are loading the content in MyDiv into the DIV with the ID of success.

Now we are done!

Save all pages and try it, it should look something like this:

This way you can create new sites from this site template and just by editing the Content Editors in the page content.aspx you could update the contents on all sites.

Isn’t that nice?

CU!

/Niax


Open an InfoPath form in a dialog

Hi everyone!

I would like to share with you how you could open a form in a dialog in SharePoint.

  • Add a Form web part on a page of your choise.
  • Replace the code with this:
<div> <a href="javascript:{ SP.UI.ModalDialog.OpenPopUpPage('/sitename/_layouts/FormServer.aspx?XsnLocation=/sitename/library/forms/template.xsn&OpenIn=browser&SaveLocation=/sitename/library', null, 1000); };">Open form</a></div>
  • Replace sitename and library with the ones in your environment.
  • Click Save and OK in the web part and try it out!

Thats it!

/Niax


Add som nice picture buttons to your form

Hi everyone!

I thought that I should show you how easy it is to spice-up your form with som nice pictures as buttons instead of the boring ones that comes along.

Start by adding a couple of ordinary buttons to your form.

When that is done highlight a button by clicking on it.

In the ribbon, choose the Layout tab.

Then in the Table section, choose the drop down Change to to change the button to a picture button.

Now when that is done open the properties of the button. As you will notice you are given the opportunity to add not one, but two pictures for each button. The second button will act as the a hover-button, isn’t that nice 🙂

If you choose the Advanced tab you could add some text as well that will be shown when you hover over the button.

CU!

/Niax


Expense report (follow-up)

Hi everyone!

Ok, so this is a follow-up on my last post Name of month in expense report.

I promised that I would tell you how I did to get this expense report, to be editable only until a certain date and how the field that is telling us for which month this report is valid for, would keep it’s value even if the report is opened later on.

In this example, let’s say that our finance dep would like the employees to deliver their expense reports prior to the 16 of the current month. The employees should still be able to open these reports later on to be able to check and compare but not being able to make any changes or to save the report.

If you haven’t already created a data connection to submit the form back to the form library and added a button for the users to do this with, please do so 🙂

Set the correct month and keep its value

Now we need to do a few things to keep the value of the field for which month this report is for. What I am taking about is the field right after the title.

Start by adding a new field of the type string called ValidMonth.

Add another field of the type whole number (integer) called Day and give it the value substring(TodaysDate, 9, 2), now we know which day it is.

We should now give the submit button a rule.

Highlight the button, click on the button Manage rules in the ribbon.

The action we would like this rule to do for us is to set the value of ValidMonth to the name of the month for which this report should have. It could be the current month but it could also be the upcoming month if it is created between the 16th and 31st.

Create a new rule with the condition to be fired only if ValidMonth is equal to Empty and Day is less than or equal to 15. The action should be to set ValidMonth to the name of the current month. The rule should look like this:

But what if  we would create a new form between the 16th and 31st?
We need to create one more field to hold the name of the next month.

Give the field the name NextMonth with the value MonthNr +1

Ok, so now we have the number of the upcoming month, let’s use it to set the name of the next month.

Create one more rule for the save button with the condition to be fired only if ValidMonth is equal to Empty and Day is less than or equal to 31 and greater than 15. The action should be to set ValidMonth to the name of the next month. The rule should look like this:

There you go!

Now the form’s month is set only once and depending on if it should be valid for this month or the next, it will get the correct one. If you add these rules to the Form load it will be set when you open the form.

Editable until a certain date

Let’s add a rule for the submit button. Make it a formatting rule with the condition to only fire when Day is greater than 15 and mark the choice to Hide this control. That way the button will be hidden when the date is greater than 15th, and they will not be able to save any changes.

What if we want to create a new report between the 16th and 31st?
Ok, so we also need to check if ValidMonth is equal to MonthName, in that case the submit button should not be seen.

So, add another condition to that same rule that says:

and ValidMonth equals MonthName (be sure to use “and”)

Ok, there you go!

That was pretty easy 🙂

CU!

/Niax


Name of month in expense report

Hi everyone,

Right now I am composing a form in InfoPath for an expense report. I thought that I would share a couple of things with you guys.

I will start of with this post and will probably follow up with one or two more.

In this post I will show you how I accomplished this:

  • Putting in the name of the month into the form

Ok, first of all you need to create a new data connection to get information from a XML-file.

Copy this code, put it in a Notepad and save it in UTF-8 format as Month.xml:

<?xml version="1.0" encoding="UTF-8"?>
<months>
<month id="1" name="Januari"/>
<month id="2" name="Februari"/>
<month id="3" name="Mars"/>
<month id="4" name="April"/>
<month id="5" name="Maj"/>
<month id="6" name="Juni"/>
<month id="7" name="Juli"/>
<month id="8" name="Augusti"/>
<month id="9" name="September"/>
<month id="10" name="Oktober"/>
<month id="11" name="November"/>
<month id="12" name="December"/>
</months>

Now create a data connection and choose to get data from another source such as a XML-file. Browse to the file Month.xml and choose to get data whenever the form is opened.

In the Main data source create a new field of the type string called TodaysDate.
Give this field the default value of Today() which will give you todays date.

Create another field of the type string called MonthNrText.
Give this field the default value of substring(TodaysDate, 6, 2) (that is when the date format is like 2012-01-06)

Now let’s create a new field and convert MonthNrText to an integer to take away the leading zeros.

Call this new field MonthNr and give it the value of number(MonthNrText)

Now we have the number of the current month, let’s make one more filed to get the name of this month.

Let’s create a field of the type string and name it MonthName. With this field we will compare the id in the secondary data source against our field MonthNr.
Give this filed the default value of @name[@id = MonthNr], this is how it is done.

Open up the properties of MonthName and click on the function-button to the right of the value field.

Click on the left button insert Field or Group... Choose the secondary data source Month and the field name. Then choose to add a filter to that data by clicking the button Filter data. A new dialog opens up where we choose to Add a new filter.

In the first drop down choose select a field or group and point to id in the secondary data source. In the second drop down choose is equals to and in the final drop down choose select a field or group and point to MonthNr. Here you have all the dialogs:

Ok, so there it is! Now we have the name of the current month.

In the next post I will show you how I made the form keep the name of the valid month, even if it is opened up later and how I made the form editable only until a certain date.

CU!

/Niax


Get a link in a CQWP to edit an item

Hi everyone!

I hope this could be of some use for you 🙂

I want:

An audiense filtered list of links where by clicking the link, I should end up being able to edit the item, not open the page it points to. After I have finished editing I should return to the page with links targeted to me (or any other page for that matter).

Ok this is what we have:

A links list called OrgLinks where we have activated Audience targeting settings. This list also has a custom column called Box that is of the type Managed metadata which is connected to a Term store called Linkboxes.
So each item is tagged with which box it should belong to and which part of the organization that should see it.

I have a page that consists of a number of CQWP that is querying this links list. Audience targeting is activated on these web parts and they are filtered on the values of the Term store Linkboxes.

On the same page, I have added a couple of buttons (targeted to editors) to make it easier to create new items in this list and navigate to a page where you could edit items already created. This is actually the list that this blog is all about 🙂

The thing is that even if you enable Audience targeting for a list, you can’t OOTB filter a lists view on audiences.

This is where the template I came up with for ItemStyles.xsl comes in. It could be that I am crossing the brook for water in my template but it gives me the result I want 🙂

It was actually this template from Marc’s blog that got me in the right direction.

What it does is that it concatenate the link to the edit form of the item, the Item-ID and the URL to the page the user should go to after he or she is finished.

<xsl:template name="LinkListEdit" match="Row[@Style='LinkListEdit']" mode="itemstyle">
     <xsl:variable name="SafeLinkUrl">
         <xsl:call-template name="OuterTemplate.GetSafeLink">
             <xsl:with-param name="UrlColumnName" select="@URL"/>
         </xsl:call-template>
     </xsl:variable>
     <xsl:variable name="DisplayTitle">
         <xsl:call-template name="OuterTemplate.GetTitle">
             <xsl:with-param name="Title" select="@URL"/>
             <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
         </xsl:call-template>
     </xsl:variable>
     <xsl:variable name="TheList">
     <xsl:text disable-output-escaping="yes"> /alltomoss/_layouts/listform.aspx?PageType=6&amp;ListId={675357B2-D33C-4626-A61B-0FC978C0C09C}&amp;ID=</xsl:text>
     </xsl:variable>
     <xsl:variable name="Source">
     <xsl:text disable-output-escaping="yes">&amp;Source=/alltomoss/sidor/aoolankar.aspx</xsl:text>
     </xsl:variable>
          <xsl:variable name="TheLink">
          <xsl:value-of select="concat($TheList, @ID, $Source)" />
          </xsl:variable>
     <div id="linkitem">
         <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
         <a href="{$TheLink}" title="Redigera länken">
         <xsl:value-of select="substring-after($DisplayTitle,',')"/>
         </a>
     </div>
 </xsl:template>

Before we actually could use this template and use it it in our CQWP we need to export the webpart and add a couple of things to it. Change CommonViewFields to look like this:

 <property name="CommonViewFields" type="string">URL,Text; </property> 

Then as “usual” import it again and add it to the page.

CU!

/Niax


Working with the Visio Web Part

Hi everyone!

Ok, so a client had these requests:

1. We want to be able to navigate to different processes in an easy manner

2. We want to be able to bring up information about a process step

2b.Without loosing focus from the process we are currently at

3. Reuse instructions that we already have about the steps in our processes

This is what we will be working with:

  • A Visio file for the master process file that will be used to navigate to the different processes.
  • A Visio file for the process Customer Complaints, this process will contain two steps.
  • A PDF-file that will contain information about each step.
  • Two pages that will show the Visio-files.

First I would like to add that I am no expert in Visio so there might be better or different ways to attack this 🙂

As a matter of fact, I wonder if there is something that I am an expert in…

But anyway, this is how I did.

First of all I have these settings for Adobe Reader.

  • Set Adobe Reader to open PDF-files in the browser
  • Uncheck to open in Read mode as default

To accommodate request 1 (navigate to different processes)

A main process is created in Visio with links to the pages that holds a Visio web part for each process like Sales and Customer complaints and so on.

Main process

The link for the Customer complaints object looks like this:

http://server/site/pages/customerc.aspx

This Visio-file is uploaded to http://server/site/processdiagrams as MainProcess.vdw

On the start page for http://server/site/start.apsx a Visio web part will be showing this Main process.

I also added a Go back button above this web part so that they in an easy manner could go back to the page that holds the Main process.

To accomodate request 3 (reusing information that we have)

First I made sure that the information about each process step started on a new page in the document. Then I saved the Word-file as a PDF letting Word create bookmarks in the PDF-file from the headings in the document while it was beeing published. That way we get a table of contents in the left navigation of the PDF.

(If you don’t get one, make sure that you have unchecked the default value to open PDF in Read mode.)

This PDF-file is uploaded to http://server/site/documents as CCsteps.pdf

To accomodate request 2 (bring up information on each step)

The Customer complaints visio-file (that is saved as a .vdw-file) holds two different steps ACC CC and Qualify CC.

Customer complaints

The link for ACC CC is configured like this:

URL: http://server/site/documents/ccsteps.pdf

The sub adress is “Page=2” (because the instructions for the ACC CC step starts at page 2)

Description is set to ACC CC and I don’t use a relative path.

This Visio-file is uploaded to http://server/site/processdiagrams as CustomerC.vdw

To accomodate request 2b (navigate without loosing focus)

Ok, so this is something that I don’t like with the new vdw-type of file, you can not set a link for an object to open in a new window.

So to get around this I first got some help on MSDN forum here >> with some javaScript.

On the Visio web part you want to have this script active for edit the web part like this:

I did not get this to work OOTB, so I got some help from some collegues of mine, thanks guys 🙂

This code you could simply copy and paste and put in a CEWP or FormWP on the page where you have your Visio web part, to try it out.

It ended up with a JavaScript looking like this:

<script type="text/javascript">

// Declare the global variables for the script, for the Visio Web Access Web Part, the active page in the Web Part,
// and the shapes on the active page.
var vwaControl;
var vwaPage;
var vwaShapes;
var newURL;

// Add a handler to the AJAX Sys.Application.load event.
Sys.Application.add_load(onApplicationLoad)

function onApplicationLoad()
{
  try{
    // Capture a reference to the current instance of the Visio Web Access Web Part.
    // Add a handler to the 'diagramcomplete' event.
    vwaControl= new Vwa.VwaControl(getVWAWebPartID());
    vwaControl.addHandler("diagramcomplete", onDiagramComplete);
  }
  catch(err){
    alert(err);
  }
}

function getVWAWebPartID()
{
// Search all of the</pre>
<div>tags on the page to find the div tag with the ID of the VWA Web Part.</div>
<pre>
  var divArray = document.getElementsByTagName("div");
  var webPartElementID;
  for (var i = 0; i < divArray.length; i++) {
    var node = divArray[i];
    if (node.className == "VisioWebAccess")
    {
      webPartElementID = node.parentNode.parentNode.id;
      break;
    }
  }
  return webPartElementID;
}

function onDiagramComplete()
{
  try{
    // Set the vwaPage and vwaShapes variables to the active page and the shapes collection on that page, respectively.
    vwaPage = vwaControl.getActivePage();
    vwaShapes = vwaPage.getShapes();

    // Remove the handler from the shape selection changed event and then add it back to the event.
    vwaControl.removeHandler("shapeselectionchanged", onShapeSelectionChanged);
    vwaControl.addHandler("shapeselectionchanged", onShapeSelectionChanged);

  }
  catch(err)
  {
    alert(err);
  }
 }

function setNewPage(pageId) {
  // Set the active page in the drawing to the page ID passed in as argument.
  var indexOfAmp = pageId.indexOf("&");
  var page = pageId.slice(6, indexOfAmp);
 vwaControl.setActivePage(page);
}
onShapeSelectionChanged = function (source, args)
{
  try{
    // Get the array of hyperlinks from the selected shape.
    var vwaShape = vwaShapes.getItemById(args);
    var newURLArray = vwaShape.getHyperlinks();

    // Check to see whether the shape has any hyperlinks.
    if (newURLArray.length> 0)
    {
      newURL = newURLArray[0].value;

      // Check to see if the hyperlink goes to another page in the drawing.
      if (newURL.indexOf('vdw') < 0)
      {
        // Open the hyperlink in a new window.
           var newWindow = window.open(newURL, "", 'width=800,height=650')
      }
     else
      {
         //Set the active page to the new page.
        setNewPage(newURL);
      }
    }
  }
  catch(err)
  {
    alert(err);
  }
}
</script>

Now when you click on a process step, the actual page in the PDF-file should be brought up in a separate window and give you the instructions about that step. You should also have a table of contents in the left pane in AcrobatReader so that you could easily navigate between different instructions.

Well thats about it guys, I hope this will help you or give you some ideas.

CU

/Niax


Version and ID in printed document

As you probably already know it’s possible to add Quick Parts in Word to add metadata from custom columns in your header/footer.
But getting Version or ID in the header/footer is a whole other bargain.

It’s really important to get this information inside the document, so that it’s possible to see on a printed copy, what version it is compared to the latest version in SharePoint.

So how should we accomplish this?

• Make sure you have a document with a header section.
• Create a Content type and add this document as the template.
• Navigate to a document library and activate Versioning and the possibility to handle Content types.
• Add your Content type to the library.
• Navigate to the settings for the library and then the settings for the Content type. Click on “Information management policy settings”.
• Check “Enable Labels” and add: {Version}nDok.ID: {ID} in “Label format”. Make changes regarding the style as it fits you.
• In advanced settings for the Content type, choose to edit the template.
• Put the cursor where you want to have the Version and ID added.
• Click on Insert, Quick Parts, Document property and Label.
• Save, click Ok and try it out.

The first time you open up the document it looks a little bit strange because there is no version yet, but don’t worry, save and open the document again and behold the version.

/Niax