'use strict'; angular.module('mentio-demo', []) .config(function($routeProvider) { $routeProvider .when('/', { templateUrl: 'examples.html', tab: 'examples', title: 'Ment.io examples' }) .when('/documentation', { templateUrl: 'documentation.html', tab: 'documentation', title: 'Ment.io Documentation' }) .when('/examples', { templateUrl: 'examples.html', tab: 'examples', title: 'Ment.io examples' }); }) .run(function ($rootScope) { $rootScope.$on('$routeChangeSuccess', function (event, current) { if (current.$$route) { $rootScope.title = current.$$route.title; $rootScope.tab = current.$$route.tab; } }); }) .controller('mentio-demo-ctrl', function ($scope, $rootScope, $http, $q, $sce, $timeout, mentioUtil) { $scope.tinyMceOptions = { init_instance_callback: function(editor) { $scope.iframeElement = editor.iframeElement; } }; $scope.macros = { 'brb': 'Be right back', 'omw': 'On my way', '(smile)' : '' }; // shows the use of dynamic values in mentio-id and mentio-for to link elements $scope.myIndexValue = "5"; $scope.searchProducts = function(term) { var prodList = []; return $http.get('productdata.json').then(function (response) { angular.forEach(response.data, function(item) { if (item.title.toUpperCase().indexOf(term.toUpperCase()) >= 0) { prodList.push(item); } }); $scope.products = prodList; return $q.when(prodList); }); }; $scope.searchPeople = function(term) { var peopleList = []; return $http.get('peopledata.json').then(function (response) { angular.forEach(response.data, function(item) { if (item.name.toUpperCase().indexOf(term.toUpperCase()) >= 0) { peopleList.push(item); } }); $scope.people = peopleList; return $q.when(peopleList); }); }; $scope.searchSimplePeople = function(term) { return $http.get('simplepeopledata.json').then(function (response) { $scope.simplePeople = []; angular.forEach(response.data, function(item) { if (item.label.toUpperCase().indexOf(term.toUpperCase()) >= 0) { $scope.simplePeople.push(item); } }); }); }; $scope.getProductText = function(item) { return '[~' + item.sku + ']'; }; $scope.getProductTextRaw = function(item) { var deferred = $q.defer(); /* the select() function can also return a Promise which ment.io will handle propertly during replacement */ // simulated async promise $timeout(function() { deferred.resolve('#' + item.sku); }, 500); return deferred.promise; }; $scope.getPeopleText = function(item) { // note item.label is sent when the typedText wasn't found return '[~' + (item.name || item.label) + ']'; }; $scope.getPeopleTextRaw = function(item) { return '@' + item.name; }; $scope.resetDemo = function() { // finally enter content that will raise a menu after everything is set up $timeout(function() { var html = "Try me @ or add a macro like brb, omw, (smile)"; var htmlContent = document.querySelector('#htmlContent'); if (htmlContent) { var ngHtmlContent = angular.element(htmlContent); ngHtmlContent.html(html); ngHtmlContent.scope().htmlContent = html; // select right after the @ mentioUtil.selectElement(null, htmlContent, [0], 8); ngHtmlContent.scope().$apply(); } }, 0); }; $rootScope.$on('$routeChangeSuccess', function (event, current) { $scope.resetDemo(); }); $scope.theTextArea = 'Type an # and some text'; $scope.theTextArea2 = 'Type an @'; $scope.searchSimplePeople(''); $scope.resetDemo(); }) .directive('contenteditable', ['$sce', function($sce) { return { restrict: 'A', // only activate on element attribute require: '?ngModel', // get a hold of NgModelController link: function(scope, element, attrs, ngModel) { function read() { var html = element.html(); // When we clear the content editable the browser leaves a
behind // If strip-br attribute is provided then we strip this out if (attrs.stripBr && html === '
') { html = ''; } ngModel.$setViewValue(html); } if(!ngModel) return; // do nothing if no ng-model // Specify how UI should be updated ngModel.$render = function() { if (ngModel.$viewValue !== element.html()) { element.html($sce.getTrustedHtml(ngModel.$viewValue || '')); } }; // Listen for change events to enable binding element.on('blur keyup change', function() { scope.$apply(read); }); read(); // initialize } }; }]) .filter('words', function () { return function (input, words) { if (isNaN(words)) { return input; } if (words <= 0) { return ''; } if (input) { var inputWords = input.split(/\s+/); if (inputWords.length > words) { input = inputWords.slice(0, words).join(' ') + '\u2026'; } } return input; }; });