-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbe-clonable.js
91 lines (87 loc) · 2.75 KB
/
be-clonable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// @ts-check
import { resolved, rejected, propInfo} from 'be-enhanced/cc.js';
import { BE } from 'be-enhanced/BE.js';
import {dispatchEvent as de} from 'trans-render/positractions/dispatchEvent.js';
/** @import {BEConfig, IEnhancement, BEAllProps} from './ts-refs/be-enhanced/types.d.ts' */
/** @import {Actions, PAP, AllProps, AP, BAP} from './ts-refs/be-clonable/types.d.ts' */;
/**
* @implements {Actions}
*/
class BeClonable extends BE {
/**
* @type {BEConfig<BAP, Actions & IEnhancement>}
*/
static config = {
propDefaults: {
byob: true,
triggerInsertPosition: 'beforeend',
cloneInsertPosition: 'afterend',
buttonContent: '⿻'
},
propInfo: {
...propInfo,
trigger: {
ro: true,
}
},
positractions: [resolved, rejected],
actions: {
addCloneBtn: {
ifAllOf: ['triggerInsertPosition'],
},
setBtnContent: {
ifAllOf: ['buttonContent', 'trigger'],
ifNoneOf: ['byob'],
}
},
handlers: {
trigger_to_beCloned_on: 'click'
}
};
de = de;
/**
*
* @param {BAP} self
* @returns
*/
async addCloneBtn(self) {
const { triggerInsertPosition, enhancedElement, buttonContent } = self;
const { findAdjacentElement } = await import('trans-render/lib/findAdjacentElement.js');
let trigger = /** @type {HTMLButtonElement | null} */ (findAdjacentElement(triggerInsertPosition, enhancedElement, 'button.be-clonable-trigger'));
let byob = true;
if (trigger === null) {
byob = false;
trigger = document.createElement('button');
trigger.type = 'button';
trigger.classList.add('be-clonable-trigger');
trigger.ariaLabel = 'Clone this.';
trigger.title = 'Clone this.';
enhancedElement.insertAdjacentElement(triggerInsertPosition, trigger);
}
return /** @type {PAP} */ ({
trigger: new WeakRef(trigger),
resolved: true,
byob
});
}
/**
*
* @param {BAP} self
* @returns
*/
setBtnContent(self) {
const { buttonContent, trigger } = self;
const btn = trigger?.deref();
if (btn === undefined)
return;
//TODO: support trusted types
btn.textContent = buttonContent;
}
beCloned(self) {
const { enhancedElement, cloneInsertPosition } = self;
const clone = enhancedElement.cloneNode(true);
enhancedElement.insertAdjacentElement(cloneInsertPosition, clone);
}
}
await BeClonable.bootUp();
export { BeClonable }