Compare commits

..

No commits in common. "05152cd5a452db12177c6cdc63181f0ab4b0f2d3" and "7f93925f74502a477e8efa5af269943e085db875" have entirely different histories.

18 changed files with 103 additions and 267 deletions

View File

@ -13,7 +13,6 @@
<script> <script>
// import io from 'socket.io-client' // import io from 'socket.io-client'
import axios from 'axios'
export default { export default {
components: { components: {
@ -51,6 +50,7 @@ export default {
}, },
mounted: function(){ mounted: function(){
}, },
computed: { computed: {
loggedIn () { loggedIn () {

View File

@ -28,7 +28,7 @@
} }
html { html {
/*scrollbar-width: none;*/ scrollbar-width: none;
} }
div.ui.basic.segment.no-fluf-segment { div.ui.basic.segment.no-fluf-segment {

View File

@ -105,13 +105,13 @@
<!-- Buttons --> <!-- Buttons -->
<div class="ui small compact basic button" v-on:click="openNote"> <div class="ui small compact basic button" v-on:click="openNote">
<i class="file outline icon"></i> <i class="file icon"></i>
Open Note Open Note
</div> </div>
<div class="ui small compact basic button" v-on:click="openEditAttachments" <div class="ui small compact basic button" v-on:click="openEditAttachments"
:class="{ 'disabled':this.searchParams.noteId }"> :class="{ 'disabled':this.searchParams.noteId }">
<i class="folder open outline icon"></i> <i class="folder icon"></i>
Note Files Note Attachments
</div> </div>
<div class="ui small compact basic icon button" v-on:click="deleteAttachment"> <div class="ui small compact basic icon button" v-on:click="deleteAttachment">
<i v-if="!working" class="trash alternate outline icon"></i> <i v-if="!working" class="trash alternate outline icon"></i>
@ -192,7 +192,6 @@
this.unfolded = false this.unfolded = false
setTimeout( () => { setTimeout( () => {
this.visible = false this.visible = false
this.$store.dispatch('fetchAndUpdateUserTotals')
}, 600) }, 600)
} }
}) })

View File

@ -68,7 +68,6 @@
const imageCode = `<img alt="image" src="/api/static/thumb_${location}">` const imageCode = `<img alt="image" src="/api/static/thumb_${location}">`
this.$bus.$emit('new_file_upload', {noteId: this.noteId, imageCode}) this.$bus.$emit('new_file_upload', {noteId: this.noteId, imageCode})
this.$store.dispatch('fetchAndUpdateUserTotals')
} }
}) })
.catch(results => { .catch(results => {

View File

@ -153,8 +153,7 @@
<div class="menu-section" v-if="loggedIn"> <div class="menu-section" v-if="loggedIn">
<router-link exact-active-class="active" class="menu-item menu-button" to="/notes" v-on:click.native="emitReloadEvent()"> <router-link exact-active-class="active" class="menu-item menu-button" to="/notes" v-on:click.native="emitReloadEvent()">
<i class="file outline icon"></i>Notes <i class="file icon"></i>Notes
<!-- <span v-if="$store.getters.totals">{{ $store.getters.totals['totalNotes'] }}</span> -->
</router-link> </router-link>
<div> <div>
<!-- <div class="menu-item sub">Show Only <i class="caret down icon"></i></div> --> <!-- <div class="menu-item sub">Show Only <i class="caret down icon"></i></div> -->
@ -164,16 +163,27 @@
</div> </div>
</div> </div>
<div class="menu-section" v-if="loggedIn && $store.getters.totals && $store.getters.totals['totalFiles']"> <div class="menu-section" v-if="loggedIn">
<div v-on:click="updateFastFilters(3)" class="menu-item menu-button">
<i class="mail icon"></i>Inbox
</div>
</div>
<div class="menu-section" v-if="loggedIn">
<div v-on:click="updateFastFilters(2)" class="menu-item menu-button">
<i class="archive icon"></i>Archived
</div>
</div>
<div class="menu-section" v-if="loggedIn">
<router-link class="menu-item menu-button" exact-active-class="active" to="/attachments"> <router-link class="menu-item menu-button" exact-active-class="active" to="/attachments">
<i class="folder open outline icon"></i>Files <i class="folder icon"></i>Files
<!-- <span>{{ $store.getters.totals['totalFiles'] }}</span> -->
</router-link> </router-link>
</div> </div>
<div class="menu-section" v-if="loggedIn"> <div class="menu-section" v-if="loggedIn">
<router-link v-if="loggedIn" exact-active-class="active" class="menu-item menu-button" to="/quick"> <router-link v-if="loggedIn" exact-active-class="active" class="menu-item menu-button" to="/quick">
<i class="paper plane outline icon"></i>Quick <i class="coffee icon"></i>Quick
</router-link> </router-link>
</div> </div>
@ -198,7 +208,7 @@
<div class="menu-section" v-if="loggedIn"> <div class="menu-section" v-if="loggedIn">
<div v-if="loggedIn" v-on:click="destroyLoginToken" class="menu-item menu-button"> <div v-if="loggedIn" v-on:click="destroyLoginToken" class="menu-item menu-button">
<i class="user outline icon"></i>{{ucWords($store.getters.getUsername)}} <i class="user icon"></i>{{ucWords($store.getters.getUsername)}}
</div> </div>
</div> </div>
@ -232,8 +242,6 @@
this.mobile = this.$store.getters.getIsUserOnMobile this.mobile = this.$store.getters.getIsUserOnMobile
this.collapsed = this.$store.getters.getIsUserOnMobile this.collapsed = this.$store.getters.getIsUserOnMobile
// {{ totals['totalNotes'] }}
if(this.mobile){ if(this.mobile){
this.menuOpen = false this.menuOpen = false
} }

View File

@ -30,7 +30,6 @@
axios.post('/api/note/delete', {'noteId':this.noteId}).then(response => { axios.post('/api/note/delete', {'noteId':this.noteId}).then(response => {
if(response.data == true){ if(response.data == true){
this.$bus.$emit('note_deleted', this.noteId) this.$bus.$emit('note_deleted', this.noteId)
this.$store.dispatch('fetchAndUpdateUserTotals')
} }
}) })
}, },

View File

@ -118,13 +118,13 @@
/> />
</side-slide-menu> </side-slide-menu>
<side-slide-menu v-if="showTagSlideMenu" v-on:close="showTagSlideMenu = false" name="tags" :style-object="styleObject"> <side-slide-menu v-if="showTagSlideMenu" v-on:close="showTagSlideMenu = false" name="tags">
<div class="ui basic segment"> <div class="ui basic segment">
<note-tag-edit :noteId="noteid" :key="'tags-for-note-'+noteid"/> <note-tag-edit :noteId="noteid" :key="'tags-for-note-'+noteid"/>
</div> </div>
</side-slide-menu> </side-slide-menu>
<side-slide-menu v-if="showFilesSideMenu" v-on:close="showFilesSideMenu = false" name="images" :style-object="styleObject"> <side-slide-menu v-if="showFilesSideMenu" v-on:close="showFilesSideMenu = false" name="images">
<div class="ui basic segment"> <div class="ui basic segment">
<simple-attachment-note <simple-attachment-note
v-on:close="showFilesSideMenu = false" v-on:close="showFilesSideMenu = false"
@ -134,7 +134,7 @@
</div> </div>
</side-slide-menu> </side-slide-menu>
<side-slide-menu v-if="showNoteOptions" v-on:close="showNoteOptions = false" name="note-options" :style-object="styleObject"> <side-slide-menu v-if="showNoteOptions" v-on:close="showNoteOptions = false" name="note-options">
<div class="ui basic padded segment"> <div class="ui basic padded segment">
<div class="ui grid"> <div class="ui grid">
<div class="sixteen wide column"> <div class="sixteen wide column">
@ -202,7 +202,6 @@
loading: true, loading: true,
loadingMessage: 'Loading Note', loadingMessage: 'Loading Note',
currentNoteId: 0, currentNoteId: 0,
modified: false,
noteText: '', noteText: '',
rawTextId: 0, rawTextId: 0,
shareUsername: null, shareUsername: null,
@ -874,16 +873,21 @@
'archived':this.archived, 'archived':this.archived,
} }
this.statusText = 'Saving' let vm = this
axios.post('/api/note/update', postData).then( response => { //Debounce save to prevent spamming
this.statusText = 'Saved' // clearTimeout(this.saveDebounce)
this.updated = Math.round((+new Date)/1000) // this.saveDebounce = setTimeout(() => {
this.modified = true //Only notify user if saving - may help with debugging in the future
vm.statusText = 'Saving'
axios.post('/api/note/update', postData).then( response => {
vm.statusText = 'Saved'
vm.updated = Math.round((+new Date)/1000)
//Update last saved note hash //Update last saved note hash
this.lastNoteHash = this.hashString( currentNoteText ) vm.lastNoteHash = vm.hashString( currentNoteText )
return resolve(true) return resolve(true)
}) })
// }, 300)
}) })
}, },
checkForUpdatedNote(){ checkForUpdatedNote(){
@ -945,9 +949,7 @@
this.sizeDown = true this.sizeDown = true
//This timeout allows animation to play before closing //This timeout allows animation to play before closing
setTimeout(() => { setTimeout(() => {
this.$bus.$emit('close_active_note', { this.$bus.$emit('close_active_note', {position: this.position, noteId: this.noteid})
position: this.position, noteId: this.noteid, modified: this.modified
})
return return
}, 300) }, 300)
}) })

View File

@ -12,9 +12,8 @@
<div class="sixteen wide column"> <div class="sixteen wide column">
<h3>All Tags</h3> <h3>All Tags</h3>
<h4 v-if="allTags.length == 0">No tags yet, add a tag.</h4>
<div v-if="allTags.length > 0"> <div v-if="allTags.length > 0">
<div class="ui icon large label clickable" v-for="tag in allTags" :class="{ 'green':isTagOnNote(tag.id) }" v-on:click="toggleTag(tag.text, tag.id, tag.entryId)"> <div class="ui icon large label" v-for="tag in allTags" :class="{ 'green':isTagOnNote(tag.id) }">
{{ ucWords(tag.text) }} {{ ucWords(tag.text) }}
</div> </div>
</div> </div>
@ -43,7 +42,7 @@
v-on:focus="onFocus" v-on:focus="onFocus"
/> />
<div class="suggestion-box" v-if="suggestions.length > 0"> <div class="suggestion-box" v-if="suggestions.length > 0">
<div class="suggestion-item" v-for="(item, index) in suggestions" :class="{ 'active':(index == selection) }" v-on:click="onSuggestionClick(index)"> <div class="suggestion-item" v-for="(item, index) in suggestions" :class="{ 'active':(index == selection) }" v-on:click="onClickTag(index)">
{{ucWords(item.text)}} <span class="suggestion-tip" v-if="index == selection">Press Enter to add</span> {{ucWords(item.text)}} <span class="suggestion-tip" v-if="index == selection">Press Enter to add</span>
</div> </div>
</div> </div>
@ -99,7 +98,6 @@
return true return true
} }
} }
return false
}, },
getTagTextById(id){ getTagTextById(id){
let tag = this.getTagById(id) let tag = this.getTagById(id)
@ -173,38 +171,9 @@
} }
}, 300) }, 300)
}, },
onSuggestionClick(index){ onClickTag(index){
this.newTagInput = this.suggestions[index].text this.newTagInput = this.suggestions[index].text
this.addTag() this.addTag()
},
toggleTag(tagText, id){
//remove tag
if(this.isTagOnNote(id)){
//Find database ID for tag
let entryId = null
this.noteTagIds.forEach(tag => {
if(tag.tagId == id){
entryId = tag.entryId
return
}
})
//Submit database entry to be removed
if(entryId){
this.removeTag(entryId)
}
return
}
//Add Tag
this.newTagInput = tagText
this.addTag()
return
}, },
addTag(){ addTag(){
@ -259,8 +228,6 @@
}, },
removeTag(tagId){ removeTag(tagId){
console.log(tagId)
let postData = { let postData = {
'tagId':tagId, 'tagId':tagId,
'noteId':this.noteId 'noteId':this.noteId
@ -288,6 +255,9 @@
/* note tag edit area */ /* note tag edit area */
.full-tag-area { .full-tag-area {
color: var(--text_color);
background-color: var(--background_color);
/*padding: 15px;*/ /*padding: 15px;*/
/*border: 1px solid;*/ /*border: 1px solid;*/
border-color: var(--border_color); border-color: var(--border_color);

View File

@ -1,8 +1,9 @@
<template> <template>
<div class="ui form"> <div class="ui form">
<div class="ui left icon fluid input"> <div class="fields">
<input v-model="searchTerm" @keyup="searchKeyUp" @:keyup.enter="search" placeholder="Search Notes and Files" /> <div class="sixteen wide field">
<i class="search icon"></i> <input v-model="searchTerm" @keyup="searchKeyUp" @:keyup.enter="search" placeholder="Search Notes and Files" />
</div>
</div> </div>
</div> </div>
</template> </template>

View File

@ -8,16 +8,13 @@
z-index: 400; z-index: 400;
overflow: hidden; overflow: hidden;
height: 100%; height: 100%;
color: var(--text_color);
background-color: var(--background_color);
} }
.slide-content { .slide-content {
box-sizing: border-box; box-sizing: border-box;
/*padding: 1em 1.5em;*/ /*padding: 1em 1.5em;*/
height: calc(100% - 43px); height: calc(100% - 43px);
border-right: 1px solid var(--menu-border); border-right: 1px solid var(--menu-border);
/*background-color: var(--background_color);*/ background-color: var(--background_color);
overflow-x: scroll; overflow-x: scroll;
} }
.slide-shadow { .slide-shadow {
@ -74,7 +71,7 @@
<transition name="modal-fade"> <transition name="modal-fade">
<div> <div>
<div class="slide-container" :style="{ 'background-color':bgColor, 'color':textColor}"> <div class="slide-container">
<!-- content of the editor --> <!-- content of the editor -->
<div class="slide-content"> <div class="slide-content">
@ -97,15 +94,13 @@
<script> <script>
export default { export default {
name: 'SideSlideMenu', name: 'SideSlideMenu',
props: [ 'name', 'styleObject' ], props: [ 'name' ],
components: { components: {
'nm-button':require('@/components/NoteMenuButtonComponent.vue').default 'nm-button':require('@/components/NoteMenuButtonComponent.vue').default
}, },
data () { data () {
return { return {
items: [], items: []
bgColor: null,
textColor: null,
} }
}, },
beforeMount(){ beforeMount(){
@ -121,16 +116,6 @@
}, },
mounted(){ mounted(){
//If note style object is set, use that on the slide menu
if(this.styleObject && this.styleObject.noteText){
this.textColor = this.styleObject.noteText
}
if(this.styleObject && this.styleObject.noteBackground){
this.bgColor = this.styleObject.noteBackground
}
//Close all other panels that are not this one //Close all other panels that are not this one
this.$nextTick( () => { this.$nextTick( () => {
this.$bus.$emit('destroy_all_other_side_panels', this.name) this.$bus.$emit('destroy_all_other_side_panels', this.name)

View File

@ -4,7 +4,7 @@
<div class="ui sixteen wide column"> <div class="ui sixteen wide column">
<h2 class="ui header"> <h2 class="ui header">
<i class="folder open outline icon"></i> <i class="folder icon"></i>
<div class="content"> <div class="content">
Files Files
<div class="sub header">Uploaded Files and Websites from notes.</div> <div class="sub header">Uploaded Files and Websites from notes.</div>
@ -18,7 +18,7 @@
Show All Attachments Show All Attachments
</div> </div>
<div class="ui green button" v-on:click="openNote"> <div class="ui green button" v-on:click="openNote">
<i class="file outline icon"></i> <i class="file icon"></i>
Open Note Open Note
</div> </div>
</div> </div>

View File

@ -3,48 +3,33 @@
<div class="ui grid" :class="{ 'mush-it-up':showOneColumn() }" ref="content"> <div class="ui grid" :class="{ 'mush-it-up':showOneColumn() }" ref="content">
<div v-if="!$store.getters.getIsUserOnMobile" class="sixteen wide column"> <!-- Note filter options -->
<!-- :class="{ 'sixteen wide column':showOneColumn(), 'sixteen wide column':!showOneColumn() }" --> <div class="row" v-if="!$store.getters.getIsUserOnMobile">
<div class="ui grid"> <div :class="{ 'sixteen wide column':showOneColumn(), 'eight wide column':!showOneColumn() }">
<div class="ui form">
<div class="eight wide column"> <div class="fields">
<search-input></search-input> <div class="ten wide field">
</div> <search-input></search-input>
</div>
<div class="eight wide column"> <div class="six wide field">
<span class="ui fluid green button"
<div class="ui basic button" v-on:click="updateFastFilters(3)" v-if="$store.getters.totals && $store.getters.totals['sharedToNotes'] > 0" style="position: relative;"> v-if="showClear"
<i class="green mail icon"></i>Inbox @click="reset">
<span class="floating ui green label" v-if="$store.getters.totals['unreadNotes'] > 0"> <i class="undo icon"></i>Back to All Notes
{{ $store.getters.totals['unreadNotes'] }} </span>
</span> <!-- <fast-filters /> -->
</div> </div>
<div class="ui basic button" v-on:click="updateFastFilters(2)" v-if="$store.getters.totals && $store.getters.totals['archivedNotes'] > 0">
<i class="green archive icon"></i>Archived
<!-- <span>{{ $store.getters.totals['archivedNotes'] }}</span> -->
</div> </div>
</div> </div>
<div class="eight wide column" v-if="showClear">
<!-- <fast-filters /> -->
<span class="ui fluid green button"
@click="reset">
<i class="arrow circle left icon"></i>Back to All Notes
</span>
</div>
</div> </div>
</div> </div>
<div v-if="$store.getters.getIsUserOnMobile && showClear" class="row"> <div v-if="$store.getters.getIsUserOnMobile && showClear" class="row">
<div class="sixteen wide column"> <div class="sixteen wide column">
<span class="ui fluid green button" @click="reset"> <span class="ui fluid green button"
<i class="arrow circle left icon"></i>Back to All Notes @click="reset">
<i class="undo icon"></i>Reset Filters
</span> </span>
</div> </div>
</div> </div>
@ -82,7 +67,7 @@
<!-- pinned notes --> <!-- pinned notes -->
<div v-if="containsPinnednotes > 0" class="note-card-section"> <div v-if="containsPinnednotes > 0" class="note-card-section">
<!-- ({{containsPinnednotes}}) --> <!-- ({{containsPinnednotes}}) -->
<h4><i class="green pin icon"></i>Pinned</h4> <h4><i class="green pin icon"></i>Pinned <span v-if="!working"></span></h4>
<div class="note-card-display-area"> <div class="note-card-display-area">
<note-title-display-card <note-title-display-card
v-for="note in notes" v-for="note in notes"
@ -98,7 +83,7 @@
<!-- normal notes --> <!-- normal notes -->
<div v-if="containsNormalNotes > 0" class="note-card-section"> <div v-if="containsNormalNotes > 0" class="note-card-section">
<!-- ({{containsNormalNotes}}) --> <!-- ({{containsNormalNotes}}) -->
<h4><i class="green file icon"></i>Notes</h4> <h4><i class="green file icon"></i>Notes <span v-if="!working"></span></h4>
<div class="note-card-display-area"> <div class="note-card-display-area">
<note-title-display-card <note-title-display-card
v-for="note in notes" v-for="note in notes"
@ -133,7 +118,7 @@
<!-- found attachments --> <!-- found attachments -->
<div class="sixteen wide column" v-if="foundAttachments.length > 0"> <div class="sixteen wide column" v-if="foundAttachments.length > 0">
<h4><i class="folder open outline icon"></i> Found in Files ({{ foundAttachments.length }})</h4> <h4><i class="green folder icon"></i> Found in Files ({{ foundAttachments.length }})</h4>
<attachment-display <attachment-display
v-for="item in foundAttachments" v-for="item in foundAttachments"
:item="item" :item="item"
@ -212,16 +197,9 @@
this.$parent.loginGateway() this.$parent.loginGateway()
//Update totals for app this.$bus.$on('close_active_note', ({position, noteId}) => {
this.$store.dispatch('fetchAndUpdateUserTotals')
this.$bus.$on('close_active_note', ({position, noteId, modified}) => {
this.closeNote(position) this.closeNote(position)
this.$store.dispatch('fetchAndUpdateUserTotals') this.updateSingleNote(noteId)
if(modified){
this.updateSingleNote(noteId)
}
}) })
this.$bus.$on('note_deleted', (noteId) => { this.$bus.$on('note_deleted', (noteId) => {
//Remove deleted note from set, its deleted //Remove deleted note from set, its deleted
@ -290,7 +268,6 @@
// this.$bus.$off() // this.$bus.$off()
}, },
mounted() { mounted() {
//Loads initial batch and tags //Loads initial batch and tags
this.reset() this.reset()
}, },
@ -660,31 +637,6 @@
resolve(data) resolve(data)
}) })
}) })
},
updateFastFilters(index){
//clear out tags
this.searchTags = []
//A little hacky, brings user to notes page then filters on click
if(this.$route.name != 'NotesPage'){
this.$router.push('/notes')
setTimeout( () => {
this.updateFastFilters(index)
}, 500 )
}
const options = [
'withLinks', // 'Only Show Notes with Links'
'withTags', // 'Only Show Notes with Tags'
'onlyArchived', //'Only Show Archived Notes'
'onlyShowSharedNotes', //Only show shared notes
]
let filter = {}
filter[options[index]] = 1
this.$bus.$emit('update_fast_filters', filter)
} }
} }
} }

View File

@ -4,7 +4,7 @@
<div class="ui sixteen wide column"> <div class="ui sixteen wide column">
<h2 class="ui header"> <h2 class="ui header">
<i class="paper plane outline icon"></i> <i class="coffee icon"></i>
<div class="content"> <div class="content">
Quick Quick
<div class="sub header">Add new information with great speed</div> <div class="sub header">Add new information with great speed</div>
@ -26,14 +26,7 @@
</div> </div>
<div class="field"> <div class="field">
<div v-on:click="appendQuickNote" class="ui green button">Save (CRTL + Enter)</div> <div v-on:click="appendQuickNote" class="ui green button">Save (CRTL + Enter)</div>
<div v-if="quickNoteId" class="ui right floated basic button" v-on:click="$router.push('/attachments/note/'+quickNoteId)"> <div v-if="quickNoteId" v-on:click="openNoteEdit" class="ui right floated basic button">Edit</div>
<i class="folder open outline icon"></i>
Quick Files + Links
</div>
<div v-if="quickNoteId" v-on:click="openNoteEdit" class="ui right floated basic button">
<i class="file outline icon"></i>
Edit
</div>
</div> </div>
</div> </div>
</div> </div>
@ -105,7 +98,7 @@
//Don't submit empty note //Don't submit empty note
if(this.newText.trim() == ''){ return } if(this.newText.trim() == ''){ return }
axios.post('/api/quick-note/update', { 'pushText':this.newText.trim() } ) axios.post('/api/quick-note/update', { 'pushText':this.newText } )
.then( results => { .then( results => {
this.newText = '' //Clear text area this.newText = '' //Clear text area

View File

@ -12,7 +12,6 @@ export default new Vuex.Store({
isUserOnMobile: false, isUserOnMobile: false,
isNoteSettingsOpen: false, //Little note settings pane isNoteSettingsOpen: false, //Little note settings pane
socket: null, socket: null,
userTotals: null,
}, },
mutations: { mutations: {
setLoginToken(state, userData){ setLoginToken(state, userData){
@ -89,14 +88,6 @@ export default new Vuex.Store({
//Put socket id in axios headers //Put socket id in axios headers
axios.defaults.headers.common['socketId'] = socket axios.defaults.headers.common['socketId'] = socket
state.socket = socket state.socket = socket
},
setUserTotals(state, totalsObject){
//Save all the totals for the user
state.userTotals = totalsObject
// Object.keys(totalsObject).forEach( key => {
// console.log(key + ' -- ' + totalsObject[key])
// })
} }
}, },
@ -123,16 +114,5 @@ export default new Vuex.Store({
getSocket: state => { getSocket: state => {
return state.socket return state.socket
}, },
totals: state => {
return state.userTotals
},
},
actions: {
fetchAndUpdateUserTotals ({ commit }) {
axios.post('/api/user/totals')
.then( ({data}) => {
commit('setUserTotals', data)
})
}
} }
}) })

View File

@ -105,7 +105,7 @@ Note.create = (userId, noteText, quickNote = 0) => {
const created = Math.round((+new Date)/1000) const created = Math.round((+new Date)/1000)
db.promise() db.promise()
.query(`INSERT INTO note_raw_text (text) VALUE (?)`, [noteText]) .query(`INSERT INTO note_raw_text (text) VALUE ('')`)
.then( (rows, fields) => { .then( (rows, fields) => {
const rawTextId = rows[0].insertId const rawTextId = rows[0].insertId
@ -334,10 +334,6 @@ Note.get = (userId, noteId) => {
WHERE note.user_id = ? AND note.id = ? LIMIT 1`, [userId,noteId]) WHERE note.user_id = ? AND note.id = ? LIMIT 1`, [userId,noteId])
.then((rows, fields) => { .then((rows, fields) => {
const created = Math.round((+new Date)/1000)
db.promise().query(`UPDATE note SET opened = ? WHERE (id = ?)`, [created, noteId])
//Return note data //Return note data
resolve(rows[0][0]) resolve(rows[0][0])

View File

@ -10,9 +10,7 @@ QuickNote.get = (userId) => {
db.promise() db.promise()
.query(` .query(`
SELECT note.id, text FROM note SELECT id, text FROM note WHERE quick_note = 1 AND user_id = ? LIMIT 1
JOIN note_raw_text ON (note_raw_text.id = note.note_raw_text_id)
WHERE quick_note = 1 AND user_id = ? LIMIT 1
`, [userId]) `, [userId])
.then((rows, fields) => { .then((rows, fields) => {
@ -55,10 +53,8 @@ QuickNote.update = (userId, pushText) => {
db.promise() db.promise()
.query(` .query(`
SELECT note.id, text, color, pinned, archived SELECT id, text, color, pinned, archived
FROM note FROM note WHERE quick_note = 1 AND user_id = ? LIMIT 1
JOIN note_raw_text ON (note_raw_text.id = note.note_raw_text_id)
WHERE quick_note = 1 AND user_id = ? LIMIT 1
`, [userId]) `, [userId])
.then((rows, fields) => { .then((rows, fields) => {
@ -99,3 +95,19 @@ QuickNote.update = (userId, pushText) => {
//Note.create(userId, 'Quick Note', 1) //Note.create(userId, 'Quick Note', 1)
} }
QuickNote.create = (userId, noteText) => {
return new Promise((resolve, reject) => {
if(userId == null || userId < 10){ reject('User Id required to create note') }
const created = Math.round((+new Date)/1000)
db.promise()
.query('INSERT INTO note (user_id, text, created) VALUES (?,?,?)', [userId, noteText, created])
.then((rows, fields) => {
resolve(rows[0].insertId) //Only return the new note ID when creating a new note
})
.catch(console.log)
})
}

View File

@ -113,56 +113,3 @@ User.create = (username, password) => {
}) })
} }
//Counts notes, pinned notes, archived notes, shared notes, unread notes, total files and types
User.getCounts = (userId) => {
return new Promise((resolve, reject) => {
let countTotals = {}
db.promise().query(
`SELECT
SUM(pinned = 1 && archived = 0 && share_user_id IS NULL) AS pinnedNotes,
SUM(pinned = 0 && archived = 1 && share_user_id IS NULL) AS archivedNotes,
SUM(share_user_id IS NULL) AS totalNotes,
SUM(share_user_id != ?) AS sharedToNotes,
SUM( (share_user_id != ? && opened IS null) || (share_user_id != ? && updated > opened) ) AS unreadNotes
FROM note
WHERE user_id = ?`, [userId, userId, userId, userId])
.then( (rows, fields) => {
Object.assign(countTotals, rows[0][0]) //combine results
return db.promise().query(
`SELECT count(id) AS sharedFromNotes
FROM note WHERE share_user_id = ?`, [userId]
)
})
.then( (rows, fields) => {
Object.assign(countTotals, rows[0][0]) //combine results
return db.promise().query(
`SELECT
SUM(attachment_type = 1) as linkFiles,
SUM(attachment_type != 1) as otherFiles,
COUNT(id) as totalFiles
FROM attachment WHERE visible = 1
AND user_id = ?
`, [userId]
)
}).then( (rows, fields) => {
Object.assign(countTotals, rows[0][0]) //combine results
//Convert everything to an int or 0
Object.keys(countTotals).forEach( key => {
const count = parseInt(countTotals[key])
countTotals[key] = count ? count : 0
})
resolve(countTotals)
})
})
}

View File

@ -46,11 +46,4 @@ router.post('/login', function (req, res) {
}) })
}) })
// fetch counts of users notes
router.post('/totals', function (req, res) {
User.getCounts(req.headers.userId)
.then( countsObject => res.send( countsObject ))
})
module.exports = router module.exports = router