Skip navigation
1 2 3 Previous Next

Developer

168 posts

We're all excited about the Enterprise-wide Search announced at JiveWorld17.

 

But what if you cannot wait?

 

Since I embarked on my career of architecting knowledge bases and search solutions, I've always seen them as going together. There seemed no point of having a central collaboration hub if it wasn't backed by a search engine which brought content in from various sources and allowed them to be searched from a single place. I've seen some organizations replace Jive Search completely, while others have attempted to plug in Search Engines as Bridged-Communities using the OpenSearch technology/format, which serves up search results back in Jive.

 

 

 

I've tried to tackle this problem with two approaches.

 

My first approach has been content syndication, where I imported and archived tickets and defects into my knowledge platform/collaborative intranet, where the contents of the source could be viewed/commented on from our collaborative intranet. Basically creating copies of all the source content in Jive - bypassing the need for a separate search engine.

 

My second approach was the aforementioned  - a separate enterprise search engine which is OpenSearch compatible, and can be plugged into Jive through Bridged Communities. Then one enterprise system at a time, one can develop adapters and search schemas for each system, mapping common search fields for better searching and filtering across systems.

 

But it is far from perfect. First, the results are only included if you press enter on a Spotlight search, which many people don't do.

Second, the OpenSearch protocol does not support Double-quotes for verbatim searches, which I believe many people are accustomed to.

 

Third, the results are not always pretty - when not properly implemented.

 

 

The internal Helpdesk team at Medidata asked us if we could make there content searchable from our Jive-intranet, but have it be consumed in Zendesk Help Center, because apparently this helps the agents see what a user read before creating the ticket.

 

After a little thought, we came up with a plan. It's similar to the previously mentioned content syndication integration, except it strips all the content formatting, and then sets the target Jive document format to be invisible to the user. It does this by setting the font color to white and font size set to 2 pixels.

 

 

 

We then add a big button that says "Are you looking for TITLE OF SOURCE DOCUMENT?", or in the case below "Click here to Access Document" which is a hyperlink to the source document in Help Center.

 

 

We call this the white-on-white approach.  The document in the screenshot has hundreds of words below the blue button but they are so small and the color is the same as the background so they are not visible to the user. It is worth noting that as Jive RTE auto-links emails, you will see small blue dots on documents with email addresses. But a work-around is to just replace @ with _at_.

 

Basically this solution makes Jive search engine of Zendesk.  It is a hack, but it works now allowing for Zendesk content to be searched from Jive Spotlight search

and then directing people to Zendesk HelpCenter.

 

Just a word to the wise, don't ever do this on an external Jive Community, it's considered SEO spam and will get you blacklisted by Google.  But it works great inside an Intranet.

 

To make this work in your community you can simply download the code, and set it up on your middleware server and set to a cron and your good to go. It keeps the "search pages" in sync with the source Zendesk Help center by deleting/update/creating the corresponding Jive document for the Help Center articles.

 

Of course we are still waiting with bated breath for Enterprise-wide search, but until we get that, why not implement this solution.  If you need help, feel free to comment below or reach out to me directly.

Before we get started on the New Chapter, I thought it might be prudent to share some of my experiences with the Old Chapter ... so here we go!

 

Backstory

I remember it like it was yesterday; 10 years ... 2 months and 1 week ago almost to the day.  I was working for National Instruments, and I just downloaded my first version of Jive ClearspaceX 1.0.1 about a week prior and realized that there was a small reference to "build your own widgets" buried in the Admin Console.  On June 5th, 2007, I created my Jivespace account (then Jive Community, now JiveWorks) to try and learn more.  It was a month or so, until I saw the developer community and made a mad-dash to the Developer Community.  It was there that I ran into the likes of Matt Tucker ajohnson1200 Stewart Wachs LG .  (who to this day, I still dont know what you look like ) Stephan Mueller-Ziebur (currently Pokeshot) and Graham Robson (a.k.a. magpie), and the conversations started to perk my interest to build some cool tech on the Jive platform.

 

Fast forward a year or so, my company's Jive ClearspaceX instance is solidly in production and a new Jive Clearspace (internal) instance in the works.  I decided to come back to the Developer community and give Jive development a go.  It is now 2009, the year of the first JiveWorld, and my first daughter was born on that Wednesday (this was the only JiveWorld I have missed to date).  In hopes of securing a speaker role in JiveWorld10, I released a flurry of my first public plugins ... Admin Essentials Plugin (name inspired by Derek DeMoro's previous work), UNC Link SBS Plugin,ICS Export Plugin and QuickTemplates - Plugin and then gave my presentation in the "Geek Out On Jive" Track (Note:  It wasn't even the Developer Track, yet) at JiveWorld10.  From that point on, I was hooked.  After talking to developers, customers and Jivers at the conference, I ran away with a ton of ideas and built the Document Lock - Plugin  SBS Widget Pack - Plugin and QuickLinks Plugin ... because the solutions just made sense, and I knew that people would like them.  People liked them so much, that I started Plugins by ryanrutan to try and manage feedback and communications around my work.  To this day, one of my favorite (and possibly nerdy and sadistic) memories was a challenge I made to myself to update all my plugins (at the time, it was about 13) from Jive 4.5 to Jive 5.0 in less than 24 hours.  I succeeded with time to spare with only one reported bug (pretty sure it was John Schwiller who reported it). micdrop =)

 

In October 2011, I joined Jive as the full-time community manager (see: And the new Jive Community Manager is …), but near and dear to my heart was always the Developer community.  I continued to share my plugin solutions that I used in the Jive Community, such as the Unsubscribe Email Plugin, Managed Snippets Plugin (my 2nd favorite all-time plugin), Ghost Blog Plugin and continued releases to the Admin Essentials Plugin.  It was during this time that Jive 6 was released, and I was forced to re-think my QuickTemplates plugin, because the new Jive architecture changes rendered it completely broken.  I had a midnight epiphany that turned into an all-night coding bender that led to the QuickTemplates v2 - Plugin  (see: Introducing the New and Improved QuickTemplates v2 for Jive 6! ), which is still my favorite plugin of all time.  A year later, I moved organizations to become Jive's Developer Evangelist, and started releasing content/features, such as: Do you know Jive-Fu?  It was around this time that you might remember me writing Future Direction for Plugins by Ryan Rutan and More ...  which marked the end (at-least in my mind) of an era in my life, and I became strictly focused on Developer Relations / Advocacy at Jive.  My goal was to try and do all I could to help others achieve similar levels of success on the Jive platform.  The rest is a bit more recent, and I wont hash it all the details from the past 3-4 years, but here are some notable ones to remember:

 

A New Chapter for Ryan Rutan at Jive

At this point, you might be asking yourself "Why all that backstory?".  Well, as you have guessed it ... this blog post marks another end to an era in my career.  As part of Jive's acquisition, I have been offered (and accepted) a new and interesting position as the Jive Professional Services Product Manager, where a large portion of my job will be to innovate on PS product solutions for the Jive platform to solve customer problems.  In a way, I see this as going back to my "original jive roots" in a way ... listening to customers ... being excited by innovation and actually seeing my solutions in the wild helping customers.  You may have seen my recent discussion (see: Looking for some feedback from some awesome community managers...=)) asking for customer feedback.  This was me doing what I do best (IMO), and that is listening to customers, identifying core product improvements and (my favorite) finding paths to innovation to solve problems.  As part of this role, I still intend to be "active" in the JiveWorks community; however, my attention and focus will be 100% on my new position and making a difference, which will sadly leave no time for responding to developer questions, technology partner questions, etc ... =\

 

To be 100% openly truthful, writing this blog post is one of the more bittersweet things I've ever had to write in my career/life.  I know personally it is time for a change and excited for what lies ahead, but I've made so many relationships and helped so many people in the Developer community it is difficult to take the next step.  Before I take those next steps, I wanted to call out some more people who come to top of mind as I reminisce over these past 10 years of my Jive Developer career and who made that experience exceedingly special!

 

Pawan Shah John Reynolds Jeff Maaks Roguen Keller Matt Collinge Christina Zurkawicz Nathaniel Elliott Jens Goldhammer pcrownov mikhalchuk Lea Reznik Ryan Schaller Brad Fitzgerald Nikhil Nulkar kkendjouh Brian Bezanson Doug MacKay mack_torres Dock Myrick Claire Flanagan Tracy Maurer Ted Hopton b.taub Matt Laurenceau Kim England Will Rose Cora Rodenbusch Heather Foeh Emilie Kopp Amanda Shenon nbussard Jez Martin Melissa Rosen Keeley Sorokti Jessica Maxson Edward Ford

 

I'm sure there are others who should be on this list, but there is still a whole other section to write ... so I've got to get going. =)  Please see "My Last Jive Developer Ask of You" (below)

 

A New Chapter for the Jive Developer Community

To get the innovation announced at JiveWorld17 to customers as soon as possible, it will require extreme focus and engineering resources.  With my transition to a new role and Rashed's recent departure (wishing him all the best in his new adventure), this puts the Jive Developer community in a new position where it will rely 100% on peer-to-peer support, until further notice.

 

If you are interested in volunteering community management time/expertise for the Developer Community, please visit the following document and comment on the timeframe for which you'd like to volunteer:

Volunteer Community Managers for Peer-to-Peer Places

 

As a result of this change, here are some questions I can think of that you might want answered:

 

  • Q: What will be the future of Jive Documentation?
    • A: Jive Documentation (REST API docs, etc...) will continue to be created by Engineering; however, the tutorials and blog posts created by Developer Evangelists will need to come from the community at large moving forward.
  • Q:  What will be the future of the Jive SDK and other open-source Jive projects?
    • A:  All projects will remain in open-source and continue to work (as-is) without official SLAs/support.  Developers are encouraged to use the community to answer questions.
  • Q:  Can we still @mention you for assistance?
    • A:  While I cannot stop you from @mentioning me (a curse of being the most followed person in JiveWorks ), there is also no way for me to guarantee a timely response (or response at all).  I will do my best (if it's a simple question) to respond back; however, it is recommended that you leverage Support Cases for official tracking of issues and Account Managers to escalate as needed should the Developer community be unable to assist.

Special thanks thanks to Stephan Mueller-Ziebur and his team at Pokeshot for helping update the SmarterPath Jive Developer Courses in JiveWorks over the past few quarters.  They aren't 100% finished, but they should be good enough to get you started and navigate all the content around the community.  Check them out, below our using the Course Catalog tab on the Developer home page.

icon128.png

Jive Developer : 01 : Introduction to Jive Add-Ons

Learn the basics of the Jive Add-On framework and how to get started with Jive Add-On Development
icon128.png

Jive Developer : 02 : REST v3 API & Webhooks

Learn how to integrate and extend Jive to meet your business requirements in an easy and upgrade-safe manner using the REST APIs & Webhooks
icon128.png

Jive Developer : 03 : Analytics & Reporting

Learn how to leverage the Jive Data Export Service (DES) to export fine-grained event reporting about your Jive instance for in-depth reporting and analysis.
icon128.png

Jive Developer : 04 : Simple Stream Integrations

Learn how to harness the power and simplicity of Simple Stream Integrations without the use of middleware!
icon128.png

Jive Developer : 05 : Custom View & Data Tiles

Learn how to develop tiles to connect your Jive community with information from other systems relevant to your business.
icon128.png

Jive Developer : 06 : Jive Apps (OpenSocial)

Learn how to integrate and extend Jive to meet your business requirements in an easy and upgrade-safe manner using all the features of the Jive Apps Framework
icon128.png

Jive Developer : 07 : Cartridges (Jive Anywhere)

Learn how to integrate and extend Jive to meet your business requirements in an easy and upgrade-safe manner using the Jive Anywhere cartridges

 

If you have any further Jive Developer questions/concerns, please feel free to ask in the comments below, or raise them with your Account Managers.

 

My Last Jive Developer Ask of You

 

If you have a moment in your Jive journey that stands out where either myself or the Jive Developer community has helped you take your Jive story to the next level, it would be great if you could take 3-5 minutes and share that story in the comments below.

 

While I know that I have put a lot of work into the Developer Community, I am equally sure that the Developer Community has given back equally to me and others over these past many years, and hope that it can continue to embody the power of people working together to build awesome integrations on the Jive platform!

 

It has been in an extreme pleasure serving the Jive Developer community for these many years, and I look forward to the challenge of continuing to serve Jive customers with equal levels of innovation and passion in my new role.

Don't you wish Jive notified you about work-anniversaries like Linkedin?

Now it can with this simple integration we've open-sourced.

 

This script generates status messages in the group of your choosing announcing:

"So-and-so celebrated 12 years at Your Company today."

Furthermore it spoofs the celebrants account, creating it under their name which ensures that person's followers will notice. But it also includes a disclaimer "Posted by MyJiveBot" where MyJiveBot can be a link to more details about the bot.

 

Furthermore, you can set the cron to run at different times for different user profiles, so that APAC users will see their status messages first thing their morning and similar for Europe and the Americas.

 

This could also be easily modified for birthdays or other dates in your user profile.

 

The integration was created for Jive-n, but should also work on Jive-x and Jive 9. Previous versions of Jive APIs didn't support "user account  spoofing" so the status messages could not be created under the celebrant's account.

 

One of the nice things about it is it just runs against the user profiles, and creates single status updates, without any need for a database or complex systems. You could run it on your computer, but of course to schedule it, it's better if you have a middleware server where cron jobs can be set up.

 

There's obviously no guarantee or warranty that it will work, but If you have any questions, please comment below or reach out directly to me.

jivedev QuickStart App

If you were there with us at JiveWorld17, you know that we announced the jivedev QuickStart App's availability in the Global Registry. That means that not only is it available in our sandbox AND JiveWorks community for all registered users, but also can be easily installed in your instance! For instructions how to install it on your own instance, check out: Installing an Add-on from the Global Registry.

 

NOTE: The Custom View Tile add-on that is generated is not compatible with Internet Explorer as it does not support many of the features found in ES6 JavaScript.

 

 

What is it? Why do I NEED to install it?

So this is probably the first question you have, and rightly so! This app allows you generate several different integrations by just copying and pasting your code into the textboxes. There are also a slew of great out of the box examples baked in. Now you can build some Jive Add-on's from right within your own instance! Getting other developer's in your organization to try extending your environment will now be even easier than ever since they'll have access to getting started without needing to navigate to here first. There is also plenty of helpful relevant links to documentation in each of the examples as well.

 

 

AND just like other add-on's in the global registry, it can also be restricted to being installed by only certain people or spaces/groups so you can manage who has the ability to generate add-on's. After you install the Add-on, you will see a gear in the "Apps Security" column of the page and pressing that gear will present you with a screen like the following:

 

 

Current Integration types

Custom View Tiles

Since CVTs are so popular these days, I tried to include as many of the most requested examples as possible. By default, you get contextual data of who and where you are, can make OSAPI HTTP requests from tile and have it render the response within the tile. It also supports instances where GALA is available and enabled and shows the different ways to get the URL of the app and assets.

 

Simple Stream Integrations

Similar to the SSI Builder that's been available on Simple Stream Integration Builder - Jive Developers, you can now create these powerful integrations without ever leaving your Jive Community.

 

OAuth Token Generator

Similar to the Try the New OAuth 2.0 Client Builder Web Tool, you can build these add-ons and reference this doc OAuth 2.0—Creating a Client and Managing Access to make calls to our REST API.

 

What else does it have?

We link to as many relevant pieces of documentation as possible, it's easily expandable so that we can have apps and other integration types as well if there's enough demand.

 

When should I install it?

Now!

 

After all the pre-conference buzz going into JiveWorld17//Developers,

 

we ended up having a spectacular showing of developer engagement and participation in the Hacker Lounge.  Here are just a few tastes of what
went down.  We hope to see each and everyone of you at JiveWorld18//Developers event, so stay tuned for more updates...and as always, Let Us
Know How We Can Help You Build Something Awesome!

Making It Even Easier to Develop Jive Add-Ons

Special thanks to Rashed Talukder for taking on this effort.  Now bring the power of the Jive Developer Community to your Jive Community.

 

  1. Visit the Add-On Registry (Jive 8, 9 and Cloud) on your Jive Instance
  2. Find the jivedev QuickStart Add-On, and Install
  3. (optional) Customize permissions of who can see/use Add-On and it's features via the App Settings section of the Add-On.
  4. Go to the Apps menu and enjoy add-on builders for OAuth2 Clients, Simple Stream Integrations and Custom View Tiles.

 

Let us know how this goes here in the Jive Developer Community ... we are always looking for feedback!

 

Getting Your Race On at the Jive Derby

In it's debut, the Jive Derby proved to be as exciting as anticipated.  With 86+ races, and 68 racers, JiveWorld17 attendees found an engaging way to connect with fellow Jive customers/developers and enjoy some good ole fashioned revelry.

 

JiveWorld17 Derby Champion

Roguen Keller

2.4057 seconds

 

For more details and specifics about the JiveWorld17 Derby, check out:

 

Keep in mind the Jive Derby is also a reference implementation for building a deeply integrated Jive experience with an external system.  Check out the following resources to learn more about how this integration was built from top to bottom.

 

Future of the Jive API & Documentation

There were some very deep and technical discussions about the upcoming Jive API, but here are just some of the high-points that were discussed.

 

 

 

  • Less Direct Jive Instance API Integrations … More Centralized Gateway Services
  • Distributed API Comprised of Numerous Microservices vs. Monolithic API Service
  • All New Features / Services Built by Jive Will Be Built Using Public Well-Documented APIs based on the Open API Specification (a.k.a. Swagger)
  • Every new micro service will include:
    • Publically Addressable Swagger Definitions
    • Publically Browsable API Documentation
  • Harness the power of Swagger Tool Eco-System (swagger-tools, POSTMAN, ...)
  • Help us understand what features in the Swagger specification you expect in our definitions to help insure you are getting the most out of them.  Feedback is always welcome!

 

Stay tuned for more updates in both Product and Developer communities about Unified People ID, Unified Content ID and the new Connector Framework!

 

Cool IoT Demos for the Enterprise Collaboration

Another cool contribution from Rashed Talukder who demonstrated some cool integrated technologies to support a next-generation conference room experience.

 

 

  • Simulated enterprise calendar and resource integration to know who is where and with what at all times.
  • Facial recognition in conference room to track attendance using Lego avatars.
  • Extended Profile Metadata to control conference room temperature as an average of # of attendees and their temperature preferences.
  • Jive Data Export Service to scan activity during meeting invite related to attendees and subject to help create meeting note curation.
  • (optional) Alexa meeting note dictation to set up todos, take notes and reminders.
  • Meeting notes automatically submitted to Jive for attendees to review and further follow-up on action items.

 

The conference room of the future is more than a room, it is a collaboration and action facilitator to insure that you can focus more on doing the work than documenting it.

 

Developer Days is Coming Your Way Soon

 

 

The Jive Developer Days program has been quite popular, and we plan to continue it moving forward.  We will be taking feedback on topics you'd like to learn more about ... and determining our next event in the June/July 2017 timeframe.

 

Let us know what information you'd like us to bring on the bus to a webinar near you!

Check out the JiveWorld17 Vlog (episode 3) about the Jive Derby.

 

Fun with Ryan Rutan and Roguen Keller

 

 

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

Filter Blog