Solutions2Share at SharePoint Saturday North Germany/Bremen

Solutions2Share sponsored the first SharePoint Saturday North Germany/Bremen – thanks to all event organizers who made this event a success!

For the first time, SharePoint Saturday visited Bremen in North Germany. The fascinating location, ‘Schuppen Eins’, a beautiful vintage car gallery, was the perfect place for this thriving SharePoint community-event. In addition to interesting talks and the obligatory post-event ‘SharePint’, a lot of top speakers and MVPs, like Martina Grom, Vesa Juvonen, Toni Pohl and others enhanced this free conference to a top event in the SharePoint community.

Solutions2Share was happy being a part of this phenomenal event! See you next year.

Don’t forget about European Collaboration Summit, the biggest and most important SharePoint event in May 2018! Over a thousand attendees and the world’s most influential experts will gather in Mainz to discuss new developments in the Microsoft landscape and join a series of workshops and presentations. Solutions2Share will be right on spot!

We are on social media! Visit us on FacebookTwitterLinkedIn or check out our YouTube channel.

Use Amazon Alexa to control Collaboration Manager 365

Amazon’s speech recognition Alexa is constantly listening to commands, giving it the ability to play the music you wish, write down your personal shopping list or answer you factual questions whenever you are in range of Amazon’s Echo speaker. Solutions2Share made it possible to control our site provisioning solution Collaboration Manager 365 with Amazons speech recognition, which gives us a future prospect to the nearly endless possibilities this technology provides. In the following video, our senior consultant Dennis Hobmaier gives you a live demo at our booth and shows how to create a meeting workspace which can be immediately provisioned with the predefined template, giving just one simple order to Alexa!

 

Collaboration Manager kann jetzt per Sprache Sites provisionieren – hier live am Stand von Solutions2Share ausprobieren

Posted by Dennis Hobmaier on Samstag, 4. März 2017

 

Solutions2Share wishes you a happy and prosperous New Year 2018!

Interested in meeting us or receiving a live insight in our innovative SharePoint and Office 365 solutions? Visit our booth at one of the many fairs and conferences, like the SharePoint Saturday North Germany in Bremen on 01/20/2018, or the SharePoint Saturday Helsinki on 01/27/2018.

Already busy in January? Don’t forget about European Collaboration Summit, the biggest and most important SharePoint event in May 2018! Over a thousand attendees and the world’s most influential experts will gather in Mainz to discuss new developments in the Microsoft landscape and join a series of workshops and presentations. Visit our events page for further information

We are on social media! Visit us on FacebookTwitterLinkedIn or check out our YouTube channel.

Solutions2Share in Helsinki: Third annual SharePoint Saturday on January 27th, 2018

Solutions2Share is attending the third annual SharePoint Saturday Helsinki, which brings the arctic coolness of Finland into the hot SharePoint and Office 365 community!

 

The free SharePoint Saturday one-day events are held in different cities around the world, featuring sessions from influential and respected SharePoint professionals. For the third time, this community event will be held in Helsinki, Finland, and Solutions2Share will be on the spot!

Join this fantastic conference and enjoy a perfect environment to share knowledge and learn about Mircosoft SharePoint, including high-quality sessions which are held by members of the local community and the best speakers from abroad.

Meet us and a big number of administrators, end users, architects, developers and other professionals at Mircosoft Flux venue in Helsinki on January 27th, 2018.  Look for our booth and learn about our brilliant SharePoint and Office 365 solutions.

Register now for this free event, featuring top-speakers and MVPs!

Already busy in January? Don’t forget about European Collaboration Summit, the biggest and most important SharePoint event in May 2018! Over a thousand attendees and the world’s most influential experts will gather in Mainz to join a series of workshops and presentations.

We are on social media! Visit us on Facebook, Twitter, LinkedIn or check out our YouTube channel.

Solutions2Share sponsors first SharePoint Saturday North Germany/Bremen

Join other SharePoint administrators, end users, architects, developers, and professionals working with Microsoft SharePoint, Office 365 or Azure who will meet for the first SharePoint Saturday North Germany in Bremen. ​Solutions2Share is joyful to sponsor this phenomenal event on 01/20/2018 at the Schuppen Eins located in Bremen.

SharePoint Saturday Events are free one-day events held in different cities around the world, featuring sessions from influential and respected SharePoint professionals. For the first time, this community event will be held in Bremen, North Germany, and Solutions2Share will be on the spot!

We provide a live insight to our innovative products. Use the chance and convince yourself of our brilliant state-of-the-art SharePoint and Office 365 solutions.

Register now for this free event, featuring top-speakers and MVPs!

Already busy in January? Don’t forget about European Collaboration Summit, the biggest and most important SharePoint event in May 2018! Over a thousand attendees and the world’s most influential experts will gather in Mainz to discuss new developments in the Microsoft landscape and join a series of workshops and presentations.

We are on social media! Visit us on Facebook, Twitter, LinkedIn or check out our YouTube channel.

Solutions2Share is gold partner of European Collaboration Summit 2018

The European Collaboration Summit (ECS) is one of the largest conferences in Europe focusing on Microsoft products like SharePoint, Office 365 and Azure. Solutions2Share will support the community-driven conference taking place from May 28th until May 30th as a gold partner.

Up to one thousand IT and business professionals from all over Europe will gather in Mainz to join a series of full-day workshops and listen to some of the most prominent community and corporate speakers.

The world’s most influential experts will discuss new developments in Microsoft SharePoint and Mircosoft Office 365 landscape. More than 60 members of Microsoft product teams, MVPs, MCMs, and other experts, from over 20 countries and five continents, will guide you through all the changes happening in the IT world today. ECS 2018 will focus on all topics based on Microsoft’s collaboration products stack. These products and services will be approached from all sides: business, organizational, and technical.

We, Solutions2Share, will be presenting our brilliant SharePoint and Office 365 solutions at our own exhibition stand.

Boost your collaboration with Collaboration Manager, our SharePoint site provisioning engine. Save time and money with our out of the box features. Use the possibility to migrate easily to any SharePoint version you like. All without one single line of code.

Increase your productivity with our Meeting Manager. Invite internal and external attendees, store all relevant information and automatically share the minutes at the end of each meeting.

All information at a glance. With our all new Dashboard for SharePoint and Office 365. The perfect addition to Modern Teamsites. Our Dashboard displays your most important information all on one SharePoint site.

Visit our booth. We provide a live insight to our innovative products. Use the chance and convince yourself.

Being a community and non-profit event, the European Collaboration Summit’s entrance fee is minimal. Early bird tickets are on sale now. Secure your place in Mainz!

We are on social media! Visit us on Facebook, Twitter, LinkedIn or check out our YouTube channel.

Dynamically load JS Files from a SharePoint Hosted Add-in into ContentEditor WebPart

Why do we need a dynamically Link to the JS File in the SharePoint Hosted Add-in? There are many reasons for that, i.e. if we update the Add-in, the javascript files are up to date and we do not need to update every contenteditor webpart ever placed. Therefore, it is much better maintainable than paste code into it.

At first the code to place a contenteditor WebPart in a page:

function AddWebPartsToEditForm(hostweburl, serverRelUrl, dfdAddWebParts) {
    var parentCtx = new SP.AppContextSite(clientContext, hostweburl);
    var web = parentCtx.get_web();
    //Javascript Content of the LoadTemplateHubApp.js --> Loads dynamically the jquery and ManipulateEditForm.js lib
    var webPartXml = '__WebPartXml__';    
    serverRelUrlNewFile = serverRelUrl + "/Forms/TemplateHubEditForm.aspx";
    var pageFile = web.getFileByServerRelativeUrl(serverRelUrlNewFile);
    var webPartMgr = pageFile.getLimitedWebPartManager(SP.WebParts.PersonalizationScope.shared);
    var webPartDef = webPartMgr.importWebPart(webPartXml);
    var webPart = webPartDef.get_webPart();
    webPartMgr.addWebPart(webPart, "Main", 2);
    clientContext.load(web);
    clientContext.load(webPart);
    
    clientContext.executeQueryAsync(
        function () { dfdAddWebParts.resolve(); },
        function (data, errorCode, errorMessage) {
            dfdAddWebParts.reject(data, errorCode, errorMessage);
            HideLoadingScreen(loadingScreenElement);
            alert('Error:' + data.responseText);
        }
    );
}

In the sconde one there is the Code to identify the Add-in. This will work with the ProductId of the Add-in, because it is the identifier for Add-in in the SharePoint Environment.

You can load your Javascript files with the function loadjsfile

var ctxCurrent;
var ctxWeb;
var THUrl = '';
 
function loadjsfile(filename){
    var jq = document.createElement('script'); 
    jq.type = 'text/javascript';
    jq.src = filename;
    document.getElementsByTagName('head')[0].appendChild(jq);
}

//get the SharePoint context
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', loadContext);
 
function loadContext() {
    ctxCurrent = new SP.ClientContext.get_current();
    ctxWeb = ctxCurrent.get_web();
    loadTemplateHub();
}
 
function loadTemplateHub() {
    //get the appTiles
    var apps = ctxWeb.getAppInstancesByProductId("1f0f13bd-6f05-4bf4-a555-318074d8738a");
    ctxCurrent.load(apps);
 
    ctxCurrent.executeQueryAsync(
        function onQuerySucceeded(sender, args) {
            if (apps.get_count() > 0) {
                for (var i = 0; i < apps.get_count() ; i++) {                    
                    var app = apps.getItemAtIndex(i); 
                    var appWebUrl = app.get_appWebFullUrl();													
                    loadjsfile(appWebUrl + '/Scripts/jquery-1.9.1.min.js');
                    loadjsfile(appWebUrl + '/Scripts/ManipulateEditForm.js');
                    break;					
                }
				
            }
        },
        function onQueryFailed(sender, args) {
            console.error('getAppTile. Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        }
    );
}

Now you have to insert the Script to load JS Files into the WebPart. The code should look like this

function AddWebPartsToEditForm(hostweburl, serverRelUrl, dfdAddWebParts) {
    var parentCtx = new SP.AppContextSite(clientContext, hostweburl);
    var web = parentCtx.get_web();
    //Javascript Content of the LoadTemplateHubApp.js --> Loads dynamically the jquery and ManipulateEditForm.js lib
    var webPartXml = '<?xml version="1.0" encoding="utf-8"?>' +
                         '<WebPart xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/WebPart/v2">' +
                          '<Title>TemplateHubRedirect</Title>' +
                          '<FrameType>Default</FrameType>' +
                          '<Description>Manipulates the save button and changes it to a redirection to the WOPI frame.</Description>' +
                          '<IsIncluded>true</IsIncluded>' +
                          '<ZoneID>Main</ZoneID>' +
                          '<PartOrder>0</PartOrder>' +
                          '<FrameState>Normal</FrameState>' +
                          '<Height />' +
                          '<Width />' +
                          '<AllowRemove>true</AllowRemove>' +
                          '<AllowZoneChange>true</AllowZoneChange>' +
                          '<AllowMinimize>true</AllowMinimize>' +
                          '<AllowConnect>true</AllowConnect>' +
                          '<AllowEdit>true</AllowEdit>' +
                          '<AllowHide>true</AllowHide>' +
                          '<IsVisible>false</IsVisible>' +
                          '<DetailLink />' +
                          '<HelpLink />' +
                          '<HelpMode>Modeless</HelpMode>' +
                          '<Dir>Default</Dir>' +
                          '<PartImageSmall />' +
                          '<MissingAssembly>Dieses Webpart kann nicht importiert werden.</MissingAssembly>' +
                          '<PartImageLarge>/_layouts/15/images/mscontl.gif</PartImageLarge>' +
                          '<IsIncludedFilter />' +
                          '<Assembly>Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>' +
                          '<TypeName>Microsoft.SharePoint.WebPartPages.ContentEditorWebPart</TypeName>' +
                          '<ContentLink xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />' +
                          '<Content xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor"><![CDATA[' +
                          '<script>' +
                            'var ctxCurrent;' +
                            'var ctxWeb;' +
                            'var THUrl = \'\';' +
                            'function loadjscssfile(filename){' +
                                'var jq = document.createElement(\'script\'); ' +
                                'jq.type = \'text/javascript\';' +
                                'jq.src = filename;' +
                                'jq.async = false;' +
                                'document.getElementsByTagName(\'head\')[0].appendChild(jq);' +
                            '}' +
                            'SP.SOD.executeFunc(\'sp.js\', \'SP.ClientContext\', loadContext);' +
                            'function loadContext() {' +
                                'ctxCurrent = new SP.ClientContext.get_current();' +
                                'ctxWeb = ctxCurrent.get_web();' +
                                'loadTemplateHub();' +
                            '}' +
 
                            'function loadTemplateHub() {' +
                                'var apps = ctxWeb.getAppInstancesByProductId("1f0f13bd-6f05-4bf4-a555-318074d8738a");' +
                                'ctxCurrent.load(apps);' + 
                                'ctxCurrent.executeQueryAsync(' +
                                'function onQuerySucceeded(sender, args) {' +
                                    'if (apps.get_count() > 0) {' +
                                        'for (var i = 0; i < apps.get_count() ; i++) {' +
                                            'var app = apps.getItemAtIndex(i); ' +
                                            'var appWebUrl = app.get_appWebFullUrl();	' +
                                            'loadjscssfile(appWebUrl + \'/Scripts/jquery-1.9.1.min.js\');' +
                                            'loadjscssfile(appWebUrl + \'/Scripts/ManipulateEditForm.js\');' +
                                            'break;' + 
                                        '}' +	
                                    '}' +
                                '},' +
                                'function onQueryFailed(sender, args) {' +
                                    'console.error(\'getAppTile. Request failed. \' + args.get_message() + \'\\n\' + args.get_stackTrace());' +
                                '}' +
                               ');' +
                            '}' +
                          '</script>' +

                          ']]></Content>' +
                          '<PartStorage xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />' +
                        '</WebPart>';    
    serverRelUrlNewFile = serverRelUrl + "/Forms/TemplateHubEditForm.aspx";
    var pageFile = web.getFileByServerRelativeUrl(serverRelUrlNewFile);
    var webPartMgr = pageFile.getLimitedWebPartManager(SP.WebParts.PersonalizationScope.shared);
    var webPartDef = webPartMgr.importWebPart(webPartXml);
    var webPart = webPartDef.get_webPart();
    webPartMgr.addWebPart(webPart, "Main", 2);
    clientContext.load(web);
    clientContext.load(webPart);
    
    clientContext.executeQueryAsync(
        function () { dfdAddWebParts.resolve(); },
        function (data, errorCode, errorMessage) {
            dfdAddWebParts.reject(data, errorCode, errorMessage);
            HideLoadingScreen(loadingScreenElement);
            alert('Error:' + data.responseText);
        }
    );
}

Cowoking in the Sun

Unsere Motivation ist es unsere Projekte wachsen zu lassen und somit die monotonen und stumpfen Einflüsse hinter uns zu lassen. An der gleichen Stelle zu sein und immer das gleiche Wetter aus einem Großraumbüro zu betrachten wurde uns auf Dauer zu langweilig.

Language Switcher for SharePoint 2013

Do you miss the language switching functionality from SharePoint 2010?
We do!
So we developed a little tool which brings the Language Switcher back to SharePoint 2013.

1. Download the Solutions2Share – Language Switcher

https://solutions2share.sharepoint.com/de-de/Downloads/Solutions2Share.Solutions.LanguageSwitcher.wsp

2. Install the Solution on your SharePoint Enviroment

Open the SharePoint PowerShell and add the solution to the SharePoint solution store:

image

Deploy the solution to your SharePoint enviroment:

image

3. Activate the Language Switcher on your site

Go to Site Settings-> Site Features and activate the Feature with the name “Enable LanguageSwitcher”.

image

4. Switch the Language

Press the Site Actions Button and go to “Change Language”:

image

Now you can switch to all active languages:

image

Choose your language and press the OK Button. That’s it!

Agenda SharePoint Days online

The agenda of the SharePoint Days (http://www.sharepoint-day.de/startseite.html) in Berlin is online.

Our Chief Technology Officer Christian Groß presented on the topic “Teamsites 2.0 mit SharePoint und Collaboration Manager: Abbildung einer Projektplattform bei der Krones AG”. More information about the event and the track you can find here.

Solutions2Share is also exhibitor at the SharePoint Days from 3-4 December 2013.
You can meet us in person on our exhibition stand.

Link to registration page: http://www.sharepoint-day.de/anmeldung.html
Link to exhibitor page: http://www.sharepoint-day.de/aussteller.html

Part VIII: Verbesserung der Code-Qualität durch aspektorientierte Programmierung

Dieser Artikel ist Teil der Artikelserie “Solutions2Share.Common – Simplified/Standardised SharePoint Development”. Diese Serie beinhaltet 8 Kapitel.

Solutions2Share.Common
Part I: MVC und Schichten-Architektur mit SharePoint
Part II: Mapping zwischen Business-Objekten und SharePoint Listen
Part III: VisualStudio – Templates
Part IV: ExceptionHandling und Logging
Part V: SharePoint-Definitionen automatisiert erstellen
Part VI: Dynamische Einstellungs-Seite
Part VII: Small Little Helpers
Part VIII: Verbesserung der Code-Qualität durch aspektorientierte Programmierung

Unter aspektorientierter Programmierung versteht man die Beeinflussung des Quellcodes von einer dritten Komponente, wie z.B. das Modifizieren von Klassen und Funktionen während des Kompilierens des Quellcodes.

clip_image002

In der oberen Darstellungen sehen wir eine beliebige Methode; zusätzlich zu der Methode wurde ein Aspekt vom Typ MethodBound definiert. Der Aspekt soll beim Start der Methode eine spezifische Aktion ausführen, sowie im Fehlerfall also auch beim erfolgreichen Verlassen der Funktion.
Um aspektorientiert programmieren zu können wird eine dritte Komponente benötigt, von der die entsprechenden Ereignisse zur Verfügung gestellt werden und die in den bereits vorhandenen Quellcode eingreifen kann. In diesem Beispiel und Innerhalb der Solutions2Share.Common wird PostSharp verwendet. Beim Kompilieren des Quellcodes reagiert PostSharp und erkennt dass der Methode der Aspekt zugewiesen wurde und baut daraus eine neue Funktion, wie sie im nächsten Abbild aufgezeigt wird:

clip_image002[6]

In diesem Fall sehen wir, dass unsere bereits vorhanden Methode um den entsprechenden Aspekt erweitert worden ist. Der Programmierer fügt der Methode den Aspekt in Form eines Attributes hinzu. Der Aspekt muss nicht jeder Methode separat zugewiesen werden, er kann auch auf die komplette Klasse oder Assembly verordnet werden. Wie bereits im Artikel „ExceptionHandling und Logging“ beschrieben, stellt die Solutions2Share.Common bereits dabei einige Klasse zur Verfügung, mit der die Fehlerbehandlung und das Auffinden von Fehlern vereinfacht werden soll. Um diese verwenden zu können ist noch immer ein Try-Catch in jeder Methode notwendig. Von der Methode selbst ist nur der Name erhalten, um weitere Informationen zu erhalten, müssten diese in jeder Methode einzeln eingebaut werden. Auch ohne die weiteren Informationen manuell einzubauen, kann von den Entwicklern leicht „vergessen“ werden ein Try-Catch in die Funktion einzufügen. Aus diesem Grund bietet die Solutons2Share.Common bereits einen Aspekt an, der das Logging für die Methoden der Applikation übernimmt. Im Fehlerfall wird automatisch die ExceptionHandling-Klasse, wie bereits im vorherigen Artikel beschrieben, aufgerufen und durchgereicht, wodurch sich der Entwickler bereits das Try-Catch sparen kann, bzw. es immer automatisch implementiert ist. Dadurch werden jedoch nur der Name der Methode und die Fehlermeldung an sich protokolliert. Zur schnellen Auffindung des Fehlers sind häufig mehr Informationen gewünscht oder auch benötigt, die so nicht erhältlich sind oder nur mit Aufwand separat eingebaut werden können.
Durch den Methoden-Aspekt kann nicht nur auf einen Fehlerfall reagiert, sondern auch auf den Ablauf der Methode selbst zugegriffen werden.
Dadurch haben wir die Möglichkeit sämtliche Parameter der Methode oder Funktion mit ihren jeweiligen Werten auszulesen und zu protokollieren, wodurch der Programmierer direkt erfahren kann, mit welchen Parametern die Methode aufgerufen wurde und diese evtl. nachstellen.
Dies ist nur ein Beispiel für Aspektorientierte Programmierung, aber hier bietet die Solutions2Share.Common bereits eine Hilfs-Klasse über die neben dem Fehlerfall auch der Aufruf und die Laufzeit der Methode festgehalten werden können.