Site > Chat > Add associated file to messages

This commit is contained in:
brunosimon
2017-09-01 01:06:21 +02:00
parent 015cd88ca5
commit c34936b068
11 changed files with 147 additions and 12 deletions
+3
View File
@@ -60,6 +60,7 @@ class Chat
broadcastMessage.time = data.time broadcastMessage.time = data.time
broadcastMessage.text = data.text broadcastMessage.text = data.text
broadcastMessage.file = data.file broadcastMessage.file = data.file
broadcastMessage.version = data.version
broadcastMessage.line = data.line broadcastMessage.line = data.line
broadcastMessage.user = user broadcastMessage.user = user
@@ -190,6 +191,7 @@ class Chat
data.time = new Date() data.time = new Date()
data.text = `message ${counting++}` data.text = `message ${counting++}`
data.file = null data.file = null
data.version = null
data.line = null data.line = null
this.messages.push(data) this.messages.push(data)
@@ -199,6 +201,7 @@ class Chat
broadcastMessage.time = data.time broadcastMessage.time = data.time
broadcastMessage.text = data.text broadcastMessage.text = data.text
broadcastMessage.file = data.file broadcastMessage.file = data.file
broadcastMessage.version = data.version
broadcastMessage.line = data.line broadcastMessage.line = data.line
broadcastMessage.user = userA broadcastMessage.user = userA
+45 -4
View File
@@ -7,13 +7,22 @@ export default
return { return {
userName: '', userName: '',
messageText: '', messageText: '',
open: false,
unreadCount: 0 unreadCount: 0
} }
}, },
computed: computed:
{ {
open()
{
return this.$store.state.chat.open
},
question()
{
return this.$store.state.chat.question
},
messages() messages()
{ {
return this.$store.state.chat.messages return this.$store.state.chat.messages
@@ -64,7 +73,7 @@ export default
{ {
onHeaderClick() onHeaderClick()
{ {
this.open = !this.open this.$store.commit('toggleChat')
// Reset unread count // Reset unread count
if(this.open) if(this.open)
@@ -89,14 +98,30 @@ export default
onMessageTextKeyDown(event) onMessageTextKeyDown(event)
{ {
// Blur if enter pressed // Enter key pressed
if(event.keyCode === 13) if(event.keyCode === 13)
{ {
event.preventDefault() event.preventDefault()
// Blur
event.target.blur() event.target.blur()
this.$store.commit('setPendingMessage', { text: this.messageText }) // Create and send message
const message = {}
message.text = this.messageText
if(this.question)
{
message.file = this.question.file
message.line = this.question.line
message.version = this.question.version
}
this.$store.commit('setPendingMessage', message)
this.messageText = '' this.messageText = ''
// Reset question
this.$store.commit('setQuestion', null)
} }
}, },
@@ -109,6 +134,22 @@ export default
{ {
this.unreadCount = 0 this.unreadCount = 0
} }
},
onQuestionRemoveClick()
{
this.$store.commit('setQuestion', null)
},
onFileClick(file, version, line)
{
this.$store.commit('setFile', file)
this.$store.commit('setLine', line)
window.requestAnimationFrame(() =>
{
this.$store.commit('setVersion', version)
})
} }
} }
} }
+1
View File
@@ -2,6 +2,7 @@
position fixed position fixed
bottom 0 bottom 0
right 90px right 90px
background #fff
.header .header
cursor pointer cursor pointer
+8
View File
@@ -12,6 +12,9 @@
<div class="user" :style="`color: ${message.user.color};`"> <div class="user" :style="`color: ${message.user.color};`">
{{ message.user.name }} {{ message.user.name }}
</div> </div>
<a href="#" class="file" v-if="message.file && message.line" @click.prevent="onFileClick(message.file, message.version, message.line)">
{{ message.file }}:{{ message.line }}
</a>
<div class="text"> <div class="text">
{{ message.text }} {{ message.text }}
</div> </div>
@@ -21,6 +24,11 @@
<div class="infos" v-if="user"> <div class="infos" v-if="user">
Your nickname is <input class="user-name" :style="`color: ${user.color};`" v-model="userName" @change="onUserNameChange($event)" @keydown="onUserNameKeyDown($event)"/> Your nickname is <input class="user-name" :style="`color: ${user.color};`" v-model="userName" @change="onUserNameChange($event)" @keydown="onUserNameKeyDown($event)"/>
</div> </div>
<div class="question" v-if="question">
Question:
<span class="question-file">{{ question.file }}:{{ question.line }}</span>
<a href="#" class="remove" @click.prevent="onQuestionRemoveClick">x</a>
</div>
<div class="message"> <div class="message">
<textarea class="text" v-model="messageText" @keydown="onMessageTextKeyDown($event)"></textarea> <textarea class="text" v-model="messageText" @keydown="onMessageTextKeyDown($event)"></textarea>
</div> </div>
@@ -65,6 +65,7 @@ export default
onNameClick() onNameClick()
{ {
this.$store.commit('setFile', this.content.path.full) this.$store.commit('setFile', this.content.path.full)
this.$store.commit('setLine', null)
} }
} }
} }
+1
View File
@@ -71,6 +71,7 @@ export default
this.file.isChanged = false this.file.isChanged = false
this.$store.commit('setVersion', version) this.$store.commit('setVersion', version)
this.$store.commit('setLine', null)
} }
} }
} }
+12
View File
@@ -28,6 +28,7 @@ export default
{ {
const lines = [] const lines = []
const lineBreaks = (this.version.content.match(/\n/g) || []).length + 1 const lineBreaks = (this.version.content.match(/\n/g) || []).length + 1
const currentLine = this.$store.state.files.currentLine
// Create all lines // Create all lines
for(let i = 0; i < lineBreaks; i++) for(let i = 0; i < lineBreaks; i++)
@@ -36,6 +37,7 @@ export default
line.index = lines.length + 1 line.index = lines.length + 1
line.added = false line.added = false
line.removed = false line.removed = false
line.active = currentLine !== null && i === currentLine - 1
lines.push(line) lines.push(line)
} }
@@ -134,6 +136,16 @@ export default
} }
} }
} }
},
onLineClick(index)
{
const question = {}
question.line = index
question.version = this.version.date
question.file = this.$store.state.files.current.path.full
this.$store.commit('setQuestion', question)
this.$store.commit('openChat')
} }
} }
} }
+21 -2
View File
@@ -32,7 +32,6 @@
position absolute position absolute
top 0 top 0
left 0 left 0
pointer-events none
.line .line
position relative position relative
@@ -40,6 +39,7 @@
opacity 0.75 opacity 0.75
letter-spacing -1px letter-spacing -1px
padding-left 25px padding-left 25px
cursor pointer
.added .added
position absolute position absolute
@@ -48,11 +48,30 @@
color #00ffa5 color #00ffa5
.removed .removed
position absolute
top -10px top -10px
left 9px left 9px
position absolute
color #ff8157 color #ff8157
.question
display none
position absolute
top 0
right -8px
font-size 12px
color #00d8ff
.active
position absolute
top 0
right -14px
font-size 12px
color #00d8ff
&:hover
.question
display block
.code .code
position absolute position absolute
top 0 top 0
+5 -3
View File
@@ -1,10 +1,12 @@
<div class="viewer" v-if="version"> <div class="viewer" v-if="version">
<pre class="code" v-highlightjs="version.content" contenteditable @keydown="onCodeKeyDown($event)"><code :class="[ extension ]"></code></pre> <pre class="code" v-highlightjs="version.content" contenteditable @keydown="onCodeKeyDown($event)"><code :class="[ extension ]"></code></pre>
<div class="lines"> <div class="lines">
<div class="line" v-for="line in lines"> <div class="line" v-for="line in lines" @click.prevent="onLineClick(line.index)">
<div class="added" v-if="line.added && differencesActive">+</div> <span class="added" v-if="line.added && differencesActive">+</span>
<div class="removed" v-if="line.removed && differencesActive">-</div> <span class="removed" v-if="line.removed && differencesActive">-</span>
<span class="index">{{ line.index }}.</span> <span class="index">{{ line.index }}.</span>
<span class="question">?</span>
<span class="active" v-if="line.active">!</span>
</div> </div>
</div> </div>
</div> </div>
+23 -1
View File
@@ -1,11 +1,13 @@
export default { export default {
state: state:
{ {
open: false,
user: null, user: null,
pendingUser: null, pendingUser: null,
messages: [], messages: [],
pendingMessage: null, pendingMessage: null,
pendingAlert: null pendingAlert: null,
question: null
}, },
mutations: mutations:
@@ -39,6 +41,26 @@ export default {
{ {
const date = new Date() const date = new Date()
state.pendingAlert = { date } state.pendingAlert = { date }
},
setQuestion(state, data)
{
state.question = data
},
openChat(state)
{
state.open = true
},
closeChat(state)
{
state.open = false
},
toggleChat(state)
{
state.open = !state.open
} }
} }
} }
+25
View File
@@ -6,6 +6,7 @@ export default {
tree: new FileTree({ autoWash: true }), tree: new FileTree({ autoWash: true }),
current: null, current: null,
currentVersion: null, currentVersion: null,
currentLine: null,
search: '' search: ''
}, },
@@ -37,8 +38,10 @@ export default {
setFile(state, data) setFile(state, data)
{ {
// Retrieve file from path
const file = state.tree.getFile(data) const file = state.tree.getFile(data)
// No current file or file different than current
if(!state.current || state.current.id !== file.id) if(!state.current || state.current.id !== file.id)
{ {
state.current = file state.current = file
@@ -59,8 +62,30 @@ export default {
}, },
setVersion(state, data) setVersion(state, data)
{
// Date sent
if(typeof data === 'string')
{
// Find version by date
const version = state.current.versions.find((version) => version.date === data)
// Found
if(version)
{
state.currentVersion = version
}
}
// Version directly sent
else
{ {
state.currentVersion = data state.currentVersion = data
}
},
setLine(state, data)
{
state.currentLine = data
}, },
searchFile(state, data) searchFile(state, data)