-
+
+
+
+
+
+
+
+
+
Filter Projects
+
+
+
+
+
+
+
For more project ideas, click here.
@@ -18,7 +49,10 @@
-
+
+ {{ message.noProjectsFound }}
+
+ {{ project.name }}
@@ -98,6 +132,8 @@
'slow');
})
+ $('.filter-select-fields select').material_select();
+
$('.modal').modal({
dismissible: true, // Modal can be dismissed by clicking outside of the modal
opacity: 0.8, // Opacity of modal background
diff --git a/resources/css/style.css b/resources/css/style.css
index e86eac89..de7d6ebf 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -1,6 +1,39 @@
+.all-filters-option {
+ position: relative;
+ z-index: 1002;
+ min-width: 350px;
+ margin: 10px 0;
+ background-color: white;
+ box-shadow: 0 0 15px 2px black;
+ border-radius: 20px;
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.apply-flex {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+}
.break-word {
word-wrap: break-word;
}
+.center-content {
+ justify-content: center;
+}
+.close-filters {
+ right: 6%;
+ margin-top: 1.25rem;
+ position: absolute;
+ z-index: 1003;
+}
+.display-none {
+ display: none;
+}
+.evenly-spread-content {
+ justify-content: space-evenly;
+}
.hash_value_dup {
position: 'absolute';
left: '-9999px';
@@ -35,6 +68,33 @@
.fa-clipboard:hover .hinttext {
visibility: visible;
}
+.filter-projects-inputs {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: space-evenly;
+ margin-top: 1rem;
+}
+.filter-btn {
+ width: 165px;
+ z-index: 0;
+}
+.filter-btn .btn-large {
+ border-radius: 100px;
+ box-shadow: 0 0 10px 1px darkslategray;
+}
+.filters-btns {
+ width: 50%;
+}
+.filters-inputs {
+ justify-content: space-around;
+ padding: 20px 0;
+}
+.filter-select-fields {
+ width: 100%;
+ padding-top: 20px;
+ padding-bottom: 10px;
+ justify-content: space-around;
+}
.footer-icons {
display: flex;
flex-wrap: wrap;
@@ -47,6 +107,9 @@
.icon {
color: white;
}
+i.fa {
+ cursor: pointer;
+}
.justify-text {
text-align: justify;
}
@@ -141,6 +204,11 @@ nav {
border: 0;
z-index: 9;
}
+.searchbar {
+ width: 85%;
+ min-width: 340px;
+ margin-top: 0;
+}
.sha256sum_hash {
display: flex;
justify-content: space-evenly;
@@ -156,3 +224,15 @@ nav {
#sha256sum_hash_value {
word-wrap: break-word;
}
+@-webkit-keyframes fade-in {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+@keyframes fade-in {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+.fade-in {
+ -webkit-animation-name: fade-in;
+ animation-name: fade-in;
+}
diff --git a/resources/js/app.js b/resources/js/app.js
index ce68b0d4..05854a61 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -90,295 +90,6 @@
}
})
- app.directive('projects', ['$http', '$timeout', '$location', 'Languages', 'orderByFilter', function ($http, $timeout, $location, Languages, orderBy) {
- return {
- restrict: 'E',
- templateUrl: '/partials/tabs/projects.html',
- controller: function ($scope, $location, Languages) {
- self = this
-
- var mapping = {
- '': 0,
- 'crowded': 1,
- 'in_progress': 2,
- 'completed': 3
- }
-
- $scope.sortOrder = function(project) {
- return mapping[project.status];
- }
-
- $scope.sortProjects = function () {
- $scope.projectList = orderBy($scope.projectList, 'mapped_status');
- }
-
- $scope.getDefaultProjectsMetadata = function () {
- $http.get('data/projects.liquid')
- .then(function (res) {
- $scope.projectList = res.data;
- $scope.projectRequest();
- })
- }
-
- $scope.lang = Languages.getData();
-
- $scope.getDefaultProjectsMetadata();
-
- $scope.$watch( function () {
- return Languages.getData();
- }, function () {
- $scope.setLanguage(Languages.getData());
- }, true);
-
-
- $scope.setLanguage = function (val) {
- $scope.lang = val;
- $scope.updateProjects();
- }
-
- $scope.updateProjects = function () {
- if ($scope.lang != 'en') {
- $http.get('data/locale/'+$scope.lang+'/projects.json')
- .then(function (res) {
- $scope.projectList.map(function (project) {
- if (res.data[project.markdown]) {
- Object.keys(project).map(function (key) {
- if (res.data[project.markdown][key]) {
- project[key] = res.data[project.markdown][key]
- }
- });
- }
- });
-
- $scope.projectRequest();
- });
- } else {
- $scope.getDefaultProjectsMetadata();
- $scope.projectRequest();
- }
- }
-
- function generateMarkdown() {
-
- function setFromDefault() {
- $http.get($scope.currentProject.content_url)
- .then(function (res) {
- $scope.currentProject.content = res.data
- }, function() {
- $scope.currentProject.content = 'No content'
- });
- }
-
- if ($scope.lang != 'en') {
- $http.get('data/locale/' + $scope.lang + '/projects/' + $scope.currentProject.markdown).then(function (res) {
- $scope.currentProject.content = res.data
- }, function () {
- setFromDefault()
- });
- } else {
- setFromDefault()
- }
- }
-
- self.showProject = function (project) {
-
- $scope.currentProject = project
-
- $(document).ready(function () {
- $('.modal').modal('open');
- });
-
- mval = encodeURIComponent(project["name"].split(' ').join('_').toLowerCase());
- $location.url('?project=' + mval + ( $scope.lang ? '&lang=' + $scope.lang : '' ))
- $scope.$evalAsync();
-
- generateMarkdown()
- }
-
- self.showProjectOnArrowClick = function (project) {
-
- $scope.currentProject = project
- mval = encodeURIComponent(project["name"].split(' ').join('_').toLowerCase());
- $location.url('?project=' + mval + ( $scope.lang ? '&lang=' + $scope.lang : '' ))
- $scope.$evalAsync();
- generateMarkdown()
- }
-
- $scope.search = function (arg) {
- $scope.searchText = arg
- }
-
- $scope.redirect = function (arg) {
- window.open(arg, '_blank');
- }
-
- $scope.updateLink = function () {
- $scope.currentProject = null;
- $location.url($location.path());
- }
-
- $scope.encode_URI = function (project_name) {
- return encodeURIComponent(project_name.split(' ').join('_').toLowerCase());
- }
-
- $scope.arrowPressed = function (e) {
- if(e.keyCode == 37){
- keyPressed = "left"
- $scope.moveToNext(keyPressed);
- }
- else if(e.keyCode == 39){
- keyPressed = "right"
- $scope.moveToNext(keyPressed);
- }
-
- }
-
- $scope.moveToNext = function (keyPressed) {
- if($scope.currentProject){
-
- total_projects = $scope.projectList.length
- angular.forEach($scope.projectList, function(value, key){
- if($scope.currentProject.name == value["name"]){
- current_project_index = key
- }
- });
-
- if(keyPressed == "left"){
- if(current_project_index == 0){
- self.showProjectOnArrowClick($scope.projectList[total_projects-1])
- }else{
- self.showProjectOnArrowClick($scope.projectList[--current_project_index])
- }
- }
- if(keyPressed == "right"){
- if(current_project_index == total_projects-1){
- self.showProjectOnArrowClick($scope.projectList[0])
- }else{
- self.showProjectOnArrowClick($scope.projectList[++current_project_index])
- }
- }
- }
- }
-
- $scope.projectRequest = function () {
-
- var redirectTo = {
- "integrate_pyflakes-enhanced_ast_into_coala_" : "integrate_pyflakes-enhanced_ast_into_coala"
- };
- $scope.projects_url_dict = {}
- $scope.projects_url_list = Object.keys($scope.projects_url_dict);
- angular.forEach($scope.projectList, function(value, key){
- value["url"] = encodeURIComponent(value["name"].split(' ').join('_').toLowerCase());
- var mapped_status = $scope.sortOrder(value);
- $scope.projectList[key]['mapped_status'] = mapped_status;
- $scope.projects_url_dict[value["url"]] = key
- });
-
- $scope.sortProjects();
-
- var project_requested = encodeURIComponent($location.search().project);
- if(project_requested){
- if(project_requested in redirectTo){
- project_requested = redirectTo[project_requested]
- }
- if(Object.keys($scope.projects_url_dict).indexOf(project_requested) > -1){
- self.showProject($scope.projectList[$scope.projects_url_dict[project_requested]])
- }
- }
- }
-
- var search_requested = $location.search().q;
- if(search_requested){
- $scope.searchText = search_requested
- }
-
- },
- controllerAs: 'lc'
- }
- }]);
-
- app.directive('faq',[ '$http', '$templateCache', function ($http, $templateCache, Languages) {
- return {
- restrict: 'E',
- templateUrl: '/partials/tabs/faq.html',
- controller: function ($scope, Languages) {
- $scope.lang = Languages.getData();
-
- $scope.getDefaultFAQMetadata = function () {
- $http.get('data/faq.liquid')
- .then(function (res) {
- $scope.faqs = res.data;
- $scope.generateMarkdown();
- })
- }
-
- $scope.lang = Languages.getData();
-
- $scope.getDefaultFAQMetadata();
-
- $scope.$watch( function () {
- return Languages.getData();
- }, function () {
- $scope.setLanguage(Languages.getData());
- }, true);
-
-
- $scope.setLanguage = function (val) {
- $scope.lang = val;
- $scope.updateFAQ();
- }
-
- $scope.updateFAQ = function () {
- if ($scope.lang != 'en') {
-
- $http.get('data/locale/'+$scope.lang+'/faq.json')
- .then(function (res) {
- $scope.faqs.map(function (faq) {
- if (res.data[faq.markdown]) {
- Object.keys(faq).map(function (key) {
- if (res.data[faq.markdown]) {
- faq['question'] = res.data[faq.markdown]
-
- }
- });
- }
- });
- $scope.generateMarkdown();
- });
- } else {
- $scope.getDefaultFAQMetadata();
- }
- }
-
- $scope.generateMarkdown = function() {
-
- if ($scope.lang != 'en') {
- $scope.faqs.forEach(function (faq, key) {
- $http.get('data/locale/' + $scope.lang + '/faq/' + faq.markdown)
- .then(function (res) {
- $scope.faqs[key].answer = res.data
- }, function (error) {
- $http.get($scope.faqs[key].url)
- .then(function (res) {
- $scope.faqs[key].answer = res.data;
- })
- });
- })
- } else {
- $scope.faqs.forEach(function (f, k) {
- $http.get($scope.faqs[k].url)
- .then(function (res) {
- $scope.faqs[k].answer = res.data
- });
- })
- }
- }
-
- },
- controllerAs: 'toc'
- }
- }]);
-
app.filter('format_issue', function () {
return function (value) {
if (!value) return '';
@@ -388,52 +99,4 @@
};
});
- app.directive('mentors', ['$http', function ($http) {
- return {
- restrict: 'E',
- templateUrl: '/partials/tabs/mentors.html',
- controller: function ($scope, $rootScope) {
- self = this
- self.mentorsList = {}
- self.adminsList = {}
-
- $http.get('data/projects.liquid')
- .then(function (res) {
- $scope.projects = res.data.filter(project => project.status != "completed")
- angular.forEach($scope.projects, function(value, key){
- angular.forEach(value.mentors, function(value, key){
- self.mentorsList[value] = {
- "github_handle" : value,
- "github_avatar_url": "https://avatars.githubusercontent.com/" +value
- }
- });
- });
- })
-
- $http.get('data/admins.json')
- .then(function (res) {
- admins = res.data
- angular.forEach(admins, function(value, key){
- self.adminsList[value] = {
- "github_handle" : value,
- "github_avatar_url": "https://avatars.githubusercontent.com/" +value
-
- }
- });
- })
-
- },
- controllerAs: "gic"
- }
- }]);
-
- app.directive('students', ['$http', function ($http) {
- return {
- restrict: 'E',
- templateUrl: '/partials/tabs/students.html',
- controller: function ($scope, $rootScope) { },
- controllerAs: "gsoc"
- }
- }]);
-
})();
diff --git a/resources/js/directives/faqs.js b/resources/js/directives/faqs.js
new file mode 100644
index 00000000..bc3b4c63
--- /dev/null
+++ b/resources/js/directives/faqs.js
@@ -0,0 +1,82 @@
+angular.module('coala')
+ .directive('faq', ['$http', '$templateCache', function ($http, $templateCache, Languages) {
+ return {
+ restrict: 'E',
+ templateUrl: '/partials/tabs/faq.html',
+ controller: function ($scope, Languages) {
+ $scope.lang = Languages.getData();
+
+ $scope.getDefaultFAQMetadata = function () {
+ $http.get('data/faq.liquid')
+ .then(function (res) {
+ $scope.faqs = res.data;
+ $scope.generateMarkdown();
+ })
+ }
+
+ $scope.lang = Languages.getData();
+
+ $scope.getDefaultFAQMetadata();
+
+ $scope.$watch(function () {
+ return Languages.getData();
+ }, function () {
+ $scope.setLanguage(Languages.getData());
+ }, true);
+
+
+ $scope.setLanguage = function (val) {
+ $scope.lang = val;
+ $scope.updateFAQ();
+ }
+
+ $scope.updateFAQ = function () {
+ if ($scope.lang != 'en') {
+
+ $http.get('data/locale/' + $scope.lang + '/faq.json')
+ .then(function (res) {
+ $scope.faqs.map(function (faq) {
+ if (res.data[faq.markdown]) {
+ Object.keys(faq).map(function (key) {
+ if (res.data[faq.markdown]) {
+ faq['question'] = res.data[faq.markdown]
+
+ }
+ });
+ }
+ });
+ $scope.generateMarkdown();
+ });
+ } else {
+ $scope.getDefaultFAQMetadata();
+ }
+ }
+
+ $scope.generateMarkdown = function () {
+
+ if ($scope.lang != 'en') {
+ $scope.faqs.forEach(function (faq, key) {
+ $http.get('data/locale/' + $scope.lang + '/faq/' + faq.markdown)
+ .then(function (res) {
+ $scope.faqs[key].answer = res.data
+ }, function (error) {
+ $http.get($scope.faqs[key].url)
+ .then(function (res) {
+ $scope.faqs[key].answer = res.data;
+ })
+ });
+ })
+ } else {
+ $scope.faqs.forEach(function (f, k) {
+ $http.get($scope.faqs[k].url)
+ .then(function (res) {
+ $scope.faqs[k].answer = res.data
+ });
+ })
+ }
+ }
+
+ },
+ controllerAs: 'toc'
+ }
+ }]);
diff --git a/resources/js/directives/mentors.js b/resources/js/directives/mentors.js
new file mode 100644
index 00000000..44542149
--- /dev/null
+++ b/resources/js/directives/mentors.js
@@ -0,0 +1,39 @@
+angular.module('coala')
+ .directive('mentors', ['$http', function ($http) {
+ return {
+ restrict: 'E',
+ templateUrl: '/partials/tabs/mentors.html',
+ controller: function ($scope, $rootScope) {
+ self = this
+ self.mentorsList = {}
+ self.adminsList = {}
+
+ $http.get('data/projects.liquid')
+ .then(function (res) {
+ $scope.projects = res.data.filter(project => project.status != "completed")
+ angular.forEach($scope.projects, function (value, key) {
+ angular.forEach(value.mentors, function (value, key) {
+ self.mentorsList[value] = {
+ "github_handle": value,
+ "github_avatar_url": "https://avatars.githubusercontent.com/" + value
+ }
+ });
+ });
+ })
+
+ $http.get('data/admins.json')
+ .then(function (res) {
+ admins = res.data
+ angular.forEach(admins, function (value, key) {
+ self.adminsList[value] = {
+ "github_handle": value,
+ "github_avatar_url": "https://avatars.githubusercontent.com/" + value
+
+ }
+ });
+ })
+
+ },
+ controllerAs: "gic"
+ }
+ }]);
diff --git a/resources/js/directives/projects.js b/resources/js/directives/projects.js
new file mode 100644
index 00000000..3617f189
--- /dev/null
+++ b/resources/js/directives/projects.js
@@ -0,0 +1,403 @@
+angular.module('coala')
+ .directive('projects', ['$http', '$timeout', '$location', 'Languages', 'orderByFilter', function ($http, $timeout, $location, Languages, orderBy) {
+ return {
+ restrict: 'E',
+ templateUrl: '/partials/tabs/projects.html',
+ controller: function ($scope, $location, Languages) {
+ self = this
+
+ $scope.message = {}
+ $scope.projectFilterOptions = {}
+ $scope.selectedStatusesList = []
+ $scope.selectedTagsList = []
+ $scope.selectedLevelsList = []
+ $scope.selectedInitiativesList = []
+ $scope.selectedCollabsList = []
+
+ var mapping = {
+ '': 0,
+ 'crowded': 1,
+ 'in_progress': 2,
+ 'completed': 3,
+ 'disabled': 4
+ }
+
+ self.displayFilters = false
+ $scope.toggleFiltersDisplay = function () {
+ self.displayFilters = !self.displayFilters
+ $('select').material_select();
+ }
+
+ $scope.sortOrder = function (project) {
+ return mapping[project.status];
+ }
+
+ $scope.sortProjects = function () {
+ $scope.projectList = orderBy($scope.projectList, 'mapped_status');
+ }
+
+ $scope.getFiltersMetadata = function () {
+ $http.get('data/projects.liquid')
+ .then(function (res) {
+ var projects = res.data;
+ angular.forEach(projects, function (project) {
+ if (project.status.length === 0) {
+ $scope.projectFilterOptions.status.options['NOT YET STARTED'] = 0
+ }
+ angular.forEach(project.status, function (state) {
+ $scope.projectFilterOptions.status.options[
+ state.replace('_', ' ').toUpperCase()
+ ] = mapping[state]
+ })
+ angular.forEach(project.tags, function (tag) {
+ $scope.projectFilterOptions.tags.options[tag] = tag
+ })
+ $scope.projectFilterOptions.difficulty.options[project.difficulty.toUpperCase()] = project.difficulty
+ angular.forEach(project.initiatives, function (initiative) {
+ $scope.projectFilterOptions.initiatives.options[initiative] = initiative
+ })
+ angular.forEach(project.collaborating_projects, function (collab) {
+ $scope.projectFilterOptions['collab-projects'].options[collab] = collab
+ })
+ })
+ })
+ }
+
+ $scope.initializeSelectorData = function (name, label, model_name) {
+ $scope.projectFilterOptions[name] = {
+ label: label, model: model_name, options: {}
+ }
+ }
+
+ $scope.getAllFilters = function () {
+ $scope.initializeSelectorData('status', 'Status', 'selectedStatusesList')
+ $scope.initializeSelectorData('tags', 'Project Tags', 'selectedTagsList')
+ $scope.initializeSelectorData('difficulty', 'Difficulty Level', 'selectedLevelsList')
+ $scope.initializeSelectorData('initiatives', 'Initiatives', 'selectedInitiativesList')
+ $scope.initializeSelectorData('collab-projects', 'Collaborating Projects', 'selectedCollabsList')
+ $scope.getFiltersMetadata()
+ }
+
+ function filterProjectsByStatus(projects) {
+ var selectedProjects = []
+ angular.forEach(projects, function (project) {
+ if (project.status.length === 0 && !selectedProjects.includes(project)) {
+ if (
+ ($scope.selectedStatusesList.includes("0") && project.mentors.length > 0) ||
+ ($scope.selectedStatusesList.includes("4") && project.mentors.length === 0)
+ ) {
+ selectedProjects.push(project)
+ }
+ }
+ else {
+ angular.forEach(project.status, function (state) {
+ var mappedState = (mapping[state]).toString()
+ if ($scope.selectedStatusesList.includes(mappedState) && !selectedProjects.includes(project)) {
+ selectedProjects.push(project)
+ }
+ })
+ }
+ })
+ return selectedProjects
+ }
+
+ function filterProjectsByTags(projects) {
+ var selectedProjects = []
+ angular.forEach(projects, function (project) {
+ angular.forEach(project.tags, function (tag) {
+ if ($scope.selectedTagsList.includes(tag) && !selectedProjects.includes(project)) {
+ selectedProjects.push(project)
+ }
+ })
+ })
+ return selectedProjects
+ }
+
+ function filterProjectsByDifficulty(projects) {
+ var selectedProjects = []
+ angular.forEach(projects, function (project) {
+ if ($scope.selectedLevelsList.includes(project.difficulty) && !selectedProjects.includes(project)) {
+ selectedProjects.push(project)
+ }
+ })
+ return selectedProjects
+ }
+
+ function filterProjectsByInitiatives(projects) {
+ var selectedProjects = []
+ angular.forEach(projects, function (project) {
+ angular.forEach(project.initiatives, function (initiative) {
+ if ($scope.selectedInitiativesList.includes(initiative) && !selectedProjects.includes(project)) {
+ selectedProjects.push(project)
+ }
+ })
+ })
+ return selectedProjects
+ }
+
+ function filterProjectsByCollaboratingProjects(projects) {
+ var selectedProjects = []
+ angular.forEach(projects, function (project) {
+ angular.forEach(project.collaborating_projects, function (collab) {
+ if ($scope.selectedCollabsList.includes(collab) && !selectedProjects.includes(project)) {
+ selectedProjects.push(project)
+ }
+ })
+ })
+ return selectedProjects
+ }
+
+ $scope.setModelList = function (filter, list) {
+ if (filter === 'status') {
+ $scope.selectedStatusesList = list
+ }
+ else if (filter === 'tags') {
+ $scope.selectedTagsList = list
+ }
+ else if (filter === 'difficulty') {
+ $scope.selectedLevelsList = list
+ }
+ else if (filter === 'initiatives') {
+ $scope.selectedInitiativesList = list
+ }
+ else {
+ $scope.selectedCollabsList = list
+ }
+ }
+
+ function anyFiltersApplied() {
+ return (
+ $scope.selectedStatusesList.length > 0 ||
+ $scope.selectedTagsList.length > 0 ||
+ $scope.selectedLevelsList.length > 0 ||
+ $scope.selectedInitiativesList.length > 0 ||
+ $scope.selectedCollabsList.length > 0
+ )
+ }
+
+ $scope.applyFilters = function () {
+ var filteredProjects = $scope.allProjects
+ if (anyFiltersApplied()) {
+ if ($scope.selectedStatusesList.length > 0 && filteredProjects.length > 0) {
+ filteredProjects = filterProjectsByStatus(filteredProjects)
+ }
+ if ($scope.selectedTagsList.length > 0 && filteredProjects.length > 0) {
+ filteredProjects = filterProjectsByTags(filteredProjects)
+ }
+ if ($scope.selectedLevelsList.length > 0 && filteredProjects.length > 0) {
+ filteredProjects = filterProjectsByDifficulty(filteredProjects)
+ }
+ if ($scope.selectedInitiativesList.length > 0 && filteredProjects.length > 0) {
+ filteredProjects = filterProjectsByInitiatives(filteredProjects)
+ }
+ if ($scope.selectedCollabsList.length > 0 && filteredProjects.length > 0) {
+ filteredProjects = filterProjectsByCollaboratingProjects(filteredProjects)
+ }
+ if (filteredProjects.length === 0) {
+ $scope.message.noProjectsFound = 'No projects found for your selected filters' +
+ ' options! Please try a different filter search combination.'
+ $scope.projectList = []
+ }
+ else {
+ $scope.projectList = filteredProjects
+ }
+ }
+ else {
+ $scope.projectList = filteredProjects
+ }
+ $scope.sortProjects();
+ }
+
+ $scope.clearFilters = function () {
+ $scope.projectList = $scope.allProjects
+ var select = $('select')
+ select.prop('selectedIndex', 0)
+ select.material_select()
+ }
+
+ $scope.getDefaultProjectsMetadata = function () {
+ $http.get('data/projects.liquid')
+ .then(function (res) {
+ $scope.projectList = res.data;
+ $scope.allProjects = res.data;
+ $scope.projectRequest();
+ })
+ }
+
+ $scope.lang = Languages.getData();
+
+ $scope.getDefaultProjectsMetadata();
+
+ $scope.$watch(function () {
+ return Languages.getData();
+ }, function () {
+ $scope.setLanguage(Languages.getData());
+ }, true);
+
+
+ $scope.setLanguage = function (val) {
+ $scope.lang = val;
+ $scope.updateProjects();
+ }
+
+ $scope.updateProjects = function () {
+ if ($scope.lang != 'en') {
+ $http.get('data/locale/' + $scope.lang + '/projects.json')
+ .then(function (res) {
+ $scope.projectList.map(function (project) {
+ if (res.data[project.markdown]) {
+ Object.keys(project).map(function (key) {
+ if (res.data[project.markdown][key]) {
+ project[key] = res.data[project.markdown][key]
+ }
+ });
+ }
+ });
+
+ $scope.projectRequest();
+ });
+ } else {
+ $scope.getDefaultProjectsMetadata();
+ $scope.projectRequest();
+ }
+ }
+
+ function generateMarkdown() {
+
+ function setFromDefault() {
+ $http.get($scope.currentProject.content_url)
+ .then(function (res) {
+ $scope.currentProject.content = res.data
+ }, function () {
+ $scope.currentProject.content = 'No content'
+ });
+ }
+
+ if ($scope.lang != 'en') {
+ $http.get('data/locale/' + $scope.lang + '/projects/' + $scope.currentProject.markdown).then(function (res) {
+ $scope.currentProject.content = res.data
+ }, function () {
+ setFromDefault()
+ });
+ } else {
+ setFromDefault()
+ }
+ }
+
+ self.showProject = function (project) {
+
+ $scope.currentProject = project
+
+ $(document).ready(function () {
+ $('.modal').modal('open');
+ });
+
+ mval = encodeURIComponent(project["name"].split(' ').join('_').toLowerCase());
+ $location.url('?project=' + mval + ($scope.lang ? '&lang=' + $scope.lang : ''))
+ $scope.$evalAsync();
+
+ generateMarkdown()
+ }
+
+ self.showProjectOnArrowClick = function (project) {
+
+ $scope.currentProject = project
+ mval = encodeURIComponent(project["name"].split(' ').join('_').toLowerCase());
+ $location.url('?project=' + mval + ($scope.lang ? '&lang=' + $scope.lang : ''))
+ $scope.$evalAsync();
+ generateMarkdown()
+ }
+
+ $scope.search = function (arg) {
+ $scope.searchText = arg
+ }
+
+ $scope.redirect = function (arg) {
+ window.open(arg, '_blank');
+ }
+
+ $scope.updateLink = function () {
+ $scope.currentProject = null;
+ $location.url($location.path());
+ }
+
+ $scope.encode_URI = function (project_name) {
+ return encodeURIComponent(project_name.split(' ').join('_').toLowerCase());
+ }
+
+ $scope.arrowPressed = function (e) {
+ if (e.keyCode == 37) {
+ keyPressed = "left"
+ $scope.moveToNext(keyPressed);
+ }
+ else if (e.keyCode == 39) {
+ keyPressed = "right"
+ $scope.moveToNext(keyPressed);
+ }
+
+ }
+
+ $scope.moveToNext = function (keyPressed) {
+ if ($scope.currentProject) {
+
+ total_projects = $scope.projectList.length
+ angular.forEach($scope.projectList, function (value, key) {
+ if ($scope.currentProject.name == value["name"]) {
+ current_project_index = key
+ }
+ });
+
+ if (keyPressed == "left") {
+ if (current_project_index == 0) {
+ self.showProjectOnArrowClick($scope.projectList[total_projects - 1])
+ } else {
+ self.showProjectOnArrowClick($scope.projectList[--current_project_index])
+ }
+ }
+ if (keyPressed == "right") {
+ if (current_project_index == total_projects - 1) {
+ self.showProjectOnArrowClick($scope.projectList[0])
+ } else {
+ self.showProjectOnArrowClick($scope.projectList[++current_project_index])
+ }
+ }
+ }
+ }
+
+ $scope.projectRequest = function () {
+
+ var redirectTo = {
+ "integrate_pyflakes-enhanced_ast_into_coala_": "integrate_pyflakes-enhanced_ast_into_coala"
+ };
+ $scope.projects_url_dict = {}
+ $scope.projects_url_list = Object.keys($scope.projects_url_dict);
+ angular.forEach($scope.projectList, function (value, key) {
+ value["url"] = encodeURIComponent(value["name"].split(' ').join('_').toLowerCase());
+ var mapped_status = $scope.sortOrder(value);
+ $scope.projectList[key]['mapped_status'] = mapped_status;
+ $scope.projects_url_dict[value["url"]] = key
+ });
+
+ $scope.sortProjects();
+
+ var project_requested = encodeURIComponent($location.search().project);
+ if (project_requested) {
+ if (project_requested in redirectTo) {
+ project_requested = redirectTo[project_requested]
+ }
+ if (Object.keys($scope.projects_url_dict).indexOf(project_requested) > -1) {
+ self.showProject($scope.projectList[$scope.projects_url_dict[project_requested]])
+ }
+ }
+ }
+
+ var search_requested = $location.search().q;
+ if (search_requested) {
+ $scope.searchText = search_requested
+ }
+
+ $scope.getAllFilters();
+ },
+ controllerAs: 'lc'
+ }
+ }]);
diff --git a/resources/js/directives/students.js b/resources/js/directives/students.js
new file mode 100644
index 00000000..663ed043
--- /dev/null
+++ b/resources/js/directives/students.js
@@ -0,0 +1,9 @@
+angular.module('coala')
+ .directive('students', ['$http', function ($http) {
+ return {
+ restrict: 'E',
+ templateUrl: '/partials/tabs/students.html',
+ controller: function ($scope, $rootScope) { },
+ controllerAs: "gsoc"
+ }
+ }]);