diff --git a/app/assets/javascripts/app/frontend/controllers/editor.js b/app/assets/javascripts/app/frontend/controllers/editor.js index cdca7863e..4f5e67417 100644 --- a/app/assets/javascripts/app/frontend/controllers/editor.js +++ b/app/assets/javascripts/app/frontend/controllers/editor.js @@ -46,7 +46,12 @@ angular.module('app.frontend') } }.bind(this), false); + $rootScope.$on("tag-changed", function(){ + this.loadTagsString(); + }.bind(this)); + this.setNote = function(note, oldNote) { + this.noteReady = false; var currentEditor = this.customEditor; this.customEditor = null; this.showExtensions = false; @@ -56,6 +61,7 @@ angular.module('app.frontend') var setEditor = function(editor) { this.customEditor = editor; this.postNoteToExternalEditor(); + this.noteReady = true; }.bind(this) var editor = this.editorForNote(note); @@ -71,6 +77,7 @@ angular.module('app.frontend') } } else { this.customEditor = null; + this.noteReady = true; } if(note.safeText().length == 0 && note.dummy) { diff --git a/app/assets/javascripts/app/frontend/controllers/home.js b/app/assets/javascripts/app/frontend/controllers/home.js index 5aa625a9a..0a87f0165 100644 --- a/app/assets/javascripts/app/frontend/controllers/home.js +++ b/app/assets/javascripts/app/frontend/controllers/home.js @@ -91,18 +91,19 @@ angular.module('app.frontend') $scope.tagsSave = function(tag, callback) { if(!tag.title || tag.title.length == 0) { - $scope.notesRemoveTag(tag); + $scope.removeTag(tag); return; } tag.setDirty(true); syncManager.sync(callback); + $rootScope.$broadcast("tag-changed"); } /* Notes Ctrl Callbacks */ - $scope.notesRemoveTag = function(tag) { + $scope.removeTag = function(tag) { var validNotes = Note.filterDummyNotes(tag.notes); if(validNotes == 0) { modelManager.setItemToBeDeleted(tag); diff --git a/app/assets/javascripts/app/frontend/controllers/notes.js b/app/assets/javascripts/app/frontend/controllers/notes.js index 0d3106260..29081f840 100644 --- a/app/assets/javascripts/app/frontend/controllers/notes.js +++ b/app/assets/javascripts/app/frontend/controllers/notes.js @@ -4,8 +4,7 @@ angular.module('app.frontend') scope: { addNew: "&", selectionMade: "&", - tag: "=", - removeTag: "&" + tag: "=" }, templateUrl: 'frontend/notes.html', @@ -69,11 +68,6 @@ angular.module('app.frontend') this.selectFirstNote(createNew); } - this.selectedTagDelete = function() { - this.showMenu = false; - this.removeTag()(this.tag); - } - this.selectFirstNote = function(createNew) { var visibleNotes = this.sortedNotes.filter(function(note){ return note.visible; diff --git a/app/assets/javascripts/app/frontend/controllers/tags.js b/app/assets/javascripts/app/frontend/controllers/tags.js index 422c308f2..8b5357480 100644 --- a/app/assets/javascripts/app/frontend/controllers/tags.js +++ b/app/assets/javascripts/app/frontend/controllers/tags.js @@ -9,7 +9,8 @@ angular.module('app.frontend') save: "&", tags: "=", allTag: "=", - updateNoteTag: "&" + updateNoteTag: "&", + removeTag: "&" }, templateUrl: 'frontend/tags.html', replace: true, @@ -32,7 +33,7 @@ angular.module('app.frontend') } } }) - .controller('TagsCtrl', function (modelManager) { + .controller('TagsCtrl', function (modelManager, $timeout) { var initialLoad = true; @@ -68,11 +69,6 @@ angular.module('app.frontend') this.addNew()(this.newTag); } - var originalTagName = ""; - this.onTagTitleFocus = function(tag) { - originalTagName = tag.title; - } - this.tagTitleDidChange = function(tag) { this.editingTag = tag; } @@ -98,6 +94,23 @@ angular.module('app.frontend') }.bind(this)); } + function inputElementForTag(tag) { + return document.getElementById("tag-" + tag.uuid); + } + + var originalTagName = ""; + this.selectedRenameTag = function($event, tag) { + originalTagName = tag.title; + this.editingTag = tag; + $timeout(function(){ + inputElementForTag(tag).focus(); + }) + } + + this.selectedDeleteTag = function(tag) { + this.removeTag()(tag); + } + this.noteCount = function(tag) { var validNotes = Note.filterDummyNotes(tag.notes); return validNotes.length; diff --git a/app/assets/javascripts/app/services/directives/views/accountMenu.js b/app/assets/javascripts/app/services/directives/views/accountMenu.js index 03f63e9cd..7e926d430 100644 --- a/app/assets/javascripts/app/services/directives/views/accountMenu.js +++ b/app/assets/javascripts/app/services/directives/views/accountMenu.js @@ -98,11 +98,17 @@ class AccountMenu { } $scope.submitRegistrationForm = function() { - var confirmation = prompt("Please confirm your password. Note that because your notes are encrypted using your password, Standard Notes does not have a password reset option. You cannot forget your password.") + $scope.formData.confirmPassword = true; + } + + $scope.submitPasswordConfirmation = function() { + let confirmation = $scope.formData.pw_confirmation; if(confirmation !== $scope.formData.user_password) { alert("The two passwords you entered do not match. Please try again."); return; } + + $scope.formData.confirmPassword = false; $scope.formData.status = "Generating Account Keys..."; $timeout(function(){ diff --git a/app/assets/javascripts/app/services/extensionManager.js b/app/assets/javascripts/app/services/extensionManager.js index 6bc189217..d271e72cf 100644 --- a/app/assets/javascripts/app/services/extensionManager.js +++ b/app/assets/javascripts/app/services/extensionManager.js @@ -92,6 +92,10 @@ class ExtensionManager { */ retrieveExtensionFromServer(url, callback) { this.httpManager.getAbsolute(url, {}, function(response){ + if(typeof response !== 'object') { + callback(null); + return; + } var ext = this.handleExtensionLoadExternalResponseItem(url, response); if(callback) { callback(ext); diff --git a/app/assets/javascripts/app/services/httpManager.js b/app/assets/javascripts/app/services/httpManager.js index 4dcfaa07d..259d6b7ca 100644 --- a/app/assets/javascripts/app/services/httpManager.js +++ b/app/assets/javascripts/app/services/httpManager.js @@ -28,7 +28,9 @@ class HttpManager { if (xmlhttp.readyState == 4) { var response = xmlhttp.responseText; if(response) { - response = JSON.parse(response); + try { + response = JSON.parse(response); + } catch(e) {} } if(xmlhttp.status >= 200 && xmlhttp.status <= 299){ diff --git a/app/assets/javascripts/app/services/syncManager.js b/app/assets/javascripts/app/services/syncManager.js index 25d4e00f1..1ea34caf3 100644 --- a/app/assets/javascripts/app/services/syncManager.js +++ b/app/assets/javascripts/app/services/syncManager.js @@ -10,7 +10,7 @@ class SyncManager { } get serverURL() { - return localStorage.getItem("server") || "https://n3.standardnotes.org"; + return localStorage.getItem("server") || window._default_sf_server; } get masterKey() { diff --git a/app/assets/stylesheets/app/_editor.scss b/app/assets/stylesheets/app/_editor.scss index cd2c35a9a..0e83e16e1 100644 --- a/app/assets/stylesheets/app/_editor.scss +++ b/app/assets/stylesheets/app/_editor.scss @@ -5,6 +5,7 @@ $heading-height: 75px; display: flex; flex-direction: column; overflow-y: hidden; + background-color: white; &.fullscreen { width: 100%; @@ -15,24 +16,19 @@ $heading-height: 75px; padding: 0; } - .section-title-bar { - border-bottom: none !important; - height: $heading-height !important; - } - .section-menu { flex: 1 0 28px; max-height: 28px; } } -.editor-heading { - +#editor-title-bar { width: 100%; - padding: 15px; - padding-top: 0px; + padding: 20px; background-color: white; + border-bottom: none; + height: $heading-height; min-height: $heading-height; padding-right: 10px; @@ -63,8 +59,8 @@ $heading-height: 75px; } - .save-status { - width: 20% !important; + #save-status { + width: 20%; float: right; position: absolute; @@ -73,12 +69,11 @@ $heading-height: 75px; text-transform: none; font-weight: normal; margin-top: 4px; - width: 120px; text-align: right; color: rgba(black, 0.23); } - .tags { + .editor-tags { clear: left; width: 100%; height: 25px; @@ -125,6 +120,8 @@ $heading-height: 75px; padding: 85px 10%; max-width: 1200px; display: inline-block; + margin-left: auto; + margin-right: auto; } } } diff --git a/app/assets/stylesheets/app/_header.scss b/app/assets/stylesheets/app/_header.scss index fdeb83a11..30a98150a 100644 --- a/app/assets/stylesheets/app/_header.scss +++ b/app/assets/stylesheets/app/_header.scss @@ -13,7 +13,7 @@ h2 { margin-top: 0px; } -.footer-bar { +#footer-bar { position: relative; width: 100%; padding: 5px; @@ -23,7 +23,6 @@ h2 { z-index: 100; font-size: 10px; color: $dark-gray; - border-bottom: 1px solid rgba(#979799, 0.4); .medium-text { font-size: 14px; @@ -35,11 +34,11 @@ h2 { color: $blue-color; &.gray { - color: $dark-gray !important; + color: $dark-gray; } &.block { - display: block !important; + display: block; } } @@ -59,14 +58,14 @@ h2 { h3 { - font-size: 14px !important; - margin-top: 4px !important; - margin-bottom: 3px !important; + font-size: 14px ; + margin-top: 4px ; + margin-bottom: 3px; } h4 { - margin-bottom: 4px !important; - font-size: 13px !important; + margin-bottom: 4px; + font-size: 13px; } section { @@ -88,7 +87,7 @@ h2 { } } -.footer-bar-link { +#footer-bar .footer-bar-link { font-size: 11px; font-weight: bold; margin-left: 8px; @@ -161,11 +160,6 @@ button.light { border: 1px solid rgba(gray, 0.2); } -.item.last-refreshed { - font-weight: normal !important; - cursor: default !important; -} - a.disabled { pointer-events: none; } diff --git a/app/assets/stylesheets/app/_mostrap.scss b/app/assets/stylesheets/app/_mostrap.scss index 2776256a1..c15c66276 100644 --- a/app/assets/stylesheets/app/_mostrap.scss +++ b/app/assets/stylesheets/app/_mostrap.scss @@ -180,7 +180,7 @@ button:focus {outline:0;} background-image: none; border: 1px solid #ccc; border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: 0; -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } diff --git a/app/assets/stylesheets/app/_notes.scss b/app/assets/stylesheets/app/_notes.scss index 4294ff6de..f0dd9e532 100644 --- a/app/assets/stylesheets/app/_notes.scss +++ b/app/assets/stylesheets/app/_notes.scss @@ -8,12 +8,12 @@ $notes-title-bar-height: 130px; - .notes-title-bar { + #notes-title-bar { color: rgba(black, 0.40); - padding-top: 16px !important; - height: $notes-title-bar-height !important; - font-weight: normal !important; - font-size: 18px !important; + padding-top: 16px; + height: $notes-title-bar-height; + font-weight: normal; + font-size: 18px; } .tag-menu-bar { diff --git a/app/assets/stylesheets/app/_tags.scss b/app/assets/stylesheets/app/_tags.scss index ba45efd89..a12ad01ba 100644 --- a/app/assets/stylesheets/app/_tags.scss +++ b/app/assets/stylesheets/app/_tags.scss @@ -1,31 +1,30 @@ .tags { - // width: 15%; flex: 1 10%; max-width: 180px; min-width: 100px; $tags-title-bar-height: 55px; - .tags-title-bar { - color: black; - height: $tags-title-bar-height !important; - padding-left: 12px !important; - padding-right: 12px !important; - font-size: 12px !important; - color: rgba(black, 0.8); + #tags-title-bar { + color: black; + height: $tags-title-bar-height; + padding-left: 12px; + padding-right: 12px; + font-size: 12px; + color: rgba(black, 0.8); } - .content { - background-color: #f6f6f6 !important; + #tags-content { + background-color: #f6f6f6; } - .tag-add-button { + #tag-add-button { margin-top: -6px; - background-color: #d7d7d7 !important; + background-color: #d7d7d7; float: right; &:hover { - background-color: rgba(#d7d7d7, 0.8) !important; + background-color: rgba(#d7d7d7, 0.8); } } @@ -34,36 +33,54 @@ } .tag { - height: 30px; + min-height: 30px; padding: 5px 12px; cursor: pointer; transition: height .1s ease-in-out; position: relative; font-size: 14px; - > .icon { - float: left; - padding-top: 6px; - margin-right: 5px; + > .info { + height: 20px; + + > .title { + width: 80%; + background-color: transparent; + font-weight: 600; + float: left; + color: $main-text-color; + border: none; + cursor: pointer; + text-overflow: ellipsis; + width: 75%; + + pointer-events: none; + } + + > .count { + position: absolute; + right: 17px; + padding-top: 1px; + font-weight: bold; + } } - > .title { - width: 80%; - background-color: transparent; - font-weight: 600; - float: left; - color: $main-text-color; - border: none; - cursor: pointer; - text-overflow: ellipsis; - width: 75%; - } + > .menu { + font-size: 11px; - > .count { - position: absolute; - right: 17px; - padding-top: 1px; + > .item { + margin-right: 2px; + } + + opacity: 0.5; font-weight: bold; + clear: both; + margin-top: 2px; + margin-bottom: 2px; + + &:hover { + opacity: 1.0; + } } $tags-selected-color: #dbdbdb; diff --git a/app/assets/templates/frontend/directives/account-menu.html.haml b/app/assets/templates/frontend/directives/account-menu.html.haml index 3c93889a5..7d971dbee 100644 --- a/app/assets/templates/frontend/directives/account-menu.html.haml +++ b/app/assets/templates/frontend/directives/account-menu.html.haml @@ -1,26 +1,35 @@ .panel.panel-default.panel-right.account-data-menu .panel-body.large-padding %div{"ng-if" => "!user"} - %p Enter your Standard File account information. You can also register for free using the default server address. - .small-v-space + %div{"ng-if" => "!formData.confirmPassword"} + %p Enter your Standard File account information. You can also register for free using the default server address. + .small-v-space - %form.account-form.mt-5{'name' => "loginForm"} - %input.form-control{:name => 'server', :placeholder => 'Server URL', :required => true, :type => 'text', 'ng-model' => 'formData.url'} - %input.form-control{:autofocus => 'autofocus', :name => 'email', :placeholder => 'Email', :required => true, :type => 'email', 'ng-model' => 'formData.email'} - %input.form-control{:placeholder => 'Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'formData.user_password'} - .checkbox{"ng-if" => "localNotesCount() > 0"} - %label - %input{"type" => "checkbox", "ng-model" => "formData.mergeLocal", "ng-bind" => "true", "ng-change" => "mergeLocalChanged()"} - Merge local notes ({{localNotesCount()}} notes) + %form.mt-5 + %input.form-control{:name => 'server', :placeholder => 'Server URL', :required => true, :type => 'text', 'ng-model' => 'formData.url'} + %input.form-control{:autofocus => 'autofocus', :name => 'email', :placeholder => 'Email', :required => true, :type => 'email', 'ng-model' => 'formData.email'} + %input.form-control{:placeholder => 'Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'formData.user_password'} + .checkbox{"ng-if" => "localNotesCount() > 0"} + %label + %input{"type" => "checkbox", "ng-model" => "formData.mergeLocal", "ng-bind" => "true", "ng-change" => "mergeLocalChanged()"} + Merge local notes ({{localNotesCount()}} notes) - %div{"ng-if" => "!formData.status"} - %button.btn.dark-button.half-button{"ng-click" => "loginSubmitPressed()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"} - %span Sign In - %button.btn.dark-button.half-button{"ng-click" => "submitRegistrationForm()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"} - %span Register - %br - .block{"style" => "margin-top: 10px; font-size: 14px; font-weight: bold; text-align: center;"} - %a.btn{"ng-click" => "showResetForm = !showResetForm"} Passwords cannot be forgotten. + %div{"ng-if" => "!formData.status"} + %button.btn.dark-button.half-button{"ng-click" => "loginSubmitPressed()"} + %span Sign In + %button.btn.dark-button.half-button{"ng-click" => "submitRegistrationForm()"} + %span Register + %br + .block{"style" => "margin-top: 10px; font-size: 14px; font-weight: bold; text-align: center;"} + %a.btn{"ng-click" => "showResetForm = !showResetForm"} Passwords cannot be forgotten. + + %div{"ng-if" => "formData.confirmPassword"} + %h3 Confirm your password. + %p.mt-5 Note that because your notes are encrypted using your password, Standard Notes does not have a password reset option. You cannot forget your password. + %form.mt-10 + %input.form-control{:placeholder => 'Confirm Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'formData.pw_confirmation'} + %button.btn.dark-button.btn-block{"ng-click" => "submitPasswordConfirmation()"} + %span Confirm %em.block.center-align.mt-10{"ng-if" => "formData.status", "style" => "font-size: 14px;"} {{formData.status}} diff --git a/app/assets/templates/frontend/editor.html.haml b/app/assets/templates/frontend/editor.html.haml index 933e00c99..082d5596a 100644 --- a/app/assets/templates/frontend/editor.html.haml +++ b/app/assets/templates/frontend/editor.html.haml @@ -1,11 +1,11 @@ .section.editor{"ng-class" => "{'fullscreen' : ctrl.fullscreen}"} - .section-title-bar.editor-heading{"ng-if" => "ctrl.note", "ng-class" => "{'fullscreen' : ctrl.fullscreen }"} + #editor-title-bar.section-title-bar{"ng-if" => "ctrl.note", "ng-class" => "{'fullscreen' : ctrl.fullscreen }"} .title %input.input#note-title-editor{"ng-model" => "ctrl.note.title", "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTitle($event)", "ng-change" => "ctrl.nameChanged()", "ng-focus" => "ctrl.onNameFocus()", "select-on-click" => "true"} - .save-status{"ng-class" => "{'red bold': ctrl.saveError}", "ng-bind-html" => "ctrl.noteStatus"} - .tags + #save-status{"ng-class" => "{'red bold': ctrl.saveError}", "ng-bind-html" => "ctrl.noteStatus"} + .editor-tags %input.tags-input{"type" => "text", "ng-keyup" => "$event.keyCode == 13 && $event.target.blur();", "ng-model" => "ctrl.tagsString", "placeholder" => "#tags", "ng-blur" => "ctrl.updateTagsFromTagsString($event, ctrl.tagsString)"} .section-menu{"ng-if" => "ctrl.note"} @@ -38,7 +38,7 @@ %span.sr-only %contextual-extensions-menu{"ng-if" => "ctrl.showExtensions", "item" => "ctrl.note"} - .editor-content{"ng-class" => "{'fullscreen' : ctrl.fullscreen }"} + .editor-content{"ng-if" => "ctrl.noteReady", "ng-class" => "{'fullscreen' : ctrl.fullscreen }"} %iframe#editor-iframe{"ng-if" => "ctrl.customEditor", "ng-src" => "{{ctrl.customEditor.url | trusted}}", "frameBorder" => "0", "style" => "width: 100%;"} %textarea.editable#note-text-editor{"ng-if" => "!ctrl.customEditor", "ng-class" => "{'fullscreen' : ctrl.fullscreen }", "ng-model" => "ctrl.note.text", "ng-change" => "ctrl.contentChanged()", "ng-click" => "ctrl.clickedTextArea()", "ng-focus" => "ctrl.onContentFocus()"} diff --git a/app/assets/templates/frontend/header.html.haml b/app/assets/templates/frontend/header.html.haml index 972825eaf..a908c2f4b 100644 --- a/app/assets/templates/frontend/header.html.haml +++ b/app/assets/templates/frontend/header.html.haml @@ -1,4 +1,4 @@ -.footer-bar +#footer-bar .pull-left .footer-bar-link{"click-outside" => "ctrl.showAccountMenu = false;", "is-open" => "ctrl.showAccountMenu"} %a{"ng-click" => "ctrl.accountMenuPressed()", "ng-class" => "{red: ctrl.error}"} Account diff --git a/app/assets/templates/frontend/home.html.haml b/app/assets/templates/frontend/home.html.haml index 28584401b..2b4ad06d7 100644 --- a/app/assets/templates/frontend/home.html.haml +++ b/app/assets/templates/frontend/home.html.haml @@ -1,10 +1,9 @@ .main-ui-view .app %tags-section{"save" => "tagsSave", "add-new" => "tagsAddNew", "will-select" => "tagsWillMakeSelection", "selection-made" => "tagsSelectionMade", "all-tag" => "allTag", - "tags" => "tags"} + "tags" => "tags", "remove-tag" => "removeTag"} - %notes-section{"remove-tag" => "notesRemoveTag", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", - "tag" => "selectedTag"} + %notes-section{"add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", "tag" => "selectedTag"} %editor-section{"note" => "selectedNote", "remove" => "deleteNote", "save" => "saveNote", "update-tags" => "updateTagsForNote"} diff --git a/app/assets/templates/frontend/notes.html.haml b/app/assets/templates/frontend/notes.html.haml index 63a42b7f0..ac5bd606b 100644 --- a/app/assets/templates/frontend/notes.html.haml +++ b/app/assets/templates/frontend/notes.html.haml @@ -1,6 +1,6 @@ .section.notes .content - .section-title-bar.notes-title-bar + .section-title-bar#notes-title-bar .title {{ctrl.tag.title}} notes .add-button{"ng-click" => "ctrl.createNewNote()"} + %br @@ -10,7 +10,7 @@ %ul.nav.nav-pills %li.dropdown %a.dropdown-toggle{"ng-click" => "ctrl.showMenu = !ctrl.showMenu"} - Menu + Sort %span.caret %span.sr-only @@ -18,13 +18,11 @@ %li %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.selectedSortByCreated()"} %span.top.mt-5.mr-5{"ng-if" => "ctrl.sortBy == 'created_at'"} ✓ - Sort by date created + By date added %li %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.selectedSortByUpdated()"} %span.top.mt-5.mr-5{"ng-if" => "ctrl.sortBy == 'updated_at'"} ✓ - Sort by date updated - %li - %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.selectedTagDelete()"} Delete Tag + By date modified .scrollable .infinite-scroll{"infinite-scroll" => "ctrl.paginate()", "can-load" => "true", "threshold" => "200"} diff --git a/app/assets/templates/frontend/tags.html.haml b/app/assets/templates/frontend/tags.html.haml index 7f28cfa24..dcc21d6e7 100644 --- a/app/assets/templates/frontend/tags.html.haml +++ b/app/assets/templates/frontend/tags.html.haml @@ -1,18 +1,22 @@ .section.tags - .content - .section-title-bar.tags-title-bar + #tags-content.content + #tags-title-bar.section-title-bar .title Tags - .add-button.tag-add-button{"ng-click" => "ctrl.clickedAddNewTag()"} + + .add-button#tag-add-button{"ng-click" => "ctrl.clickedAddNewTag()"} + {{ctrl.test}} .scrollable .tag{"ng-if" => "ctrl.allTag", "ng-click" => "ctrl.selectTag(ctrl.allTag)", "ng-class" => "{'selected' : ctrl.selectedTag == ctrl.allTag}"} - %input.title{"ng-disabled" => "true", "ng-model" => "ctrl.allTag.title"} - .count {{ctrl.noteCount(ctrl.allTag)}} - .tag{"ng-repeat" => "tag in ctrl.tags", "ng-click" => "ctrl.selectTag(tag)", "ng-class" => "{'selected' : ctrl.selectedTag == tag}", - "droppable" => true, "drop" => "ctrl.handleDrop", "tag" => "tag"} - - %input.title{"ng-disabled" => "tag != ctrl.selectedTag", "ng-model" => "tag.title", - "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTag($event, tag)", "mb-autofocus" => "true", "should-focus" => "ctrl.newTag", - "ng-change" => "ctrl.tagTitleDidChange(tag)", "ng-focus" => "ctrl.onTagTitleFocus(tag)", "ng-blur" => "ctrl.saveTag($event, tag)"} - .count {{ctrl.noteCount(tag)}} + .info + %input.title{"ng-disabled" => "true", "ng-model" => "ctrl.allTag.title"} + .count {{ctrl.noteCount(ctrl.allTag)}} + .tag{"ng-repeat" => "tag in ctrl.tags", "ng-click" => "ctrl.selectTag(tag)", "ng-class" => "{'selected' : ctrl.selectedTag == tag}"} + .info + %input.title{"ng-attr-id" => "tag-{{tag.uuid}}", "ng-click" => "ctrl.selectTag(tag)", "ng-model" => "tag.title", + "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTag($event, tag)", "mb-autofocus" => "true", "should-focus" => "ctrl.newTag || ctrl.editingTag == tag", + "ng-change" => "ctrl.tagTitleDidChange(tag)", "ng-blur" => "ctrl.saveTag($event, tag)", "spellcheck" => "false"} + .count {{ctrl.noteCount(tag)}} + .menu{"ng-if" => "ctrl.selectedTag == tag"} + %a.item{"ng-click" => "ctrl.selectedRenameTag($event, tag)", "ng-if" => "!ctrl.editingTag"} Rename + %a.item{"ng-click" => "ctrl.saveTag($event, tag)", "ng-if" => "ctrl.editingTag"} Save + %a.item{"ng-click" => "ctrl.selectedDeleteTag(tag)"} Delete diff --git a/app/views/application/frontend.html.erb b/app/views/application/frontend.html.erb index 48066778e..9e9426521 100644 --- a/app/views/application/frontend.html.erb +++ b/app/views/application/frontend.html.erb @@ -28,6 +28,10 @@ + + <% if Rails.env.development? %> <%= javascript_include_tag "compiled.js", debug: true %> <% else %>