client-app/app/models/message-collection.js in logster-2.1.0 vs client-app/app/models/message-collection.js in logster-2.1.1

- old
+ new

@@ -1,178 +1,178 @@ -import { ajax, increaseTitleCount } from "client-app/lib/utilities"; -import Message from "client-app/models/message"; -import { compare } from "@ember/utils"; -import { computed } from "@ember/object"; - -const BATCH_SIZE = 50; - -export default Em.Object.extend({ - messages: Em.A(), - currentMessage: null, - total: 0, - - solve(message) { - message.solve().then(() => { - this.reload(); - }); - }, - - destroy(message) { - const messages = this.get("messages"); - const idx = messages.indexOf(message); - message.destroy(); - message.set("selected", false); - this.set("total", this.get("total") - 1); - this.get("messages").removeObject(message); - - if (idx > 0) { - message = messages[idx - 1]; - message.set("selected", true); - this.set("currentMessage", message); - } else { - if (this.get("total") > 0) { - message = messages[0]; - message.set("selected", true); - this.set("currentMessage", message); - } else { - this.reload(); - } - } - }, - - load(opts) { - opts = opts || {}; - - const data = { - filter: this.get("filter").join("_") - }; - - const search = this.get("search"); - if (!_.isEmpty(search)) { - data.search = search; - const regexSearch = this.get("regexSearch"); - if (regexSearch) { - data.regex_search = "true"; - } - } - - if (opts.before) { - data.before = opts.before; - } - - if (opts.after) { - data.after = opts.after; - } - - return ajax("/messages.json", { - data: data - }).then(data => { - // guard against race: ensure the results we're trying to apply - // match the current search terms - if (compare(data.filter, this.get("filter")) != 0) { - return; - } - if (compare(data.search, this.get("search")) != 0) { - return; - } - - if (data.messages.length > 0) { - const newRows = this.toMessages(data.messages); - const messages = this.get("messages"); - if (opts.before) { - messages.unshiftObjects(newRows); - } else { - newRows.forEach(nmsg => { - messages.forEach(emsg => { - if (emsg.key == nmsg.key) { - messages.removeObject(emsg); - if (this.get("currentMessage") === emsg) { - // TODO would updateFromJson() work here? - this.set("currentMessage", nmsg); - nmsg.set("selected", emsg.get("selected")); - } - } - }); - }); - messages.addObjects(newRows); - if (newRows.length > 0) { - increaseTitleCount(newRows.length); - } - } - } - this.set("total", data.total); - return data; - }); - }, - - reload() { - this.set("total", 0); - this.get("messages").clear(); - - return this.load().then(data => this.updateCanLoadMore(data)); - }, - - updateCanLoadMore(data) { - if (!data) { - return; - } - if (data.messages.length < BATCH_SIZE) { - this.set("canLoadMore", false); - } else { - this.set("canLoadMore", true); - } - }, - - loadMore() { - const messages = this.get("messages"); - if (messages.length === 0) { - this.load({}); - return; - } - - const lastKey = messages[messages.length - 1].get("key"); - this.load({ - after: lastKey - }); - }, - - hideCountInLoadMore: computed("search", "filter", function() { - const search = this.get("search"); - const filter = this.get("filter"); - return (search && search.length > 0) || (filter && filter.length < 6); - }), - - moreBefore: computed("messages.length", "canLoadMore", function() { - return this.get("messages.length") >= BATCH_SIZE && this.get("canLoadMore"); - }), - - totalBefore: computed("total", "messages.length", function() { - return this.get("total") - this.get("messages").length; - }), - - showMoreBefore: function() { - const messages = this.get("messages"); - const firstKey = messages[0].get("key"); - - this.load({ - before: firstKey - }).then(data => this.updateCanLoadMore(data)); - }, - - regexSearch: computed("search", function() { - const search = this.get("search"); - if (search && search.length > 2 && search[0] === "/") { - const match = search.match(/\/(.*)\/(.*)/); - if (match && match.length === 3) { - try { - return new RegExp(match[1], match[2]); - } catch (err) { - // don't care - } - } - } - }), - - toMessages(messages) { - return messages.map(m => Message.create(m)); - } -}); +import { ajax, increaseTitleCount } from "client-app/lib/utilities"; +import Message from "client-app/models/message"; +import { compare } from "@ember/utils"; +import { computed } from "@ember/object"; + +const BATCH_SIZE = 50; + +export default Em.Object.extend({ + messages: Em.A(), + currentMessage: null, + total: 0, + + solve(message) { + message.solve().then(() => { + this.reload(); + }); + }, + + destroy(message) { + const messages = this.get("messages"); + const idx = messages.indexOf(message); + message.destroy(); + message.set("selected", false); + this.set("total", this.get("total") - 1); + this.get("messages").removeObject(message); + + if (idx > 0) { + message = messages[idx - 1]; + message.set("selected", true); + this.set("currentMessage", message); + } else { + if (this.get("total") > 0) { + message = messages[0]; + message.set("selected", true); + this.set("currentMessage", message); + } else { + this.reload(); + } + } + }, + + load(opts) { + opts = opts || {}; + + const data = { + filter: this.get("filter").join("_") + }; + + const search = this.get("search"); + if (!_.isEmpty(search)) { + data.search = search; + const regexSearch = this.get("regexSearch"); + if (regexSearch) { + data.regex_search = "true"; + } + } + + if (opts.before) { + data.before = opts.before; + } + + if (opts.after) { + data.after = opts.after; + } + + return ajax("/messages.json", { + data: data + }).then(data => { + // guard against race: ensure the results we're trying to apply + // match the current search terms + if (compare(data.filter, this.get("filter")) != 0) { + return; + } + if (compare(data.search, this.get("search")) != 0) { + return; + } + + if (data.messages.length > 0) { + const newRows = this.toMessages(data.messages); + const messages = this.get("messages"); + if (opts.before) { + messages.unshiftObjects(newRows); + } else { + newRows.forEach(nmsg => { + messages.forEach(emsg => { + if (emsg.key == nmsg.key) { + messages.removeObject(emsg); + if (this.get("currentMessage") === emsg) { + // TODO would updateFromJson() work here? + this.set("currentMessage", nmsg); + nmsg.set("selected", emsg.get("selected")); + } + } + }); + }); + messages.addObjects(newRows); + if (newRows.length > 0) { + increaseTitleCount(newRows.length); + } + } + } + this.set("total", data.total); + return data; + }); + }, + + reload() { + this.set("total", 0); + this.get("messages").clear(); + + return this.load().then(data => this.updateCanLoadMore(data)); + }, + + updateCanLoadMore(data) { + if (!data) { + return; + } + if (data.messages.length < BATCH_SIZE) { + this.set("canLoadMore", false); + } else { + this.set("canLoadMore", true); + } + }, + + loadMore() { + const messages = this.get("messages"); + if (messages.length === 0) { + this.load({}); + return; + } + + const lastKey = messages[messages.length - 1].get("key"); + this.load({ + after: lastKey + }); + }, + + hideCountInLoadMore: computed("search", "filter", function() { + const search = this.get("search"); + const filter = this.get("filter"); + return (search && search.length > 0) || (filter && filter.length < 6); + }), + + moreBefore: computed("messages.length", "canLoadMore", function() { + return this.get("messages.length") >= BATCH_SIZE && this.get("canLoadMore"); + }), + + totalBefore: computed("total", "messages.length", function() { + return this.get("total") - this.get("messages").length; + }), + + showMoreBefore: function() { + const messages = this.get("messages"); + const firstKey = messages[0].get("key"); + + this.load({ + before: firstKey + }).then(data => this.updateCanLoadMore(data)); + }, + + regexSearch: computed("search", function() { + const search = this.get("search"); + if (search && search.length > 2 && search[0] === "/") { + const match = search.match(/\/(.*)\/(.*)/); + if (match && match.length === 3) { + try { + return new RegExp(match[1], match[2]); + } catch (err) { + // don't care + } + } + } + }), + + toMessages(messages) { + return messages.map(m => Message.create(m)); + } +});