egroupware_official/api/js/etemplate/Et2Dialog/Et2MergeDialog.ts

147 lines
4.0 KiB
TypeScript
Raw Normal View History

import {customElement} from "lit/decorators/custom-element.js";
import {Et2Widget} from "../Et2Widget/Et2Widget";
import {css, html, LitElement} from "lit";
import shoelace from "../Styles/shoelace";
import {Et2VfsSelectDialog} from "../Et2Vfs/Et2VfsSelectDialog";
import {property} from "lit/decorators/property.js";
import {Et2Dialog} from "./Et2Dialog";
import {state} from "lit/decorators/state.js";
@customElement("et2-merge-dialog")
export class Et2MergeDialog extends Et2Widget(LitElement)
{
static get styles()
{
return [
super.styles,
shoelace,
css`
:host {
}
et2-details::part(content) {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--sl-spacing-medium);
}
`,
];
}
@property()
application : string
@property()
path : string
// Can't merge "& send" if no email template selected
@state()
canEmail = false;
private get dialog() : Et2VfsSelectDialog
{
return <Et2VfsSelectDialog><unknown>this.shadowRoot.querySelector("et2-vfs-select-dialog");
}
public async getComplete() : Promise<{
documents : { path : string, mime : string }[],
options : { [key : string] : string | boolean }
}>
{
await this.updateComplete;
const [button, value] = await this.dialog.getComplete();
if(!button)
{
return {documents: [], options: this.optionValues};
}
const documents = [];
Array.from(<ArrayLike<string>>value).forEach(value =>
{
const fileInfo = this.dialog.fileInfo(value) ?? [];
documents.push({path: value, mime: fileInfo.mime})
});
let options = this.optionValues;
if(button == Et2Dialog.OK_BUTTON)
{
options.download = true;
}
return {documents: documents, options: options};
}
public get optionValues()
{
const optionValues = {
download: false
};
this.dialog.querySelectorAll(":not([slot='footer'])").forEach(e =>
{
if(typeof e.getValue == "function")
{
optionValues[e.getAttribute("id")] = e.getValue() === "true" ? true : e.getValue();
}
});
return optionValues;
}
private option(component_name)
{
return this.dialog.querySelector("et2-details > [id='" + component_name + "']");
}
protected handleFileSelect(event)
{
// Disable PDF checkbox for only email files selected
let canPDF = false;
const oldCanEmail = this.canEmail;
this.canEmail = false;
this.dialog.value.forEach(path =>
{
if(this.dialog.fileInfo(path).mime !== "message/rfc822")
{
canPDF = true;
}
else
{
this.canEmail = true;
}
});
this.option("pdf").disabled = !canPDF;
this.requestUpdate("canEmail", oldCanEmail);
}
render()
{
return html`
<et2-vfs-select-dialog
class=egw_app_merge_document"
path=${this.path}
multiple="true"
buttonLabel=${this.egw().lang("Download")}
.title="${this.egw().lang("Insert in document")}"
.open=${true}
@et2-select=${this.handleFileSelect}
>
${this.canEmail ?
html`
<et2-button slot="footer" id="send" label=${this.egw().lang("Merge & send")} image="mail"
noSubmit="true"></et2-button> ` :
html`
<et2-button slot="footer" id="send" label=${this.egw().lang("Merge")} image="etemplate/merge"
noSubmit="true"></et2-button>`
}
<et2-details>
<span slot="summary">${this.egw().lang("Merge options")}</span>
<et2-checkbox label=${this.egw().lang("Save as PDF")} id="pdf"></et2-checkbox>
<et2-checkbox id="link"
label="${this.egw().lang("Link to each entry")}"
></et2-checkbox>
<et2-checkbox label=${this.egw().lang("Merge individually")} id="individual"></et2-checkbox>
<slot></slot>
</et2-details>
</et2-vfs-select-dialog>`;
}
}