Created
October 2, 2014 15:16
-
-
Save dvliman/6eb410b190c6a60fa1c3 to your computer and use it in GitHub Desktop.
backernews.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var ApplicationConfiguration = function() { | |
var applicationModuleName = "backer-news", | |
applicationModuleVendorDependencies = ["ngResource", "ngCookies", "ngAnimate", "ngTouch", "ngSanitize", "ui.router", "ui.bootstrap", "ui.utils"], | |
registerModule = function(moduleName, dependencies) { | |
angular.module(moduleName, dependencies || []), angular.module(applicationModuleName).requires.push(moduleName) | |
}; | |
return { | |
applicationModuleName: applicationModuleName, | |
applicationModuleVendorDependencies: applicationModuleVendorDependencies, | |
registerModule: registerModule | |
} | |
}(); | |
angular.module(ApplicationConfiguration.applicationModuleName, ApplicationConfiguration.applicationModuleVendorDependencies), angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider", function($locationProvider) { | |
$locationProvider.hashPrefix("!") | |
}]), angular.element(document).ready(function() { | |
"#_=_" === window.location.hash && (window.location.hash = "#!"), angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]) | |
}), ApplicationConfiguration.registerModule("articles"), ApplicationConfiguration.registerModule("core"), ApplicationConfiguration.registerModule("users"), angular.module("articles").run(["Menus", function(Menus) { | |
Menus.addMenuItem("topbar", "Add a project", "articles/create", "articles/create") | |
}]), angular.module("articles").config(["$stateProvider", function($stateProvider) { | |
$stateProvider.state("listArticles", { | |
url: "/", | |
templateUrl: "modules/articles/views/list-articles.client.view.html" | |
}).state("createArticle", { | |
url: "/articles/create", | |
templateUrl: "modules/articles/views/create-article.client.view.html" | |
}).state("viewArticle", { | |
url: "/articles/:articleId", | |
templateUrl: "modules/articles/views/view-article.client.view.html" | |
}).state("editArticle", { | |
url: "/articles/:articleId/edit", | |
templateUrl: "modules/articles/views/edit-article.client.view.html" | |
}) | |
}]), angular.module("articles").controller("ArticlesController", ["$scope", "$window", "$http", "$stateParams", "$location", "Authentication", "Articles", function($scope, $window, $http, $stateParams, $location, Authentication, Articles) { | |
$scope.authentication = Authentication, $scope.contentLoaded = !1, $scope.initFunc = function() { | |
$scope.tab0Class = "active", $scope.articleFilter = "live", console.log($scope.tab), $scope.find() | |
}, $scope.myPagingFunction = function() {}, $scope.loader = { | |
loading: !1 | |
}, $scope.create = function() { | |
var article = new Articles({ | |
url: this.url | |
}); | |
article.$save(function(response) { | |
$location.path("articles/" + response._id), $scope.url = "" | |
}, function(errorResponse) { | |
$scope.error = errorResponse.data.message, $scope.loader.loading = !1 | |
}) | |
}, $scope.testUrl = function() { | |
function scrapeIt() { | |
$http.post("/scrape", article).success(function() { | |
$scope.find(), $location.path("/") | |
}).error(function(data) { | |
$scope.error = data.message, $scope.url = "", $scope.loader.loading = !1 | |
}) | |
} | |
$scope.loader.loading = !0; | |
var theUrl = this.url.split("?")[0], | |
article = new Articles({ | |
url: theUrl | |
}); | |
theUrl.indexOf("kickstarter") > -1 ? (console.log("KS !"), scrapeIt()) : theUrl.indexOf("indiegogo") > -1 ? (console.log("indiegogo !"), scrapeIt()) : ($scope.error = "Please enter a Kickstarter or Indiegogo project", $scope.loader.loading = !1), console.log(article) | |
}, $scope.goToArticle = function(article) { | |
$location.path("/articles/" + article._id) | |
}, $scope.voteArticle = function(article) { | |
$http.post("/vote/" + article._id).success(function(data) { | |
article.voteTotal = data.voteTotal | |
}).error(function() {}) | |
}, $scope.remove = function(article) { | |
if (article) { | |
article.$remove(); | |
for (var i in $scope.articles) $scope.articles[i] === article && $scope.articles.splice(i, 1) | |
} else $scope.article.$remove(function() { | |
$location.path("articles") | |
}) | |
}, $scope.update = function() { | |
var article = $scope.article; | |
article.$update(function() { | |
$location.path("articles/" + article._id) | |
}, function(errorResponse) { | |
$scope.error = errorResponse.data.message | |
}) | |
}, $scope.showMore = !1, $scope.filter = { | |
end: { | |
$gte: Date.now() | |
} | |
}, $scope.tabChanged = function(arg) { | |
$scope.tab0Class = "inactive", $scope.tab1Class = "inactive", $scope.tab2Class = "inactive", $scope.articleFilter = arg, $scope.articles = [], "live" === arg ? $scope.tab0Class = "active" : "recent" === arg ? $scope.tab1Class = "active" : "all" === arg && ($scope.tab2Class = "active"), $scope.find() | |
}, $scope.find = function() { | |
var skipNum = 0, | |
options = { | |
limit: 10, | |
skip: 0, | |
articleFilter: $scope.articleFilter | |
}; | |
if ("undefined" != typeof $scope.articles) { | |
skipNum = $scope.articles.length, options.skip = skipNum; | |
var newArticles = Articles.query(options, function(data) { | |
console.log("success"), console.log(data), $scope.showMore = data.length < options.limit ? !1 : !0; | |
for (var i = 0; i < newArticles.length; i++) $scope.articles.push(newArticles[i]); | |
console.log($scope.articles) | |
}) | |
} else $scope.articles = Articles.query(options, function(data) { | |
$scope.showMore = data.length < options.limit ? !1 : !0 | |
}) | |
}, $scope.fbShare = function() { | |
FB.ui({ | |
method: "share", | |
href: "http://backernews.com/articles/" + $scope.article._id | |
}, function(response) { | |
response && !response.error_code || console.log("Error while posting.") | |
}) | |
}, $scope.findOne = function() { | |
$scope.article = Articles.get({ | |
articleId: $stateParams.articleId | |
}, function(data) { | |
$scope.shareUrl = "http://backernews.com/#!/articles/" + data._id, $scope.shareUrlEsc = escape("http://backernews.com/#!/articles/" + data._id), $scope.twPost = escape(data.shortUrl.length > 0 ? "Check this #crowdfunding project on @backer_news " + data.shortUrl : "Check this #crowdfunding project on @backer_news http://backernews.com/#!/articles/" + data._id), $scope.imgUrlEsc = escape(data.image), $scope.contentLoaded = !0, $window.document.getElementById("FBDescr").setAttribute("content", data.title), $window.document.getElementById("FBUrl").setAttribute("content", $scope.shareUrl), $window.document.getElementById("FBImg").setAttribute("content", data.image), console.log(data) | |
}) | |
} | |
}]), angular.module("articles").directive("disqus", ["$window", function($window) { | |
return console.log("disqus dir"), { | |
restrict: "E", | |
scope: { | |
disqus_shortname: "@disqusShortname", | |
disqus_identifier: "@disqusIdentifier", | |
disqus_title: "@disqusTitle", | |
disqus_url: "@disqusUrl", | |
disqus_category_id: "@disqusCategoryId", | |
disqus_disable_mobile: "@disqusDisableMobile", | |
readyToBind: "@" | |
}, | |
template: '<div id="disqus_thread"></div><a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>', | |
link: function(scope) { | |
if ("undefined" == typeof scope.disqus_identifier || "undefined" == typeof scope.disqus_url) throw "Please ensure that the `disqus-identifier` and `disqus-url` attributes are both set."; | |
scope.$watch("readyToBind", function(isReady) { | |
if (angular.isDefined(isReady) || (isReady = "true"), scope.$eval(isReady)) | |
if ($window.disqus_shortname = scope.disqus_shortname, $window.disqus_identifier = scope.disqus_identifier, $window.disqus_title = scope.disqus_title, $window.disqus_url = scope.disqus_url, $window.disqus_category_id = scope.disqus_category_id, $window.disqus_disable_mobile = scope.disqus_disable_mobile, $window.DISQUS) $window.DISQUS.reset({ | |
reload: !0, | |
config: function() { | |
this.page.identifier = scope.disqus_identifier, this.page.url = scope.disqus_url, this.page.title = scope.disqus_title | |
} | |
}); | |
else { | |
var dsq = document.createElement("script"); | |
dsq.type = "text/javascript", dsq.async = !0, dsq.src = "//" + scope.disqus_shortname + ".disqus.com/embed.js", (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(dsq) | |
} | |
}) | |
} | |
} | |
}]), angular.module("articles").factory("Articles", ["$resource", function($resource) { | |
return $resource("articles/:articleId", { | |
articleId: "@_id" | |
}, { | |
update: { | |
method: "PUT" | |
} | |
}) | |
}]), angular.module("core").config(["$stateProvider", "$urlRouterProvider", function($stateProvider, $urlRouterProvider) { | |
$urlRouterProvider.otherwise("/"), $stateProvider.state("home", { | |
url: "/", | |
templateUrl: "modules/core/views/home.client.view.html" | |
}) | |
}]), angular.module("core").controller("HeaderController", ["$scope", "Authentication", "Menus", function($scope, Authentication, Menus) { | |
$scope.authentication = Authentication, $scope.isCollapsed = !1, $scope.menu = Menus.getMenu("topbar"), $scope.toggleCollapsibleMenu = function() { | |
$scope.isCollapsed = !$scope.isCollapsed | |
}, $scope.$on("$stateChangeSuccess", function() { | |
$scope.isCollapsed = !1 | |
}) | |
}]), angular.module("core").controller("HomeController", ["$scope", "Authentication", function($scope, Authentication) { | |
$scope.authentication = Authentication | |
}]), angular.module("core").service("Menus", [function() { | |
this.defaultRoles = ["*"], this.menus = {}; | |
var shouldRender = function(user) { | |
if (!user) return this.isPublic; | |
if (~this.roles.indexOf("*")) return !0; | |
for (var userRoleIndex in user.roles) | |
for (var roleIndex in this.roles) | |
if (this.roles[roleIndex] === user.roles[userRoleIndex]) return !0; | |
return !1 | |
}; | |
this.validateMenuExistance = function(menuId) { | |
if (menuId && menuId.length) { | |
if (this.menus[menuId]) return !0; | |
throw new Error("Menu does not exists") | |
} | |
throw new Error("MenuId was not provided") | |
}, this.getMenu = function(menuId) { | |
return this.validateMenuExistance(menuId), this.menus[menuId] | |
}, this.addMenu = function(menuId, isPublic, roles) { | |
return this.menus[menuId] = { | |
isPublic: isPublic || !1, | |
roles: roles || this.defaultRoles, | |
items: [], | |
shouldRender: shouldRender | |
}, this.menus[menuId] | |
}, this.removeMenu = function(menuId) { | |
this.validateMenuExistance(menuId), delete this.menus[menuId] | |
}, this.addMenuItem = function(menuId, menuItemTitle, menuItemURL, menuItemType, menuItemUIRoute, isPublic, roles, position) { | |
return this.validateMenuExistance(menuId), this.menus[menuId].items.push({ | |
title: menuItemTitle, | |
link: menuItemURL, | |
menuItemType: menuItemType || "item", | |
menuItemClass: menuItemType, | |
uiRoute: menuItemUIRoute || "/" + menuItemURL, | |
isPublic: null === isPublic || "undefined" == typeof isPublic ? this.menus[menuId].isPublic : isPublic, | |
roles: null === roles || "undefined" == typeof roles ? this.menus[menuId].roles : roles, | |
position: position || 0, | |
items: [], | |
shouldRender: shouldRender | |
}), this.menus[menuId] | |
}, this.addSubMenuItem = function(menuId, rootMenuItemURL, menuItemTitle, menuItemURL, menuItemUIRoute, isPublic, roles, position) { | |
this.validateMenuExistance(menuId); | |
for (var itemIndex in this.menus[menuId].items) this.menus[menuId].items[itemIndex].link === rootMenuItemURL && this.menus[menuId].items[itemIndex].items.push({ | |
title: menuItemTitle, | |
link: menuItemURL, | |
uiRoute: menuItemUIRoute || "/" + menuItemURL, | |
isPublic: null === isPublic || "undefined" == typeof isPublic ? this.menus[menuId].items[itemIndex].isPublic : isPublic, | |
roles: null === roles || "undefined" == typeof roles ? this.menus[menuId].items[itemIndex].roles : roles, | |
position: position || 0, | |
shouldRender: shouldRender | |
}); | |
return this.menus[menuId] | |
}, this.removeMenuItem = function(menuId, menuItemURL) { | |
this.validateMenuExistance(menuId); | |
for (var itemIndex in this.menus[menuId].items) this.menus[menuId].items[itemIndex].link === menuItemURL && this.menus[menuId].items.splice(itemIndex, 1); | |
return this.menus[menuId] | |
}, this.removeSubMenuItem = function(menuId, submenuItemURL) { | |
this.validateMenuExistance(menuId); | |
for (var itemIndex in this.menus[menuId].items) | |
for (var subitemIndex in this.menus[menuId].items[itemIndex].items) this.menus[menuId].items[itemIndex].items[subitemIndex].link === submenuItemURL && this.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1); | |
return this.menus[menuId] | |
}, this.addMenu("topbar") | |
}]), angular.module("users").config(["$httpProvider", function($httpProvider) { | |
$httpProvider.interceptors.push(["$q", "$location", "Authentication", function($q, $location, Authentication) { | |
return { | |
responseError: function(rejection) { | |
switch (rejection.status) { | |
case 401: | |
Authentication.user = null, $location.path("signin"); | |
break; | |
case 403: | |
} | |
return $q.reject(rejection) | |
} | |
} | |
}]) | |
}]), angular.module("users").config(["$stateProvider", function($stateProvider) { | |
$stateProvider.state("profile", { | |
url: "/settings/profile", | |
templateUrl: "modules/users/views/settings/edit-profile.client.view.html" | |
}).state("password", { | |
url: "/settings/password", | |
templateUrl: "modules/users/views/settings/change-password.client.view.html" | |
}).state("accounts", { | |
url: "/settings/accounts", | |
templateUrl: "modules/users/views/settings/social-accounts.client.view.html" | |
}).state("signup", { | |
url: "/signup", | |
templateUrl: "modules/users/views/authentication/signup.client.view.html" | |
}).state("signin", { | |
url: "/signin", | |
templateUrl: "modules/users/views/authentication/signin.client.view.html" | |
}).state("forgot", { | |
url: "/password/forgot", | |
templateUrl: "modules/users/views/password/forgot-password.client.view.html" | |
}).state("reset-invlaid", { | |
url: "/password/reset/invalid", | |
templateUrl: "modules/users/views/password/reset-password-invalid.client.view.html" | |
}).state("reset-success", { | |
url: "/password/reset/success", | |
templateUrl: "modules/users/views/password/reset-password-success.client.view.html" | |
}).state("reset", { | |
url: "/password/reset/:token", | |
templateUrl: "modules/users/views/password/reset-password.client.view.html" | |
}) | |
}]), angular.module("users").controller("AuthenticationController", ["$scope", "$http", "$location", "Authentication", function($scope, $http, $location, Authentication) { | |
$scope.authentication = Authentication, $scope.authentication.user && $location.path("/"), $scope.signup = function() { | |
$http.post("/auth/signup", $scope.credentials).success(function(response) { | |
$scope.authentication.user = response, $location.path("/") | |
}).error(function(response) { | |
$scope.error = response.message | |
}) | |
}, $scope.signin = function() { | |
$http.post("/auth/signin", $scope.credentials).success(function(response) { | |
$scope.authentication.user = response, $location.path("/") | |
}).error(function(response) { | |
$scope.error = response.message | |
}) | |
} | |
}]), angular.module("users").controller("PasswordController", ["$scope", "$stateParams", "$http", "$location", "Authentication", function($scope, $stateParams, $http, $location, Authentication) { | |
$scope.authentication = Authentication, $scope.authentication.user && $location.path("/"), $scope.askForPasswordReset = function() { | |
$scope.success = $scope.error = null, $http.post("/auth/forgot", $scope.credentials).success(function(response) { | |
$scope.credentials = null, $scope.success = response.message | |
}).error(function(response) { | |
$scope.credentials = null, $scope.error = response.message | |
}) | |
}, $scope.resetUserPassword = function() { | |
$scope.success = $scope.error = null, $http.post("/auth/reset/" + $stateParams.token, $scope.passwordDetails).success(function(response) { | |
$scope.passwordDetails = null, Authentication.user = response, $location.path("/password/reset/success") | |
}).error(function(response) { | |
$scope.error = response.message | |
}) | |
} | |
}]), angular.module("users").controller("SettingsController", ["$scope", "$http", "$location", "Users", "Authentication", function($scope, $http, $location, Users, Authentication) { | |
$scope.user = Authentication.user, $scope.user || $location.path("/"), $scope.hasConnectedAdditionalSocialAccounts = function() { | |
for (var i in $scope.user.additionalProvidersData) return !0; | |
return !1 | |
}, $scope.isConnectedSocialAccount = function(provider) { | |
return $scope.user.provider === provider || $scope.user.additionalProvidersData && $scope.user.additionalProvidersData[provider] | |
}, $scope.removeUserSocialAccount = function(provider) { | |
$scope.success = $scope.error = null, $http.delete("/users/accounts", { | |
params: { | |
provider: provider | |
} | |
}).success(function(response) { | |
$scope.success = !0, $scope.user = Authentication.user = response | |
}).error(function(response) { | |
$scope.error = response.message | |
}) | |
}, $scope.updateUserProfile = function(isValid) { | |
if (isValid) { | |
$scope.success = $scope.error = null; | |
var user = new Users($scope.user); | |
user.$update(function(response) { | |
$scope.success = !0, Authentication.user = response | |
}, function(response) { | |
$scope.error = response.data.message | |
}) | |
} else $scope.submitted = !0 | |
}, $scope.changeUserPassword = function() { | |
$scope.success = $scope.error = null, $http.post("/users/password", $scope.passwordDetails).success(function() { | |
$scope.success = !0, $scope.passwordDetails = null | |
}).error(function(response) { | |
$scope.error = response.message | |
}) | |
} | |
}]), angular.module("users").factory("Authentication", [function() { | |
var _this = this; | |
return _this._data = { | |
user: window.user | |
}, _this._data | |
}]), angular.module("users").factory("Users", ["$resource", function($resource) { | |
return $resource("users", {}, { | |
update: { | |
method: "PUT" | |
} | |
}) | |
}]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment