Notes/src/public/app/widgets/containers/collapsible_section_container.js

211 lines
5.7 KiB
JavaScript
Raw Normal View History

2021-05-22 12:35:41 +02:00
import NoteContextAwareWidget from "../note_context_aware_widget.js";
2020-10-30 22:57:26 +01:00
const TPL = `
<div class="section-container">
<style>
2020-10-31 22:47:15 +01:00
.section-container {
2021-01-30 21:03:39 +01:00
margin-bottom: 5px;
2020-10-31 22:47:15 +01:00
}
.section-top-row {
display: flex;
}
2020-10-30 22:57:26 +01:00
.section-title-container {
display: flex;
flex-direction: row;
justify-content: center;
margin-left: 10px;
flex-grow: 1;
2020-10-30 22:57:26 +01:00
}
.section-title {
padding-right: 10px;
padding-left: 10px;
color: var(--muted-text-color);
border-bottom: 1px solid var(--main-border-color);
}
.section-title .bx {
font-size: 170%;
position: relative;
top: 6px;
}
2020-10-30 22:57:26 +01:00
2020-10-31 22:47:15 +01:00
.section-title.active {
color: var(--main-text-color);
border-bottom: 1px solid var(--main-text-color);
}
2020-10-30 22:57:26 +01:00
.section-title:hover {
cursor: pointer;
}
.section-title:hover {
color: var(--main-text-color);
}
.section-title-empty {
flex-basis: 20px;
}
.section-title-empty:last-of-type {
2020-10-30 22:57:26 +01:00
flex-shrink: 1;
flex-grow: 1;
}
2020-10-31 22:47:15 +01:00
.section-button-container {
border-bottom: 1px solid var(--main-border-color);
margin-right: 10px;
}
.section-button-container .bx {
position: relative;
top: 6px;
}
2020-10-31 22:47:15 +01:00
.section-body {
display: none;
border-bottom: 1px solid var(--main-border-color);
margin-left: 10px;
margin-right: 10px;
2020-10-31 22:47:15 +01:00
}
.section-body.active {
display: block;
}
.section-title-label {
display: none;
}
.section-title.active .section-title-label {
display: inline;
}
2020-10-30 22:57:26 +01:00
</style>
<div class="section-top-row">
<div class="section-title-container"></div>
<div class="section-button-container"></div>
</div>
2020-10-30 22:57:26 +01:00
<div class="section-body-container"></div>
</div>`;
2021-05-22 12:35:41 +02:00
export default class CollapsibleSectionContainer extends NoteContextAwareWidget {
2020-10-31 22:47:15 +01:00
constructor() {
super();
this.sectionWidgets = [];
this.buttonWidgets = [];
2020-10-31 22:47:15 +01:00
}
section(widget) {
super.child(widget);
2020-10-31 22:47:15 +01:00
this.sectionWidgets.push(widget);
2020-10-31 22:47:15 +01:00
return this;
}
button(widget) {
super.child(widget);
2020-10-31 22:47:15 +01:00
this.buttonWidgets.push(widget);
2020-10-31 22:47:15 +01:00
return this;
}
2020-10-30 22:57:26 +01:00
doRender() {
this.$widget = $(TPL);
2020-11-27 22:38:15 +01:00
this.overflowing();
2020-10-30 22:57:26 +01:00
this.$titleContainer = this.$widget.find('.section-title-container');
this.$buttonContainer = this.$widget.find('.section-button-container');
2020-10-30 22:57:26 +01:00
this.$bodyContainer = this.$widget.find('.section-body-container');
for (const sectionWidget of this.sectionWidgets) {
2020-10-30 22:57:26 +01:00
this.$bodyContainer.append(
$('<div class="section-body">')
.attr('data-section-component-id', sectionWidget.componentId)
.append(sectionWidget.render())
2020-10-30 22:57:26 +01:00
);
}
2020-10-31 22:47:15 +01:00
for (const buttonWidget of this.buttonWidgets) {
this.$buttonContainer.append(buttonWidget.render());
}
2020-10-31 22:47:15 +01:00
this.$titleContainer.on('click', '.section-title-real', e => {
const $sectionTitle = $(e.target).closest('.section-title-real');
const activate = !$sectionTitle.hasClass("active");
this.$titleContainer.find('.section-title-real').removeClass("active");
this.$bodyContainer.find('.section-body').removeClass("active");
if (activate) {
const sectionComponentId = $sectionTitle.attr('data-section-component-id');
this.lastActiveComponentId = sectionComponentId;
this.$titleContainer.find(`.section-title-real[data-section-component-id="${sectionComponentId}"]`).addClass("active");
this.$bodyContainer.find(`.section-body[data-section-component-id="${sectionComponentId}"]`).addClass("active");
}
else {
this.lastActiveComponentId = null;
2020-10-31 22:47:15 +01:00
}
});
}
async refreshWithNote(note, noExplicitActivation = false) {
let $sectionToActivate, $lastActiveSection;
this.$titleContainer.empty().append('<div class="section-title section-title-empty">');
for (const sectionWidget of this.sectionWidgets) {
const ret = sectionWidget.getTitle(note);
if (!ret.show) {
continue;
}
const $sectionTitle = $('<div class="section-title section-title-real">')
.attr('data-section-component-id', sectionWidget.componentId)
.append($('<span class="section-title-icon">')
.addClass(ret.icon)
.attr("title", ret.title))
.append(" ")
.append($('<span class="section-title-label">').text(ret.title));
this.$titleContainer.append($sectionTitle);
this.$titleContainer.append('<div class="section-title section-title-empty">');
if (ret.activate && !$sectionToActivate && !noExplicitActivation) {
$sectionToActivate = $sectionTitle;
}
if (this.lastActiveComponentId === sectionWidget.componentId) {
$lastActiveSection = $sectionTitle;
}
}
this.$titleContainer.find('.section-title-icon').tooltip();
if (!$sectionToActivate) {
$sectionToActivate = $lastActiveSection;
}
if ($sectionToActivate) {
$sectionToActivate.trigger('click');
}
else {
this.$bodyContainer.find('.section-body').removeClass("active");
}
2020-10-30 22:57:26 +01:00
}
refreshSectionContainerCommand() {
this.refreshWithNote(this.note, true);
}
2020-10-30 22:57:26 +01:00
}