import { ComponentBase } from '../ComponentBase';
import { DomRender, DomRenderRunConfig } from '../../DomRender';
import { RawSet } from '../../rawsets/RawSet';
import { OtherData } from '../../lifecycle/OnChangeAttrRender';
import { OnInitRender } from '../../lifecycle/OnInitRender';
import { OnCreateRenderDataParams } from '../../lifecycle/OnCreateRenderData';
import { OnCreateRender } from '../../lifecycle/OnCreateRender';
import { type Subscription } from '@dooboostore/core';
import { ValidUtils } from '@dooboostore/core-web';
import { EventUtils } from '@dooboostore/core-web';
export namespace Details {
export const selector = 'dr-details';
export type Attribute = {
class?: string;
toggle_form_reset?: boolean;
disableOtherClickClose?: boolean;
onOpen?: () => void;
onClose?: () => void;
toggle?: (open: boolean) => void;
};
export type BodyAttribute = {
float?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
} & Attribute;
export type FormAttribute = {
disabledSubmit?: null;
submit?: (event: SubmitEvent, element: HTMLFormElement) => void;
} & BodyAttribute;
// @Component({
// template: '#innerHTML#',
// styles: '',
// selector: `${selector}.Summary`
// })
export class Summary extends ComponentBase {
constructor() {
super({ onlyParentType: [Details] });
}
}
// @Component({
// template: '#innerHTML#
',
// selector: `${selector}.Body`
// })
export class Body extends ComponentBase {
private $element?: HTMLDivElement;
constructor() {
super({ onlyParentType: [Details] });
}
}
export const isBody = (instance: any): instance is Body => {
return instance instanceof Body;
};
// @Component({
// template: '',
// styles: detailsFormStyle,
// selector: `${selector}.Form`
// })
export class Form extends ComponentBase {
private $element?: HTMLFormElement;
constructor() {
super({ onlyParentType: [Details] });
}
submit(element: HTMLFormElement, event: SubmitEvent) {
if (this.hasAttribute('disabledSubmit')) {
event.preventDefault();
}
if (this.hasAttribute('submit')) {
this.getAttribute('submit')?.(event, element);
}
}
reset() {
this.$element?.reset();
}
}
export const isForm = (instance: any): instance is Form => {
return instance instanceof Form;
};
// @Component({
// template: template,
// styles: style,
// // noStrip: true,
// selector: `${selector}`
// })
export class Details extends ComponentBase implements OnCreateRender, OnInitRender {
// private detailsElement?: HTMLDetailsElement;
private documentClickSubscription?: Subscription;
private toggleSubscription?: Subscription;
private element?: HTMLDetailsElement;
onCreateRenderData(data: OnCreateRenderDataParams) {
super.onCreateRenderData(data);
}
onCreateRender(...param: any[]): void {}
toggle(element: HTMLDetailsElement) {
const toggleAttribute = this.getAttribute('toggle');
if (toggleAttribute) {
toggleAttribute?.(element.open);
}
if (element.open) {
this.getAttribute('onOpen')?.();
} else {
this.getAttribute('onClose')?.();
}
}
async onInitRender(param: any, rawSet: RawSet) {
await super.onInitRender(param, rawSet);
if (ValidUtils.isBrowser() && this.rawSet?.dataSet.config.window) {
const detailsElement = this.element;
const document = this.rawSet.dataSet!.config!.window!.document!;
this.documentClickSubscription = EventUtils.htmlElementEventObservable(document, 'click').subscribe(event => {
if (this.getAttribute('disableOtherClickClose')) {
return;
}
if (detailsElement && !detailsElement?.contains(event?.target as Node)) {
detailsElement.open = false;
}
});
if (detailsElement) {
this.toggleSubscription = EventUtils.htmlElementEventObservable(detailsElement, 'toggle').subscribe(it => {
if (ValidUtils.coreValidUtils.isNotNullUndefined(this.getAttribute('toggle_form_reset'))) {
this.children?.filter(isForm).forEach(it => {
it.reset();
});
}
});
}
}
// console.log('aaaaaaaaaaaaaaaaaaaaa', rawSet);
}
onChangeAttrRender(name: string, value: any, other: OtherData) {
super.onChangeAttrRender(name, value, other);
}
onDestroyRender(...metaData: any[]): void {
this.toggleSubscription?.unsubscribe();
this.documentClickSubscription?.unsubscribe();
// console.log('onDestroyRender', metaData);
// if (ValidUtils.isBrowser()) {
// document.removeEventListener('click', this.ccc)
// }
}
// changeAttribute(attribute: { className: string } | undefined) {
// }
}
}
export default {
detailsSummary: (config?: DomRenderRunConfig) => {
return RawSet.createComponentTargetElement({
name: `${Details.selector}-summary`,
template:
'#innerHTML#',
objFactory: (e, o, r2, counstructorParam) => {
return DomRender.run({ rootObject: new Details.Summary(), config: config });
}
});
},
detailsBody: (config?: DomRenderRunConfig) => {
return RawSet.createComponentTargetElement({
name: `${Details.selector}-body`,
template:
'#innerHTML#
',
objFactory: (e, o, r2, counstructorParam) => {
return DomRender.run({ rootObject: new Details.Body(), config: config });
}
});
},
detailsForm: (config?: DomRenderRunConfig) => {
return RawSet.createComponentTargetElement({
name: `${Details.selector}-form`,
template:
'',
objFactory: (e, o, r2, counstructorParam) => {
return DomRender.run({ rootObject: new Details.Form(), config: config });
}
});
},
details: (config?: DomRenderRunConfig) => {
return RawSet.createComponentTargetElement({
name: `${Details.selector}`,
styles: `
.details-container {
position: relative;
}
.details-container .details-body-container {
position: absolute;
}
.details-container .details-body-bottom-left-container {
position: absolute;
left: 0;
top: 100%;
/*margin-top: 0px;*/
/*width: max-content;*/
}
.details-container .details-body-bottom-right-container {
position: absolute;
right: 0;
top: 100%;
/*margin-top: 0px;*/
/*width: max-content;*/
}
.details-container .details-body-top-left-container {
position: absolute;
left: 0;
bottom: 100%;
/*margin-bottom: 0px;*/
/*width: max-content;*/
}
.details-container .details-body-top-right-container {
position: absolute;
right: 0;
bottom: 100%;
/*margin-bottom: 0px;*/
}
`,
template:
' #innerHTML# ',
objFactory: (e, o, r2, counstructorParam) => {
return DomRender.run({ rootObject: new Details.Details(...counstructorParam), config: config });
}
});
}
};