✨ Site > Chat > Add associated file to messages
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
position fixed
|
position fixed
|
||||||
bottom 0
|
bottom 0
|
||||||
right 90px
|
right 90px
|
||||||
|
background #fff
|
||||||
|
|
||||||
.header
|
.header
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,13 +64,14 @@ export default
|
|||||||
this.keepLatest = true
|
this.keepLatest = true
|
||||||
this.$store.commit('setVersion', this.versions[0])
|
this.$store.commit('setVersion', this.versions[0])
|
||||||
},
|
},
|
||||||
|
|
||||||
onVersionClick(version, index)
|
onVersionClick(version, index)
|
||||||
{
|
{
|
||||||
this.keepLatest = index === 0
|
this.keepLatest = index === 0
|
||||||
this.file.isChanged = false
|
this.file.isChanged = false
|
||||||
|
|
||||||
this.$store.commit('setVersion', version)
|
this.$store.commit('setVersion', version)
|
||||||
|
this.$store.commit('setLine', null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -60,7 +63,29 @@ export default {
|
|||||||
|
|
||||||
setVersion(state, data)
|
setVersion(state, data)
|
||||||
{
|
{
|
||||||
state.currentVersion = 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
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setLine(state, data)
|
||||||
|
{
|
||||||
|
state.currentLine = data
|
||||||
},
|
},
|
||||||
|
|
||||||
searchFile(state, data)
|
searchFile(state, data)
|
||||||
|
|||||||
Reference in New Issue
Block a user