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", "version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.5.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.5.tgz",
"integrity": "sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==", "integrity": "sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==",
"dev": true,
"requires": { "requires": {
"regenerator-runtime": "^0.13.4" "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": { "emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -7278,6 +7290,11 @@
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
"dev": true "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": { "lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "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", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
"integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" "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": { "lodash.kebabcase": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@ -7319,12 +7341,22 @@
"integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
"dev": true "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": { "lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
"dev": true "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": { "log-symbols": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
@ -9402,6 +9434,44 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true "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": { "raw-body": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@ -9469,8 +9539,7 @@
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.13.7", "version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
"dev": true
}, },
"regenerator-transform": { "regenerator-transform": {
"version": "0.14.5", "version": "0.14.5",
@ -10418,6 +10487,11 @@
"extend-shallow": "^3.0.0" "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": { "sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -10534,12 +10608,60 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true "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": { "string-hash": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
"integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
"dev": true "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": { "string-width": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",

View file

@ -47,8 +47,8 @@ export default {
this.getStreams(); this.getStreams();
this.$router.afterEach((to) => { this.$router.afterEach((to) => {
this.$store.commit("setContents", []); this.$store.commit("setTopics", []);
this.$store.commit("setRules", []); this.$store.commit("setRules", []);
this.$store.commit("setCurStream", to.path.replace("/", "")) this.$store.commit("setCurStream", to.path.replace("/", ""))
if (this.currentStream != "") { if (this.currentStream != "") {
this.setUpDoc(this.currentStream); this.setUpDoc(this.currentStream);
@ -84,17 +84,17 @@ 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++) { for (let m = 0; m < result.messages.length; m++) {
const message = result.messages[m] const message = result.messages[m]
this.$store.commit('addMessage', message) 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);
});
}, },
eventHandler(event) { eventHandler(event) {

View file

@ -36,7 +36,7 @@ const
// apply_markdown: false, // apply_markdown: false,
narrow: [ narrow: [
{ operator: "stream", operand: stream }, { operator: "stream", operand: stream },
{ operator: "topic", operand: topic }, { operator: "topic", operand: topic },
], ],
}) })
.then(result => resolve(result)) .then(result => resolve(result))
@ -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) => { listen = (client, cb) => {
client client
.callOnEachEvent( .callOnEachEvent(
@ -100,6 +116,7 @@ export default {
config, config,
getStreams, getStreams,
getMsgs, getMsgs,
getAllMsgs,
listen, listen,
sendMsg, sendMsg,
getSubs, getSubs,

View file

@ -27,7 +27,9 @@ export default {
c = c.replaceAll('src="', 'src="' + url); c = c.replaceAll('src="', 'src="' + url);
c = c.replaceAll('href="/', 'href="' + 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) =>
m.responseTo && m.responseTo &&
m.responseTo.id == this.message.id && m.responseTo.id == this.message.id &&

View file

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

View file

@ -83,8 +83,8 @@ export default createStore({
isMobile: false, isMobile: false,
streams: [], streams: [],
currentStream: '', currentStream: '',
contents: [],
rules: [], rules: [],
topics: [],
pubStr: 'pub-', pubStr: 'pub-',
}, },
@ -93,7 +93,7 @@ export default createStore({
setMobile: (state, mobile) => state.isMobile = mobile, setMobile: (state, mobile) => state.isMobile = mobile,
setStreams: (state, streams) => state.streams = streams, setStreams: (state, streams) => state.streams = streams,
setCurStream: (state, stream) => state.currentStream = stream, setCurStream: (state, stream) => state.currentStream = stream,
setContents: (state, contents) => state.contents = contents, setTopics: (state, topics) => state.topics = topics,
addMessage: (state, message) => { addMessage: (state, message) => {
if (message.display_recipient == state.currentStream) { if (message.display_recipient == state.currentStream) {
if (message.content.startsWith('@_**')) { if (message.content.startsWith('@_**')) {
@ -104,7 +104,15 @@ export default createStore({
) { ) {
handleHTMLReply(message) 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) => { deleteMessage: (state, mid) => {
@ -136,7 +144,10 @@ export default createStore({
}, },
addRule: (state, rule) => { addRule: (state, rule) => {
if (toCSS(rule) !== null) { 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 }) => { editMessage: (state, { mid, content }) => {
@ -153,14 +164,16 @@ export default createStore({
handleHTMLReply(message) handleHTMLReply(message)
} }
} else if (rule) { } 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({ const newRules = [...state.rules, ...[toCSS({
id: mid, content: content, id: mid, content: content,
}, state.currentStream)]] }, state.currentStream)]]
state.rules = newRules state.rules = newRules
// state.rules[state.rules.indexOf(rule)] = toCSS({
// id: mid, content: content,
// }, state.currentStream)
} }
}, },
@ -170,7 +183,8 @@ export default createStore({
}, },
getters: { 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==", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"optional": true "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": { "sshpk": {
"version": "1.16.1", "version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",

View file

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