This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/components/topic-entrance.js.es6
Jarek Radosz 5d4b240453
DEV: Provide radix argument to parseInt (#8281)
* DEV: Provide radix 10 argument to parseInt

* DEV: Provide radix 16 argument to parseInt

* DEV: Remove unnecessary parseInt calls

* Fix year formatting

parseInt was used here to convert decimals to ints
2019-11-12 10:47:42 +01:00

121 lines
3.0 KiB
JavaScript

import discourseComputed from "discourse-common/utils/decorators";
import { scheduleOnce } from "@ember/runloop";
import Component from "@ember/component";
import DiscourseURL from "discourse/lib/url";
import CleansUp from "discourse/mixins/cleans-up";
function entranceDate(dt, showTime) {
const today = new Date();
if (dt.toDateString() === today.toDateString()) {
return moment(dt).format(I18n.t("dates.time"));
}
if (dt.getYear() === today.getYear()) {
// No year
return moment(dt).format(
showTime
? I18n.t("dates.long_date_without_year_with_linebreak")
: I18n.t("dates.long_no_year_no_time")
);
}
return moment(dt).format(
showTime
? I18n.t("dates.long_date_with_year_with_linebreak")
: I18n.t("dates.long_date_with_year_without_time")
);
}
export default Component.extend(CleansUp, {
elementId: "topic-entrance",
classNameBindings: ["visible::hidden"],
_position: null,
topic: null,
visible: null,
@discourseComputed("topic.created_at")
createdDate: createdAt => new Date(createdAt),
@discourseComputed("topic.bumped_at")
bumpedDate: bumpedAt => new Date(bumpedAt),
@discourseComputed("createdDate", "bumpedDate")
showTime(createdDate, bumpedDate) {
return (
bumpedDate.getTime() - createdDate.getTime() < 1000 * 60 * 60 * 24 * 2
);
},
@discourseComputed("createdDate", "showTime")
topDate: (createdDate, showTime) => entranceDate(createdDate, showTime),
@discourseComputed("bumpedDate", "showTime")
bottomDate: (bumpedDate, showTime) => entranceDate(bumpedDate, showTime),
didInsertElement() {
this._super(...arguments);
this.appEvents.on("topic-entrance:show", this, "_show");
},
_setCSS() {
const pos = this._position;
const $self = $(this.element);
const width = $self.width();
const height = $self.height();
pos.left = parseInt(pos.left, 10) - width / 2;
pos.top = parseInt(pos.top, 10) - height / 2;
const windowWidth = $(window).width();
if (pos.left + width > windowWidth) {
pos.left = windowWidth - width - 15;
}
$self.css(pos);
},
_show(data) {
this._position = data.position;
this.setProperties({ topic: data.topic, visible: true });
scheduleOnce("afterRender", this, this._setCSS);
$("html")
.off("mousedown.topic-entrance")
.on("mousedown.topic-entrance", e => {
const $target = $(e.target);
if (
$target.prop("id") === "topic-entrance" ||
$(this.element).has($target).length !== 0
) {
return;
}
this.cleanUp();
});
},
cleanUp() {
this.setProperties({ topic: null, visible: false });
$("html").off("mousedown.topic-entrance");
},
willDestroyElement() {
this.appEvents.off("topic-entrance:show", this, "_show");
},
_jumpTo(destination) {
this.cleanUp();
DiscourseURL.routeTo(destination);
},
actions: {
enterTop() {
this._jumpTo(this.get("topic.url"));
},
enterBottom() {
this._jumpTo(this.get("topic.lastPostUrl"));
}
}
});