Skip navigation
1 2 3 Previous Next

Developer

162 posts

JW17_Developers_lockup.png

 

We are just around the corner from JiveWorld17//Developers and we wanted to take a moment to share the latest details on what to expect!  We hope that every developer will take advantage of this new format and opportunity to learn about Jive's game changing platform and architecture, and we look forward to seeing you there!

 

REGISTER TODAY

Interested in bringing a group of developers, new to JiveWorld or a previous JiveWorld attendee? 

Reach out to jiveworld@jivesoftware.com for potential discounts!

 

What's New / Changes

For those who attended JiveWorld16 Developer Conference ... It's a Wrap!, you will notice that we've taken your feedback to heart and made some changes to make the experience even more valuable.

 

Bringing the Developer Sessions to the Developers ... More Time to Hack

Some of the most common feedback we have received over the past few years is how to find more time to hack / develop given the packed agenda.  Historically, we have had the Hacker Lounge in one location with separate rooms for Developer presentations.  This year, we are going to try something different:  All Hacker Lounge ... All the Time! We have enlarged our Hacker Lounge and equipped it with ~20 tables (with power) and chairs for people to not only hack/develop, but also listen to Developer presentations without having to leave their seat.  Not only will this help developers have more time to hack, it will centralize Jive experts around a single location at all times.

 

More Interactive Developer Experiences and Tutorials

Last year's Tri-Force Arcade Themed Challenges were received with an exceptionally positive response.  This year, we are going even bigger.  Check out the Jive Derby (below), to learn more about an interactive development experience coupled with an open-sourced Jive integration running at JiveWorld17!  Throughout the Hackathon and developer conference we will help walk you through a real-world Jive integration that follows many of the Common Jive Add-On Use-Case Patterns that we've been teaching in our Jive Developer Days > Coming to a City Near You! sessions.

 

New Shirt ... New Tri-Hackathon ... New Hacker Lounge Sponsor!

jw17-hacker-shirt.png
JW17_Hackathon_Graphic-Teal.png

JiveWorld17 Tri-Hackathon

Last year's Tri-Hackathon format was well received, but we wanted to keep things fresh. On May 1st, we have our annual pre-conference hackathon in the Hacker Lounge.  The Hacker Lounge opens at 10:00am with  Pizza/Beer/Sodas being served from 12:00-5:00pm.

 

Are you not sure what to hack on, have questions about the Jive developer platform, or wanting to learn how to do something specific?  Throughout the hackathon (and the conference) our team of Jive experts will be available to listen to your requirements and guide you in the best possible direction.  Due to popular feedback from our Jive Developer Days program, we will do ad-hoc deep-dives on specific developer topics in a presentation or small group.

 

Hacker Lounge Sponsor - Silicon Labs

This year, we have the semi-conductor company Silicon Labs sponsoring our Hacker Lounge and we're going to be using their Thunderboard Sense for part of our Jive Derby and show you how easy it is to combine IoT and Jive. The Thunderboard Sense offers a variety of sensors in a small and power-efficient package and communicates over Bluetooth 4.2.

 

 

If you wanted to get started early and buy your own sense board, check out Thunderboard React Kit | Silicon Labs for the source code for iOS and Android.

silicon-labs-logo.png

 

Jive Derby (Code & Race)

      

JiveDerby-JW17-Lockup.png

  • Build a LEGO race car worthy of your hacker roots and enter the Jive Derby!
  • Build your own Jive Activity integration in the Hacker Lounge using the Jive Derby activity feed!
  • Interactive sessions deep-diving into the real-world solutions built using Common Jive Add-On Use-Case Patterns including open-source code from a real-world solution to kick start your next integration!

 

See On Your Mark ... Get Set ... Let's Derby (and Win an NES Classic)!  for more details!

Want to Get a Head Start on Your Jive Development Experience?

Integrations the Jive Way : Pre-Conference Workshop

Add-ons make it easy to create simple integrations with your existing systems of record. Learn about the Jive-SDK (Node.js) integration options and when to use them.

Try your hand at creating a simple stream integration, apps, and tiles. Having attended this session, you’ll be ready to complete coding challenges in the Hackathon!

Instructor: Jez Martin

 

REGISTER HERE

 

NES Classic (Games)

We'll have a dedicated TV w/NES Classic + 2 controllers in the Hacker Lounge available for recreational use during the Tri-Hackathon, Receptions and Conference Breaks.

 

How good are you at Dr. Mario, or any other of the games on the NES Classic?  Throw down a challenge in the JiveWorld17 group and see who reigns supreme!

nes-classic-edition-box.pngDr._Mario_(NES)_(NA).png

Developer Sessions & Town Hall

The JiveWorld17//Developers is all about three key principles:

  • Educate developers on the latest Jive platform capabilities and tools
  • Share guidance on upcoming developer features, experiences and use-cases
  • Collect feedback on developer platform direction to insure relevance

 

From the kick-off session to the closing Town Hall, Ryan Rutan, Rashed Talukder and other Jive engineering experts will be available to make sure you leave JiveWorld17//Developers with a clear direction on how to best build on the Jive platform.  Stay tuned to the JiveWorld17 Agenda and JiveWorld17 Mobile App for the latest in schedule times and updates.

 

We look forward to seeing you there, and please let us know if you have any questions!

THE EVENT HAS BEEN CANCELLED!

Dev_Plane_Bay_Area.png

 

For our second round of the second series of our Developer Days, we're landing in the Pacific time zone to not only celebrate National Bavarian Crepes Day, but to explore developing middlewared Jive add-ons. In this series, we'll be covering how to create an external middleware'd Jive Activity Integration and also the different types of webhooks that Jive provides and some use cases that are popular.

 

How To Register

  1. Make sure your e-mail address in your profile is up-to-date and correct
  2. Please comment below with your firstName + " " + lastName + ", " + company
  3. ****If your organization's internal policies do not allow you to post on public forums, please feel free to message/e-mail me or Ryan Rutan and we'll take care of it.

 

  1. You must register yourself, and yourself only. You cannot register in someone's behalf. It not only keeps it fair for everyone, but also ensure we have a way to communicate and everyone has access to all the tools we'll be using (e.g. Jive Sandbox).
  2. Since we want to be able to reach as many organizations as possible and seating is limited, we are capping registration to 3 per organization and anyone beyond that will be placed on the waitlist. After registration closes, if there's space available, they'll be moved to be a registrant.
  3. Registration closes March 20th 5p.m. PST. We need a minimum of 10 people registered to attend to hold the event.

 

Event Details

  • March 22, 2017
  • 12:30p.m.-3:00p.m. PST
  • via GoToMeeting (specific meeting details will be given day before event via e-mail)

 

Prerequisites

Everyone must have all the required software installed from Jive Developer Days Installfest

prior to joining the session. I will be posting up a document detailing everything with instructional video to make it as easy for everyone as possible & all registrants will get a reminder link.

 

What You'll Gain

 

Registered

NameOrganization
You!

 

Waitlist

NameOrganization

We kicked off the year with a progression in our Developer Days event to move forward and explore a Middleware use-case — specifically WebHook Bi-Directional Sync with an Activity Stream — and work through two built-in examples with the Jive Node SDK (example-webhook and activity-stream) and put the two examples together to post activities into Jive, retrieve a content webhook back and log the response that can be retrieved in a pre-defined endpoint.

 

By attempting to work through this use-case, we discovered a some challenges along the way that needed to be addressed with both the platform and some potential changes to the SDK that needs to be made.

 

The main one being that a content webhook can be narrowed to listen to just one piece of content with a /content endpoint reference URL. However, an ext stream doesn't include that, so we needed to have a noiser webhook (event type: "extStreamActivity") and filter out the specific Activity in our middleware for future syncing.

 

 

For those who attended, below are snippets of changes we made to the activity-stream example:

• Update /services/services.js (add below BootStrap) 

/**** HANDLES CALLBACK FROM ACTIVITY PUSH ****/

exports.eventHandlers = [



  'event' : jive.constants.globalEventNames.ACTIVITY_PUSHED,

  'handler' : function (context) {

    console.log('****','ACTIVITY PUSHED',context);



  'description' : 'Check for Activity Pushed'

}

]; // end 

• Update /services/DevDaysWebhooks/backend/routes/explicit_routes.js  line #41 

   /**** LOOKS UP THE CONTENT OBJECT TO GET FULL DETAILS ***/

              //NOTE:  YOU CAN ALSO LOOKUP VIA THE WEBHOOK DEFINITION
              jive.community.findByTenantID(req.headers["x-tenant-id"]).then(
                function(community) {
                    if (community) {
                      jive.community.doRequest(community,{
                         /*** NOTE: THE SILENT DIRECTIVE THIS WILL PREVENT THIS REQUEST FROM COUNTING AS A READ ***/
                         "url" : activity["activity"]["object"]["id"]+"?directive=silent",
                         "method" : "GET",
                         "headers" :  {
                             "content-type" : "application/json"
                         }
                       }).then(
                        function(success) {
                          var content = success["entity"];
                          console.log('Your External ID is:',content["externalID"]);
                        }, function(error) {
                          jive.logger.error("UNABLE TO GET OBJECT DETAILS",error)
                        }
                      );
                    } // end if
                } // end function
              );



• jive-sdk build … re-install.  Re-configure your webhook Tile. 

• Talk about /services/DevDaysWebhooks/backend/routes/oauth/sampleOAuth.js

• Start/Stop Service


○ HACK:  Copy /db/tokens.json {  "accessToken" : {} } to /db/community.json {  "oauth" : {} } 

Install Activity Tile … configure to "on" and Save

Hack_Tour_Plane_nyc.png

Happy New Year everyone!! To start the new year right, we're kicking off our second series of our Developer Days to help teach the next chapter of Jive Integrations. In this series, we'll be covering how to create an external middleware'd Jive Activity Integration and also the different types of webhooks that Jive provides and some use cases that are popular.

 

How To Register

  1. Make sure your e-mail address in your profile is up-to-date and correct
  2. Please comment below with your firstName + " " + lastName + ", " + company

If your organization's internal policies do not allow you to post on public forums, please feel free to message/e-mail me or Ryan Rutan and we'll take care of it.

  1. You must register yourself, and yourself only. You cannot register in someone's behalf. It not only keeps it fair for everyone, but also ensure we have a way to communicate and everyone has access to all the tools we'll be using (e.g. Jive Sandbox).
  2. Since we want to be able to reach as many organizations as possible and seating is limited, we are capping registration to 3 per organization and anyone beyond that will be placed on the waitlist. After registration closes, if there's space available, they'll be moved to be a registrant.
  3. Registration closes January 27th 5p.m. EST

 

Event Details

  • January 31, 2016
  • 12:30p.m.-3:00p.m. EST
  • via GoToMeeting (meeting specific details will be given day before event via e-mail)

 

Prerequisites

Everyone must have all the required software installed from Jive Developer Days Installfest prior to joining the session. I will be posting up a document detailing everything with instructional video to make it as easy for everyone as possible & all registrants will get a reminder link.

 

What You'll Gain

 

Registered

NameOrganization
Scott HurreyBlackboard
kbassBluegrass Care Navigators
Sameer VasudendraCapital One
Tracy ChapmanCapital One
Raj VachhaniCommvault Inc.
Himanshu DhuperDBGT
Ashish SatapathyDeutsche Bank
Gopi Shiva Krishna GEuropean Commission
Jens Goldhammerfme AG
Vikas MathurJM Family Enterprises
Steven SchmidtLogitech
dshiferawReingold
kretzschrT-Systems Multimedia Solutions GmbH
Lars KreiszT-Systems Multimedia Solutions GmbH
Mirko SwillusT-Systems Multimedia Solutions GmbH
You!

 

Waitlist

NameOrganization

The last several weeks I was implementing a new custom view tile to show discussions in a forum like manner.

 

 

Features

- show discussions with subject, author, creation date and place as a tile in page places

- showing metadata like number of likes, views, replies and bookmarks

- filter discussions by search for author names, subject and dates and mark results in the table

- html content previews for the discussion, the latest reply and the correct answer, loaded on demand when hovering the specific columns

- sorting of loaded discussions for (almost) all columns (client side sorting as Jive only supports server side sorting for fields title, latest activity and creation date)

- several configuration options (part not finished yet)

- show/hide columns

- layout of table

- tile name

- number of discussions shown

- filter for unanswered/answered questions

 

Implementation details

- Using the Jive REST API the tile will load more than 100 discussions at once (if necessary) in a batch and afterwards load only the latest reply of each discussion in a osapi batch call to reduce api calls to Jive.

- I am only requesting the data needed from the JIVE REST API by using the fields parameter. If the place where the discussion is created in should not be shown, I will not request it to save traffic and waiting times.

- Content preview is loaded on demand because the html preview can be very big and would increase waiting times.

Technologies

- Jive SDK based on NPM

- Jive custom view tile technology

- Jive REST API via osapi library

- JQuery plus some addons

- Datatables

- JBOX library

 

Screenshots

 

search_and_mark2017-01-04_16-07-38.png

 

discussion_preview_2017-01-04_15-01-22.png

 

latest_reply_2017-01-04_15-02-02.png

 

correct_answer_preview_2017-01-04_15-02-39.png

 

 

Feedback

I want your feedback- please share your ideas, questions and hints!!

 

What do you think?

 

Thanks

Jens

This is the second bookmarklet we use to help with our work on element14 Community. If you're not sure what bookmarklets are, I explain them in this other blog post; Bookmarklet for displaying Jive content IDs

 

This bookmarklet will display a panel containing the page metadata which is handy for SEO-related tasks. Here's how it looks on JiveWorks;

 

 

And here's how it looks on element14 Community, where we've got extra items like the canonical URL being included across the site, the Open Graph protocol, etc;

 

 

The JavaScript for this bookmarklet is here;

 

javascript:var html='';function encode(r){return r.replace(/[\x26\x0A\x3c\x3e\x22\x27]/g,function(r){return "&#"+r.charCodeAt(0)+";";});}var canonical=$j('link[rel=canonical]');if(canonical.length>0)html+=encode('<link rel="canonical" href="'+$j('link[rel=canonical]')[0].href+'">')+'<br>';html+=encode('<title>'+$j('title').html()+'</title>')+'<br>';var meta=$j('meta');for(var i=0;i<meta.length;i++){if(!meta[i].itemprop){html+=encode(meta[i].outerHTML)+'<br>';}}$j('.e14-page-info').remove();$j('body').prepend('<div style="border:1px solid grey; height:auto;; font-size: 10px; padding: 5px; position: fixed; display: block; top: 10px; left: 10px; z-index: 10; background: white;" class="e14-page-info">'+html+'</div>');void(0);

 

If you're interested in the uncompressed source, here it is (to use this in a bookmarklet, you'll need to run it through a service like this);

 

var html = '';

function encode(r) {
  return r.replace(/[\x26\x0A\x3c\x3e\x22\x27]/g, function(r) {
  return "&#" + r.charCodeAt(0) + ";";
  });
}

html += encode('<link rel="canonical" href="'+$j('link[rel=canonical]')[0].href+'">')+'<br>';
html += encode('<title>'+$j('title').html()+'</title>')+'<br>';

var meta = $j('meta');
for (var i=0; i<meta.length; i++) {
  if (!meta[i].itemprop) {
  html += encode(meta[i].outerHTML)+'<br>';
  }
}

$j('.e14-page-info').remove();
$j('body').prepend('<div style="border:1px solid grey; height:auto;; font-size: 10px; padding: 5px; position: fixed; display: block; top: 10px; left: 10px; z-index: 10; background: white;" class="e14-page-info">'+html+'</div>');

void(0);

This is something we've been using on our site for a while; I've updated the code so that I can share it with fellow Jive developers. Bookmarklets are browser bookmarks that contain JavaScript code. When you click the bookmark, it'll run the JavaScript against the page you're looking at, which comes in really handy!

 

What I've developed here is a bookmarklet that will display a panel at the top left of your Jive site.. the panel will contain the IDs of the content & Place you're looking at, and give you links to the full JSON object via a REST call. This kind of thing is really handy if you're regularly working with the REST API.

 

Here's how it looks;

 

 

1. Create a new bookmark

 

2. Edit the bookmark and paste in the JavaScript below

 

 

3. Go to your Jive site (or JiveWorks) and click the bookmark to display the panel

 

Here's the JavaScript...

 

javascript:var html='';var currentContainerID=window.jive.global.containerID;var currentContainerType=window.jive.global.containerType;var currentContainerName='';if(typeof(e14CurrentContainer)!=='undefined')currentContainerName=e14CurrentContainer.name;var contentInfo=$j('.jive-content:first');if(contentInfo.length==0||typeof(contentInfo.data('object-id'))==='undefined')contentInfo=$j('.bookmark-controls');if(contentInfo.length>0){var contentID=contentInfo.data('object-id');var contentType=contentInfo.data('object-type');if(typeof(contentID)==='undefined'&&typeof(e14CurrentObject)!=='undefined'){contentID=e14CurrentObject.id;contentType=e14CurrentObject.objectType;}if(typeof(contentID)!=='undefined'){html+='Content type: '+contentType+', ID: '+contentID+'. ';html+='<a href="'+_jive_base_url+'/api/core/v3/contents?filter=entityDescriptor('+contentType+','+contentID+')" target="_blank">REST</a>';html+='<br>';}}html+='Container type: '+currentContainerType+', ID: '+currentContainerID;if(jive.global.containerBrowseId>-1)html+=', Browse ID: '+jive.global.containerBrowseId;if(currentContainerName!=='')html+=', Name: '+currentContainerName+'.';if(currentContainerType!=3){html+=' <a href="'+_jive_base_url+'/api/core/v3/places?filter=entityDescriptor('+currentContainerType+','+currentContainerID+')" target="_blank">REST</a>';}else{html+=' <a href="'+_jive_base_url+'/api/core/v3/people/'+currentContainerID+'" target="_blank">REST</a>';}html+='<br>';$j('.e14-page-info').remove();$j('body').prepend('<div style="border:1px solid grey; height: 25px; font-size: 10px; padding: 5px; position: fixed; display: block; top: 10px; left: 10px; z-index: 10; background: white;" class="e14-page-info">'+html+'</div>');void(0);

 

If you're interested in the uncompressed source, here it is (to use this in a bookmarklet, you'll need to run it through a service like this);

 

var html = '';

var currentContainerID = window.jive.global.containerID;
var currentContainerType = window.jive.global.containerType;

var currentContainerName = '';
if (typeof(e14CurrentContainer)!=='undefined') currentContainerName = e14CurrentContainer.name;

var contentInfo = $j('.jive-content:first'); // Try the jive-content class first
if (contentInfo.length==0 || typeof(contentInfo.data('object-id'))==='undefined') contentInfo = $j('.bookmark-controls'); // Next try the social action link

if (contentInfo.length>0) {
  var contentID = contentInfo.data('object-id');
  var contentType = contentInfo.data('object-type');

  // We can get at blog container if we're on element14 Community 
  if (typeof(contentID)==='undefined' && typeof(e14CurrentObject)!=='undefined') {
  contentID = e14CurrentObject.id;
  contentType = e14CurrentObject.objectType;
  }

  if (typeof(contentID)!=='undefined') {
  html += 'Content type: '+contentType+', ID: '+contentID+'. ';
  html += '<a href="'+_jive_base_url+'/api/core/v3/contents?filter=entityDescriptor('+contentType+','+contentID+')" target="_blank">REST</a>';
  html += '<br>';
  }
}

html += 'Container type: '+currentContainerType+', ID: '+currentContainerID;
if (jive.global.containerBrowseId>-1) html+=', Browse ID: '+jive.global.containerBrowseId;
if (currentContainerName!=='') html += ', Name: '+currentContainerName + '.';
if (currentContainerType!=3) {
  html += ' <a href="'+_jive_base_url+'/api/core/v3/places?filter=entityDescriptor('+currentContainerType+','+currentContainerID+')" target="_blank">REST</a>';
} else {
  html += ' <a href="'+_jive_base_url+'/api/core/v3/people/'+currentContainerID+'" target="_blank">REST</a>';
}
html += '<br>';

$j('.e14-page-info').remove();
$j('body').prepend('<div style="border:1px solid grey; height: 25px; font-size: 10px; padding: 5px; position: fixed; display: block; top: 10px; left: 10px; z-index: 10; background: white;" class="e14-page-info">'+html+'</div>');

void(0);

gala_tile.png

 

We have some exciting news to share for Jive Cloud customers! There was a lot of requests to increase the performance of Custom View Tile's load times and to satisfy that without compromising security, we're presenting the new Gala service to replace Shindig. What lets Gala work is better caching and loading from a different domain CDN than your Jive instance. The results of this is a perceived up to 30+% faster loading times than before!!!

 

How do you enable the new Gala service?

Admin Console > System > Settings > New Features > Lightweight Custom Tiles

We will be enabling GALA service in the official Jive Sandbox in the near future for you to test out yourself mid-December. This post is just to give everyone a heads up.

 

How to check if Gala is admin enabled inside add-on?

There will be a globally available gala object. So in your included javascript:

if(gala && typeof gala === "object"){
     // Do Gala specific stuff
}

 

What do I need to do differently?

Since Gala loads the assets from a domain other than your main Jive site into an iFrame, you won't be able to read the window.location or window.parent.location. So to help solve that, we've introduced two new methods that are available whether Gala is enabled or not—jive.tile.getAppURL() and jive.tile.getJiveURL(). An example of getting the add-on's URL before Gala and after is below:

 

// Old way to get Add-on URL
function getAddonURL(){
     var matches = window.location.href.match(/.*?[?&]url=([^&]+)%2F.*$/);
     if (matches.length === 2){
          return decodeURIComponent(matches[1]);
     } else{
          return ''; 
     }
}

 

// New GALA way to get Add-on URL
function getAddonURL(){
     if (gala && typeof gala === "object"){
          return jive.tile.getAppURL();
     }
}

Just a friendly note because this is the second time (at least) that I've run into this problem and it is very frustrating and unintuitive to resolve.

 

We are on a hosted instance (7.0.3) and have several custom macros built. These load some javascript to do their thing (display a video player, dynamic tables, etc.). I was just refactoring our code and extracted some javascript out from being generated in the Macro Java class to loading from a js file because it was soooo much easier to debug and tweak etc.

 

Well, then we noticed that our Overview Pages would fail to load the Layout/Widget Panel when editing and instead would just get stuck on the 'Loading' spinner graphic.

 

I narrowed it down to only when a document which contained the macro I just modified was being loaded in a View Document widget. Not just that, but only when MULTIPLE of these macros were in that document.

 

Very curious I thought.

 

So after flailing around for a while, having a good yell at the computer, it finally dawned on me that I had seen this happen before with another macro that I also "simplified" a year or so ago.

 

What I recalled then, was that it was a problem with how the widgets are loaded "safely" when in Overview Page edit mode. What this does is extract all the scripts  and then load them dynamically or something weird. The problem is that if it hits the same script src url twice, it chokes and fails silently. What a nice "safe" feature.

 

Problem is that the Widget Panel is waiting on that safelyLoad call to return before removing the loading placeholder.

 

Now for the solution. Instead of loading this js file with the macro itself, I added a reference to it in header.soy. Lame, that means it will be loaded on every page, but it fixes the problem. Downside is that it loads a few more KB on each page that doesn't need that javascript, but because of what is in the js file, there is no detrimental effect to functionality.

 

Anyway, hope this helps you not struggle for a couple hours like I did (multiple times). And hopefully, it will help me not do the same next time.

 

Cheers,

Scott

Hack_Tour_Bus_austin.png

 

This is our LAST Developer Days event for the year, and to make sure as many people can attend as possible that might have missed out on prior events—and the success we felt from The European Dev Days event—we will be making this one hosted virtually on GoToMeeting. We'll be covering our Jive middleware-less stories and best practices in a lecture + hands-on hack session where we'll create integrations together that solve real business use cases, and answer your questions along the way.

 

Event Details

Since we want to be able to reach as many organizations as possible and seating is limited, we are capping registration to 4 per organization and anyone beyond that will be placed on the waitlist. After registration closes, if there's space available, they'll be moved to be a registrant.

 

  • November 17, 2016 — 1p.m.-3p.m. CST
  • November 18, 2016 — 1p.m.-3p.m. CST
  • via GoToMeeting — URL will be sent after registration closes.
  • Attendee limit of 25
  1. You must register yourself, and yourself only. You cannot register in someone's behalf. It not only keeps it fair for everyone, but also ensure we have a way to communicate and everyone has access to all the tools we'll be using (e.g. Jive Sandbox).
  2. Since we want to be able to reach as many organizations as possible and seating is limited, we are capping registration to 4 per organization and anyone beyond that will be placed on the waitlist. After registration closes, if there's space available, they'll be moved to be a registrant.

 

What You'll Gain

 

Prerequisites

Everyone must have all the required software installed prior to joining the session. (See: Jive Developer Days Installfest )

 

How To Register

  1. Make sure your e-mail address in your profile is up-to-date and correct
  2. Please comment below with your firstName + " " + lastName + ", " + company

 

 

Registered

NameCompany/Organization
saurabh.v.singh@schwab.comCharles Schwab & Co., Inc.
almore.catoCox Automotive
Rachit Chaudhary
Oracle India Pvt Ltd
jayjayprodOrange
pushpendra.paliwal@orange.com
Orange Business Services
eramitpshah
IonIdea
Kranthi Kiran Chiluveru
S&P Global
Samee K STechMahindra
Micah MarkmanReingold
dshiferawReingold
YOU!

 

Waitlist

You will be placed on the waitlist if we reach capacity of 25, or if more than 4 individuals are registered with your company. If there is space after registration closes, your status will change to registered and you'll be e-mailed event details. If you really really want to go and are on the waitlist, send me an e-mail and I'll see what we can do.

NameCompany/Organization

For some time now, we've been wishing for an easy way to update the URLs for Places. Sometimes we name a Place in a hurry and later come up with a better name. Jive allows us to change quite a bit about a Place, but currently, changing the "displayName", the name that appears at the end of the Place's URL, is impossible through Jive's web interface and the Admin Console. It is only possible via the Jive REST API which, frankly, isn't quite that convenient for busy Community Administrators.

 

To fix this problem of inconvenience, I've created a .NET app (code included below) that allows administrators to quickly update a Place's displayName using Jive's .NET SDK. To update a Place, one must simply log in to their Jive account through the app, select the Place whose URL they would like to change, and provide a new displayName for the Place.

 

When we implemented this functionality for our Jive instance, we wrapped this app in an ASP.NET Web API controller, hosted the code on a web server, and created a web app that makes requests to the hosted app. This allowed us to build a UI that further simplified the process of updating Places. For the sake of simplicity, here I am only sharing the C# code for the app. But note that this can be easily built on top of.

 

Here is the code for the .NET app:

 

using System.Collections.Generic;
using Net.Pokeshot.JiveSdk.Models;
using Net.Pokeshot.JiveSdk.Clients;
using System.Net;
using System;


namespace PlaceUpdaterConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string jiveUrl, username, password;


            // Get User/Site Info.
            Console.Write("Jive Community Url: ");
            jiveUrl = Console.ReadLine();


            Console.Write("Jive Username: ");
            username = Console.ReadLine();


            Console.Write("Password: ");
            password = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine();


            var creds = new NetworkCredential(username, password);


            // Get a list of places available.
            PlacesClient p = new PlacesClient(jiveUrl, creds);
            var places = p.GetPlaces(count: int.MaxValue);
            printPlaces(places);


            var selectedPlace = selectPlace(places);
            Console.WriteLine("Current URL for {0}:\n{1}", selectedPlace.name, selectedPlace?.resources?.html?.@ref);


            string url = selectedPlace?.resources?.html?.@ref;
            int lastSlash = url?.LastIndexOf('/') ?? 0;
            Console.Write("\nNew URL:\n{0}", url.Remove(lastSlash + 1, url.Length - lastSlash - 1));
            string displayName = Console.ReadLine();


            // Update the display name of the place the user selected.
            selectedPlace.displayName = displayName;


            Console.Write("\nChange {0}'s URL? (y/n): ", selectedPlace.name);
            var isCorrect = Console.ReadLine();
            if (isCorrect != "y" && isCorrect != "Y")
            {
                Console.WriteLine("\nOperation Canceled");
                return;
            }


            // Send the newly updated Place back to Jive.
            p.UpdatePlace(int.Parse(selectedPlace.placeID), selectedPlace);


            Console.WriteLine("\nSuccessfully Updated");


            Console.ReadLine();
        }


        private static GenericPlace selectPlace(List<GenericPlace> places)
        {
            string isCorrect;
            GenericPlace selectedPlace;
            do
            {


                Console.Write("\nSelect a PlaceId from the list above: ");
                string placeId = Console.ReadLine();
                selectedPlace = places.Find(x => x.placeID == placeId);


                Console.Write("You selected {0}. Is this right? (y/n): ", selectedPlace.name);
                isCorrect = Console.ReadLine();
            } while (isCorrect != "y" && isCorrect != "Y");
            Console.WriteLine();


            return selectedPlace;
        }


        private static void printPlaces(List<GenericPlace> places)
        {
            int columnWidth = 26;


            Console.WriteLine(" {0,-" + columnWidth + "} | {1,-" + columnWidth + "} | {2,-7} | {3, -7} ", "Place Name", "Display Name", "Type", "placeId");
            Console.WriteLine(new String('-', columnWidth * 2 + 7 + 6 + 11));
            foreach (var place in places)
            {
                Console.WriteLine(
                    " {0,-" + columnWidth + "} | {1,-" + columnWidth + "} | {2,-7} | {3, -6} ",
                    place?.name?.Length > columnWidth ? place.name.Remove(columnWidth - 3, place.name.Length - columnWidth + 3) + "..." : place.name,
                    place?.displayName?.Length > columnWidth ? place.displayName.Remove(columnWidth - 3, place.displayName.Length - columnWidth + 3) + "..." : place.displayName,
                    place?.type,
                    place?.placeID
                    );


            }
        }
    }
}

 

I hope someone else finds this useful.

 

Intro

To start a new initiative and provide examples for developers, we're going to start putting out some Jive integrations that we believe provide some benefit to our customers and you—the developers. These are open source projects under the apache 2.0 license and free to be used as they stand or as a baseline for your integrations. We'll be keeping these projects in the jiveapps/addons at master · jivesoftware/jiveapps · GitHub repo.

 

So what is LiveStream? It's a event video platform that's used by companies both big and small to provide event coverage. So a natural use case for it is a company event (like JiveWorld17!) to provide coverage to anyone who can't be at the event in person; or even for company-wide meetings.

 


 

GitHub Repos:


 

Data Flow:

This project integrates Livestream API's to bring a LiveStream live feed feed into Jive. It has the following core functionalities and data flow:

 

 

Custom View Tile (Middlewared)

Screen Shot 2016-09-26 at 6.18.25 PM2.png

Screen Shot 2016-09-26 at 5.17.53 PM.png

  • Middleware Fetches LiveStream Upcoming Events API and pushes the array of events to Tile Config
    • Can be set for other endpoints—was developed and tested on the Private Events endpoint
  • Tile Configuration window displays event to be selected to be displayed on the view window
  • Tile Configuration window has optional field to place the Simple Stream Integration's (SSI) listener URL
  • Middleware reads the saved configuration and if any event has their "isLive" parameter set to true AND a SSI listener URL was entered in the tile's configuration, it generates an activity with the SSI
  • Comments are pulled in from the activity that is related to the event being displayed in the tile and displayed
    • Comment text has link back to the comment itself in the external object
      • The user can see the all comments and continue collaboration and participate in the communication
    • If there is no activity generated, no comments are displayed

 


 

Simple Stream Integration w/ App (non-Middleware)

Screen Shot 2016-09-26 at 6.17.39 PM.png

Screen Shot 2016-09-26 at 6.17.17 PM.png

 

  • The middleware from the Custom View Tile generates activities for each event that goes live
  • The activity has an associated external object
    • The external object has an embedded app
    • External object video is larger and has full collaborative Jive experience (like, comment, share, mark for outcome)
  • App shows the live video that's associated with the video event that generated the activity

 


 

Extra

  • There is an extra file for getting an authentication token at your service's /tokens endpoint by performing a GET request—should you build something that needs to do more with LiveStream's API's

 


 

Considerations

  • This was written using mostly ES6 JavaScript, so it will only work on newer browsers
  • LiveStream currently doesn't offer webhook's so the custom middleware service is a necessity
  • Jive's Node.js SDK's jive.util.base64Encode() method does not work for API key/string only authentication
  • There are two archive files to install into Jive! This is because one service requires middleware and the other doesn't
  • I would have really liked to split up my services.js into three separate classes—LiveStream API's, Custom View Tile data pusher, SSI Activity Generator—if you have the free time or desire to make a pull request, I'll review and commit.

 


 

Initial Setup Requirements

Screen Shot 2016-09-26 at 9.58.50 PM.png

  1. Have a LiveStream account and some videos set to go live in the future
  2. In /jiveclientconfiguration.json, you'll see an object called "livestreamCredentials"—fill in all the fields
    • Look here Livestream Developers | API Dashboard for Client ID & API Key (dashed lines in the picture above)
    • Account ID can be retrieved via API or from your Livestream Video dashboard in the URL of your browser
  3. Update your middleware service URL in /tiles/LiveStreamTile/public/javascripts/configuration.js
  4. In terminal, run npm update
  5. In terminal, run node app.js to start your service and generate a new .zip for your Custom View Tile
  6. Install the zip for both the Tile and the Simple Stream Integration into your Jive Instance
  7. Install and setup the SSI into your page first and copy the URL
  8. Install the tile to your page and paste the URL and select your upcoming public event
  9. Use the LiveStream desktop app and go live in your event and see your video feed in the tile and activity get generated

So we just concluded the Jive Developer Days series' first remote/virtual event based on a European audience and here's what happened!

 

We had a lot of people register and fill out the seats from small to large companies and organizations (Jive Developer Days 2016: European Edition — Register Today!). There was so much demand that we actually went ahead and extended our original seat limit of 25 to fit the extra 5 on the waitlist. Where the past two other events were in person and that makes developing much easier and we could dedicate several hours to working together without losing interest or feeling TOO overwhelmed, we thought we should change it for the remote event to two days and half the time per day — I think that was still a good call. But overall, I think everyone learned a lot, I enjoyed some of the laughs, saw some great questions and engagement from the attendees.

 

tl;dr

  • Presented the Jive Developer Platform story
  • Made the example App Reference app using jive-sdk create app
  • Made a RSS News Feed Custom View Tile (see attachment)
  • Made a Simple Stream Integration with the App Reference App embedded (see attachment)

 

Screen Shot 2016-09-16 at 11.08.39 AM.png

 

First Day

We started the first day by introducing the high level Jive Developer Story—the Add-on Framework, Mobile solutions, External Storage Framework, and the Jive Analytics Platform. What we wanted out of this is to expose both new and seasoned Jive Developers to the full gamut of platform offerings. Since awareness is sometimes the biggest obstacle, we hoped to open the doors to all the possibilities for developers to fully realize the Jive as a organization's Hub story.

 

Following after the overview, Ryan Rutan used the Jive Node.JS SDK to create the Introducing the Jive Developer App Reference "App" on the Developer Sandbox example app, and get an understanding of app action contributions to filter where an app can go and also see the context (where, the person viewing, and content being viewed) that is available for use to enrich the experience of the community.

 

Second Day

Screen Shot 2016-09-16 at 1.37.47 PM.png

The second day took the foundations we laid down the first day and expanded on them. We started off by creating a Custom View Tile that makes a OSAPI HTTP Get request to the sample Yahoo Query Language RSS feed URL and displays the 10 most recent news articles in the tile with links to the source. We also showed how to speed up our integration development times with Ngrok.

 

Screen Shot 2016-09-16 at 1.34.33 PM.png

After that, we created a basic Simple Stream Integration from our Simple Stream Integration Builder and demonstrated a simulated Activity being generated within Jive in minutes of starting the developing. After that, we embedded the App from the session prior into the generated activity's external object and also passed in all the request data that created the Simple Stream Activity that can be used to make a richer collaborative experience. There were some hiccups that we uncovered and are going to patch our SDK shortly (this is part of why we're doing these events—make sure everything is solid).

 

What's Next?

More developer days virtual events coming soon! We are taking feedback from this pilot event and we're going to provide better ways for people to follow along and try the material out in better detail at a later time.

Introduction

 

Webhooks are a powerful Jive feature that allow you to subscribe to events that occur in the system. For example, you can subscribe to all user account creations, or all the new documents that are created in a particular Place. The subscription basically tells Jive to send a JSON object (of the content you want) to whatever endpoint you've specified.

 

The Jive documentation mentions creating some kind of add-on/extension and subscribing using a Tile, but it's actually possible use a tool like Postman to talk to the Webhook REST API to register a hook, or manage all the webhooks that are set up on your Jive instance.

 

Note; we run our community in a /community sub-folder.. so if you're following this guide, take that into account for any URLs you're copying.

 

oAuth2 Add-On

 

The first thing you need to do is install a pretty generic oAuth2 add-on. This was originally provided in this document, but I've altered meta.json to have a callback URL linked to Postman. I've attached the add-on to this document.

 

Note; uninstalling the add-on will remove any webhooks you set up against it.

 

 

oauth1.png

 

Setting Up Postman

 

Next, you need to follow these steps to set up Postman to use an OAuth 2.0 access token.

 

oauth2.png

 

oauth3.png

 

PHP Debugger

 

As you can see, in step (9) I'm telling the webhook to talk to a PHP page. This is a dead simple debug page I set up to see what the webhook payload looked like, and to test that the whole thing was working. It'll send the contents of any request to a log file.

 

Here's the code;

 

<?php
    $todays_date = date("Y-m-d G:i:s");
    $requestBody = array2string($_REQUEST);
    $entityBody = file_get_contents('php://input');
    
    $fp = fopen("webhooks.log", "at");
    fwrite($fp, "$todays_date -> $requestBody --> $entityBody\n\n");
    fclose($fp);

    function array2string($data){
        $log_a = "";
        foreach ($data as $key => $value) {
            if(is_array($value))    $log_a .= "[".$key."] => (". array2string($value). ") \n";
            else                    $log_a .= "[".$key."] => ".$value."\n";
        }
        return $log_a;
    }    
?>

 

 

Further Reading

 

Webhooks API documentation

https://developers.jivesoftware.com/api/v3/cloud/rest/WebhooksService.html

 

The post which set me on the right track to get Postman to talk to Jive

https://community.jivesoftware.com/message/1588488

 

Original oauth2 add-on.

https://community.jivesoftware.com/docs/DOC-97348

Hack_Tour_Bus_Europe.png

 

When we were first kicking around the idea of Developer Days, we got a tremendous response and inquiry from the folks across the pond. We actually had no idea that would be the case, so we were trying to figure out how to take this content over there, and before we did that, we wanted to make sure we had a quality that was worthy of your requests. After our NYC and Bay Area, CA, USA events, we think we've got it. Thanks to the digital age, we've come with a solution and format that Ryan Rutan and I believe will work great.

 

This two day, two hours per day event will be webcast via GoToMeeting and is geared towards our European counterparts where we'll be covering our Jive middleware-less stories and best practices in a lecture + hands-on hack session where we'll create integrations together that solve real business use cases, and answer your questions along the way.

 

How To Register

  1. Make sure your e-mail address in your profile is up-to-date and correct
  2. Please comment below with your firstName + " " + lastName + ", " + company

(ha ha, get it? )

 

If your organization's internal policies do not allow you to post on public forums, please feel free to message/e-mail me or Ryan Rutan and we'll take care of it.

  1. You must register yourself, and yourself only. You cannot register in someone's behalf. It not only keeps it fair for everyone, but also ensure we have a way to communicate and everyone has access to all the tools we'll be using (e.g. Jive Sandbox).
  2. Since we want to be able to reach as many organizations as possible and seating is limited, we are capping registration to 3 per organization and anyone beyond that will be placed on the waitlist. After registration closes, if there's space available, they'll be moved to be a registrant.

 

Event Details

  • 13th September, 2016 — 1p.m.-3p.m. GMT
  • 15th September, 2016 — 1p.m.-3p.m. GMT
  • via GoToMeeting — URL will be sent after registration closes.
  • Attendee limit of 25

Registration closes 9th September, 2016 @ 7p.m. GMT

 

Prerequisites

Everyone must have all the required software installed prior to joining the session. I will be posting up a document detailing everything with instructional video to make it as easy for everyone as possible & all registrants will get a reminder link.

 

What You'll Gain by Attending:

 

Registered

NameCompany/Organization
neha.uniyalAccenture
Shipra SinghAccenture
Sowjanya GonuguntlaAccenture
danilANROM
davidhickey13Citi
mikeculshawCiti
Powell TruslerCiti
Swaran SinghCiti
rymerchoElement14
Dudley NelsonElement14
Matt CollingeElement14
Georgiana Adelina PopaEuropean Commission
Gopi Shiva Krishna GEuropean Commission
AxxxxxGoldman Sachs
GxxxxxxGoldman Sachs
Jiban PatroInfosys
creischlMetafinanz
Oliver ReeceMillward Brown
Stephan LeuendorffPokeshot///SMZ
Sven KroschwaldPokeshot///SMZ
Gareth JamesPwC
Matt DickensPwC
NelsonRobert Anthony DassScope
Lars KreiszT-Systems Multimedia Solutions GmbH
Mirko SwillusT-Systems Multimedia Solutions GmbH
YOU!

 

Waitlist

You will be placed on the waitlist if we reach capacity of 25, or if more than 3 individuals are registered with your company. If there is space after registration closes, your status will change to registered and you'll be e-mailed event details. If you really really want to go and are on the waitlist, send me an e-mail and I'll see what we can do.

NameCompany/Organization
pierce.currid@citi.comCiti
Akhila ShivakumarInfosys
arpan bansalPwC
Madhusudhanan VaradarajanCognizant
Gareth FerrierSurevine