118 lines
3.3 KiB
JavaScript
118 lines
3.3 KiB
JavaScript
import {LitElement, html} from './lit-all.min.js';
|
|
import * as tfrpc from '/static/tfrpc.js';
|
|
|
|
class TfCollectionElement extends LitElement {
|
|
static get properties() {
|
|
return {
|
|
whoami: {type: String},
|
|
category: {type: String},
|
|
collection: {type: Object},
|
|
selected_id: {type: String},
|
|
is_creating: {type: Boolean},
|
|
is_renaming: {type: Boolean},
|
|
};
|
|
}
|
|
|
|
on_create(event) {
|
|
let name = this.shadowRoot.getElementById('create_name').value;
|
|
this.dispatchEvent(
|
|
new CustomEvent('create', {
|
|
bubbles: true,
|
|
detail: {
|
|
name: name,
|
|
},
|
|
})
|
|
);
|
|
this.is_creating = false;
|
|
}
|
|
|
|
on_rename(event) {
|
|
let id = this.shadowRoot.getElementById('select').value;
|
|
let name = this.shadowRoot.getElementById('rename_name').value;
|
|
this.dispatchEvent(
|
|
new CustomEvent('rename', {
|
|
bubbles: true,
|
|
detail: {
|
|
id: id,
|
|
value: this.collection[id],
|
|
name: name,
|
|
},
|
|
})
|
|
);
|
|
this.is_renaming = false;
|
|
}
|
|
|
|
on_tombstone(event) {
|
|
let id = this.shadowRoot.getElementById('select').value;
|
|
if (
|
|
confirm(`Are you sure you want to delete '${this.collection[id].name}'?`)
|
|
) {
|
|
this.dispatchEvent(
|
|
new CustomEvent('tombstone', {
|
|
bubbles: true,
|
|
detail: {
|
|
id: id,
|
|
value: this.collection[id],
|
|
},
|
|
})
|
|
);
|
|
}
|
|
}
|
|
|
|
on_selected(event) {
|
|
let id = event.srcElement.value;
|
|
this.selected_id = id != '' ? id : undefined;
|
|
this.dispatchEvent(
|
|
new CustomEvent('change', {
|
|
bubbles: true,
|
|
detail: {
|
|
id: id,
|
|
value: this.collection[id],
|
|
},
|
|
})
|
|
);
|
|
}
|
|
|
|
render() {
|
|
let self = this;
|
|
return html`
|
|
<link rel="stylesheet" href="tildefriends.css"/>
|
|
<span class="inline-flex-row">
|
|
<select @change=${this.on_selected} id="select" value=${this.selected_id}>
|
|
<option value="" ?selected=${this.selected_id === ''} disabled hidden>(select ${this.category})</option>
|
|
${Object.values(this.collection ?? {})
|
|
.sort((x, y) => x.name.localeCompare(y.name))
|
|
.map(
|
|
(x) =>
|
|
html`<option
|
|
value=${x.id}
|
|
?selected=${this.selected_id === x.id}
|
|
>
|
|
${x.name}
|
|
</option>`
|
|
)}
|
|
</select>
|
|
<span ?hidden=${!this.is_renaming || !this.whoami}>
|
|
<span class="inline-flex-row" style="margin-left: 8px; margin-right: 8px">
|
|
<label for="rename_name">🏷Rename to:</label>
|
|
<input type="text" id="rename_name"></input>
|
|
<button @click=${this.on_rename}>Rename ${this.type}</button>
|
|
<button @click=${() => (self.is_renaming = false)}>x</button>
|
|
</span>
|
|
</span>
|
|
<button class="yellow" @click=${() => (self.is_renaming = true)} ?disabled=${this.is_renaming || !this.selected_id} ?hidden=${!this.whoami}>🏷</button>
|
|
<button class="red" @click=${self.on_tombstone} ?disabled=${!this.selected_id} ?hidden=${!this.whoami}>🪦</button>
|
|
<span ?hidden=${!this.is_creating || !this.whoami}>
|
|
<label for="create_name">New ${this.type} name:</label>
|
|
<input type="text" id="create_name"></input>
|
|
<button @click=${this.on_create}>Create ${this.type}</button>
|
|
<button @click=${() => (self.is_creating = false)}>x</button>
|
|
</span>
|
|
<button class="green" @click=${() => (self.is_creating = true)} ?hidden=${this.is_creating || !this.whoami}>+</button>
|
|
</span>
|
|
`;
|
|
}
|
|
}
|
|
|
|
customElements.define('tf-collection', TfCollectionElement);
|