Desktop markdown wiki app. Built with node, Electron Framework and AngularJS.

app-ctrl.js 10KB

    /** * @ngdoc function * @name domainManagerApp.controller:AboutCtrl * @description * # AboutCtrl * Controller of the domainManagerApp */ angular.module('codexApp.index', []) .controller('AppCtrl', ['$scope', '$rootScope', '$state', '$location', 'FileService', 'PrefsService', '$timeout', '$location', '$anchorScroll', function ($scope, $rootScope, $state, $location, FileService, PrefsService, $timeout, $location, $anchorScroll) { var all_files = []; var current_page = 0; var page_count = 2; var page_count_start = 30; var info_count = 0; var loaded = false; $scope.files = []; $scope.setView = function() { $scope.view = PrefsService.getCurrentView() //$scope.files = []; $timeout(function() { switch ($scope.view) { case "All Notes": var note = { type : "All Notes" } FileService.setCurrentNote(note); all_files = FileService.getAllNotes(); info_count = all_files.length; var f = []; var i = 0; for (i = 0; i <= page_count_start; i++) { if(all_files[i] != undefined){ f.push(all_files[i]) } else { break; } } $scope.files = f; all_files.splice(0, i); var info = info_count + " Notes" $rootScope.$broadcast('footer:info', info); break; case "All Files": var note = { type : "All Files" } FileService.setCurrentNote(note); all_files = FileService.getAllFiles(); info_count = all_files.length; var f = []; var i = 0; for (i = 0; i <= page_count_start; i++) { if(all_files[i] != undefined){ f.push(all_files[i]) } else { break; } } $scope.files = f; all_files.splice(0, i); var info = info_count + " Files" $rootScope.$broadcast('footer:info', info); break; case "Notebooks": $scope.current_folder = FileService.getNotesDir(); var note = { type : "Notebooks" } FileService.setCurrentNote(note); all_files = FileService.getFolders(); info_count = all_files.length; var f = []; var i = 0; for (i = 0; i <= page_count_start; i++) { if(all_files[i] != undefined){ f.push(all_files[i]) } else { break; } } $scope.files = f; all_files.splice(0, i); var info = info_count + " Folders" $rootScope.$broadcast('footer:info', info); break; case "Notebook": $scope.current_folder = FileService.getNotesDir(); all_files = FileService.getFiles(FileService.getCurrentNote().path); info_count = all_files.length; var f = []; var i = 0; for (i = 0; i <= page_count_start; i++) { if(all_files[i] != undefined){ f.push(all_files[i]) } else { break; } } $scope.files = f; all_files.splice(0, i); var info = info_count + " Items" $rootScope.$broadcast('footer:info', info); break; case "Searched Files": all_files = FileService.getSearchFiles(); info_count = all_files.length; var f = []; var i = 0; for (i = 0; i <= page_count_start; i++) { if(all_files[i] != undefined){ f.push(all_files[i]) } else { break; } } $scope.files = f; all_files.splice(0, i); var info = info_count + " Items" $rootScope.$broadcast('footer:info', info); break; } var last_view = FileService.getLastHistoryView(); if(last_view !== undefined){ if(last_view.title !== undefined){ $location.hash(last_view.title); console.log("return list pointer to item " + last_view.title) } else { $location.hash('grid'); } } else { $location.hash('grid'); } $timeout(function() { console.log("Fading in new items") $scope.fader = "fade-in"; loaded = true; $anchorScroll(); }, 250); }, 25); } $scope.setView(); $rootScope.$on('window-view:change', function(){ current_page = 1; loaded = false; console.log("Changin view..."); $scope.fader = "fade-out"; var state = FileService.getCurrentNote(); if(state.type == "All Files" || state.type == "All Notes" || state.type == "Notebooks" || state.type == "Notebook" || state.type == "Searched Files"){ $scope.setView(); } }); var remote = require('remote') $scope.openFile = function(file){ console.log("-> Openning " + file.type + " link: " + file.path); switch (file.type) { case "Markdown": FileService.setCurrentNote(file) $rootScope.$broadcast('main-window:note-view'); $state.go("note-view"); break; case "Folder": $scope.current_folder = file.path; var file = { type : "Notebook", path : file.path } FileService.setCurrentNote(file) PrefsService.setCurrentView("Notebook"); $scope.setView(); break; case "Image": FileService.setCurrentNote(file) $rootScope.$broadcast('main-window:note-view'); $state.go("image-view"); break; default: break; } } $scope.editFile = function(file){ console.log("-> Editing " + file.type + " link: " + file.path); switch (file.type) { case "Markdown": FileService.setCurrentNote(file) $rootScope.$broadcast('main-window:note-edit'); $state.go("note-edit"); break; } } $rootScope.$on('file-service:files-loaded', function(){ if(!$scope.$$phase) { $scope.$apply(function(){ //$scope.itemSpacing(); }); } else { //$scope.itemSpacing(); } }) $rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){ console.log(unfoundState.to); // "lazy.state" console.log(unfoundState.toParams); // {a:1, b:2} console.log(unfoundState.options); // {inherit:false} + default options }) $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){ console.log('Change state error'); // "lazy.state" console.log(error) console.log(toState) console.log(toParams) console.log(fromState) console.log(fromParams) }) $scope.itemSpacing = function(){ //var html_items = document.getElementsByClassName("file-view-item"); //var items = [].slice.call(html_items); // var items = HTMLNodesToArray('grid', 'li'); // for (var i = 0; i < items.length; i++) { // items[i].style.margin = "55px"; // console.log(item[i]); // } } $scope.isImage = function(file_type) { if(file_type != 'Image') { return true; } else { return false; } } $scope.getImageURL = function(img_url) { return "" + FileService.absoluteToRelativeURL(FileService.getNotesDir(), img_url) } $scope.shortenPath = function(path) { if($scope.current_folder != null) { return FileService.shortenPath(path); } else { return ""; } } var Menu = remote.require('menu'); var MenuItem = remote.require('menu-item'); var currentWindow = remote.getCurrentWindow(); var clipboard = require('clipboard'); $scope.fileContextMenu = function (file) { var menu = new Menu(); menu.append(new MenuItem({ label: 'Open File', click: function () { $scope.openFile(file); } })); menu.append(new MenuItem({ label: 'Edit File', click: function () { $scope.editFile(file); } })); menu.append(new MenuItem({ label: 'Copy File URL', click: function () { var url = file.path; console.log("-> Copying URL to clipboard " + url); clipboard.writeText(url); } })); menu.append(new MenuItem({ label: 'Delete', click: function () { if(FileService.deleteFile(file.path)){ var index = $scope.files.indexOf(file); if (index > -1) { if(!$scope.$$phase) { $scope.$apply(function(){ $scope.files.splice(index, 1); }); } else { $scope.files.splice(index, 1); } } }; } })); menu.popup(currentWindow); } $scope.infiniteScroll = function() { if(loaded == true){ var note_type = FileService.getCurrentNote().type; if (note_type == "All Notes" || note_type == "All Files" || note_type == "Notebooks" || note_type == "Notebook"){ if(all_files.length > 0 && $scope.files.length < info_count){ current_page = current_page + 1; console.log("scrolling") var i = 0; for (i = 0; i <= page_count; i++) { if(all_files[i] != undefined){ $scope.files.push(all_files[i]) } else { break; } } all_files.splice(0, i + 1); } } } } var HTMLNodesToArray = function (reference, elems) { reference = document.getElementById(reference); console.log(reference); //elems = elems || '*'; //var nodes = []; //var elements = reference.getElementsByClassName(elems); var elements = angular.element(document.querySelector( '.file-view-item' )); console.log(elements); // var i; // nodes = Array.prototype.slice.call(elements); // console.log( Array.isArray(elements)) // console.log( Array.isArray(nodes)) // console.log(nodes) // var len = elements.length; // console.log(len) // for(i = 0; i< len; i += 1) { // var node = elements[i]; // nodes.push(node); // } return elements; } }]);