This commit is contained in:
Heerko 2021-07-07 14:58:15 +02:00
commit 0821443b13
8 changed files with 193 additions and 29 deletions

128
front/package-lock.json generated
View file

@ -1059,7 +1059,6 @@
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.5.tgz",
"integrity": "sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
}
@ -4745,6 +4744,19 @@
}
}
},
"emoji-datasource": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/emoji-datasource/-/emoji-datasource-4.1.0.tgz",
"integrity": "sha1-tEVX94ot+sLzUDkzkbFwpWfsKK0="
},
"emoji-js": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/emoji-js/-/emoji-js-3.5.0.tgz",
"integrity": "sha512-5uaULzdR3g6ALBC8xUzyoxAx6izT1M4+DEsxHLRS2/gaOKC/p62831itMoMsYfUj1fKX3YG01u5YVz2v7qpsWg==",
"requires": {
"emoji-datasource": "4.1.0"
}
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -7278,6 +7290,11 @@
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
"dev": true
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@ -7295,6 +7312,11 @@
"resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
"integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o="
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
},
"lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@ -7319,12 +7341,22 @@
"integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
"dev": true
},
"lodash.trim": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
"integrity": "sha1-NkJefukL5KpeJ7zruFt9EepHqlc="
},
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
"dev": true
},
"lodash.without": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz",
"integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw="
},
"log-symbols": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
@ -9402,6 +9434,44 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true
},
"ranges-apply": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-5.1.0.tgz",
"integrity": "sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0"
}
},
"ranges-merge": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-7.1.0.tgz",
"integrity": "sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-push": "^5.1.0",
"ranges-sort": "^4.1.0"
}
},
"ranges-push": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-5.1.0.tgz",
"integrity": "sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA==",
"requires": {
"@babel/runtime": "^7.14.0",
"ranges-merge": "^7.1.0",
"string-collapse-leading-whitespace": "^5.1.0",
"string-trim-spaces-only": "^3.1.0"
}
},
"ranges-sort": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-4.1.0.tgz",
"integrity": "sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@ -9469,8 +9539,7 @@
"regenerator-runtime": {
"version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
"dev": true
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
},
"regenerator-transform": {
"version": "0.14.5",
@ -10418,6 +10487,11 @@
"extend-shallow": "^3.0.0"
}
},
"splitpanes": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.0.4.tgz",
"integrity": "sha512-KRaPtMDpu++OfvAzNQYE5U7WT5NoMA6l9B0buC4PhYoDILVLY8zN7Sp9cHXAgLhH59jI3lKzVoNqyf4OGRv7QQ=="
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -10534,12 +10608,60 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true
},
"string-collapse-leading-whitespace": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz",
"integrity": "sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"string-hash": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
"integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
"dev": true
},
"string-left-right": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-4.1.0.tgz",
"integrity": "sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"lodash.clonedeep": "^4.5.0",
"lodash.isplainobject": "^4.0.6"
}
},
"string-strip-html": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-8.3.0.tgz",
"integrity": "sha512-1+rjTPt0JjpFr1w0bfNL1S6O0I9fJDqM+P3pFTpC6eEEpIXhmBvPLnaQoEuWarswiH219qCefDSxTLxGQyHKUg==",
"requires": {
"@babel/runtime": "^7.14.0",
"html-entities": "^2.3.2",
"lodash.isplainobject": "^4.0.6",
"lodash.trim": "^4.5.1",
"lodash.without": "^4.4.0",
"ranges-apply": "^5.1.0",
"ranges-push": "^5.1.0",
"string-left-right": "^4.1.0"
},
"dependencies": {
"html-entities": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
"integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ=="
}
}
},
"string-trim-spaces-only": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz",
"integrity": "sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ==",
"requires": {
"@babel/runtime": "^7.14.0"
}
},
"string-width": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",

View file

@ -47,7 +47,7 @@ export default {
this.getStreams();
this.$router.afterEach((to) => {
this.$store.commit("setContents", []);
this.$store.commit("setTopics", []);
this.$store.commit("setRules", []);
this.$store.commit("setCurStream", to.path.replace("/", ""))
if (this.currentStream != "") {
@ -84,15 +84,15 @@ export default {
}
})
api.zulip.getMsgs(this.zulipClient, stream, "content").then((result) => {
api.zulip.getAllMsgs(this.zulipClient, stream).then((result) => {
for (let m = 0; m < result.messages.length; m++) {
const message = result.messages[m]
if (message.subject == 'rules') {
this.$store.commit('addRule', message)
} else {
this.$store.commit('addMessage', message)
}
});
api.zulip.getMsgs(this.zulipClient, stream, "rules").then((result) => {
this.$store.commit("setRules", result.messages);
}
});
},

View file

@ -44,6 +44,22 @@ const
})
),
getAllMsgs = (client, stream, params) => ( new
Promise((resolve, reject) => {
client
.messages
.retrieve(params || {
anchor: "newest",
num_before: 100,
num_after: 0,
// apply_markdown: false,
narrow: [{ operator: "stream", operand: stream }],
})
.then(result => resolve(result))
.catch(error => reject(error))
})
),
listen = (client, cb) => {
client
.callOnEachEvent(
@ -100,6 +116,7 @@ export default {
config,
getStreams,
getMsgs,
getAllMsgs,
listen,
sendMsg,
getSubs,

View file

@ -27,7 +27,9 @@ export default {
c = c.replaceAll('src="', 'src="' + url);
c = c.replaceAll('href="/', 'href="' + url + "/");
const referrers = this.$store.state.contents.filter(
const referrers = this.$store.state
.topics.find(t => t.title == this.message.subject)
.messages.filter(
(m) =>
m.responseTo &&
m.responseTo.id == this.message.id &&

View file

@ -1,12 +1,13 @@
<template>
<section class="content">
<p class="title">{{ $.type.name }}</p>
<section :class="[ 'content', currentStream ]">
<div
class="body"
:class="currentStream"
v-for="topic in sortedTopics"
:key="topic.title"
:class="[ 'body', topic.title ]"
>
<h1>{{ topic.title }}</h1>
<span
v-for="message in contents"
v-for="message in topic.messages"
:key="message.id"
>
<Message
@ -19,7 +20,7 @@
</template>
<script>
import { mapState } from 'vuex'
import { mapGetters, mapState } from 'vuex'
import Message from './Message'
export default {
@ -29,9 +30,11 @@ export default {
},
computed: {
...mapState([
'contents',
'rules',
'currentStream'
]),
...mapGetters([
'sortedTopics'
])
},
methods: {

View file

@ -83,8 +83,8 @@ export default createStore({
isMobile: false,
streams: [],
currentStream: '',
contents: [],
rules: [],
topics: [],
pubStr: 'pub-',
},
@ -93,7 +93,7 @@ export default createStore({
setMobile: (state, mobile) => state.isMobile = mobile,
setStreams: (state, streams) => state.streams = streams,
setCurStream: (state, stream) => state.currentStream = stream,
setContents: (state, contents) => state.contents = contents,
setTopics: (state, topics) => state.topics = topics,
addMessage: (state, message) => {
if (message.display_recipient == state.currentStream) {
if (message.content.startsWith('@_**')) {
@ -104,7 +104,15 @@ export default createStore({
) {
handleHTMLReply(message)
}
state.contents.push(message)
const topic = state.topics.find(topic => topic.title == message.subject)
if (topic) {
topic.messages.push(message)
} else {
state.topics.push({
title: message.subject,
messages: [ message ]
})
}
}
},
deleteMessage: (state, mid) => {
@ -136,7 +144,10 @@ export default createStore({
},
addRule: (state, rule) => {
if (toCSS(rule) !== null) {
state.rules.push(toCSS(rule, state.currentStream))
// state.rules.push(toCSS(rule, state.currentStream))
// vue will not update if i use rules.push(rule)
state.rules = [...state.rules,...[toCSS(rule, state.currentStream)]]
}
},
editMessage: (state, { mid, content }) => {
@ -153,14 +164,16 @@ export default createStore({
handleHTMLReply(message)
}
} else if (rule) {
// state.rules[state.rules.indexOf(rule)] = toCSS({
// id: mid, content: content,
// }, state.currentStream)
// vue will not update if i use rules.push(rule)
const newRules = [...state.rules, ...[toCSS({
id: mid, content: content,
}, state.currentStream)]]
state.rules = newRules
// state.rules[state.rules.indexOf(rule)] = toCSS({
// id: mid, content: content,
// }, state.currentStream)
}
},
@ -170,7 +183,8 @@ export default createStore({
},
getters: {
rules: state => state.rules
rules: state => state.rules,
sortedTopics: state => [...state.topics].sort((a, b) => a.title.localeCompare(b.title))
}
})

5
package-lock.json generated
View file

@ -634,6 +634,11 @@
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"optional": true
},
"splitpanes": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.3.6.tgz",
"integrity": "sha512-2sif1pmOQw/N+/jRbVzqTJ32lkhJax8jQfaXCebRK/SFCadHOnAaXDcWW8PpEcr9vKpfzH7gxJ8Sq/74HECr/g=="
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",

View file

@ -10,6 +10,7 @@
"license": "ISC",
"dependencies": {
"emoji-js": "^3.5.0",
"splitpanes": "^2.3.6",
"string-strip-html": "^8.3.0",
"vue-html2pdf": "^1.8.0",
"zulip-js": "^2.0.9"