-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomponentCollection.js
More file actions
149 lines (135 loc) · 4.05 KB
/
Copy pathcomponentCollection.js
File metadata and controls
149 lines (135 loc) · 4.05 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/**
* This file is part of the project licensed under the MIT License.
* Copyright (c) 2026 Serhii Romanenko
* See LICENSE file in the project root for full license information.
*/
'use strict';
import { default as Component } from './component.js';
class ComponentCollection {
/**
* @param {Component[]} components - The set of components
*/
constructor(components) {
for (const component of components) {
if (! (component instanceof Component) ) {
throw new Error('Param components is invalid. Expected Component');
}
}
this.components = components;
}
/**
* Makes the components inaccessible
*/
disable() {
for (const component of this.components) {
component.disable();
}
}
/**
* Makes the components accessible
*/
enable() {
for (const component of this.components) {
component.enable();
}
}
/**
* Subscribe the components to a DOM event
* @param {string} name - The DOM event name
* @param {function(Event): void} callback - Triggered on a DOM event
*/
onEvent(name, callback) {
for (const component of this.components) {
component.onEvent(name, callback);
}
}
/**
* @param {function(HTMLElement): void} callback - Triggered on show() call
*/
onShow(callback) {
if (typeof callback !== 'function') {
throw new Error('Param show is invalid');
}
for (const component of this.components) {
component.onShow(callback);
}
}
/**
* @param {function(HTMLElement): void} callback - Triggered on hide() call
*/
onHide(callback) {
if (typeof callback !== 'function') {
throw new Error('Param callback is invalid');
}
for (const component of this.components) {
component.onHide(callback);
}
}
/**
* Displays components
* @param {string} type - CSS style display
*/
show(type = 'block') {
for (const component of this.components) {
component.show(type);
}
}
/**
* Hides components
*/
hide() {
for (const component of this.components) {
component.hide();
}
}
/**
* Adds inner text.
* Do not pass the text parameter for clearing.
* @param {string} newText Inner text
*/
text(newText = '') {
for (const component of this.components) {
component.text(newText);
}
}
/**
* @param {string} className - Css class
* @returns {Component} - The componentCollection instance
*/
static fromClass(className) {
if (typeof className !== 'string') {
throw new Error('Param className is invalid');
}
const nodes = document.getElementsByClassName(className);
if (! (nodes instanceof HTMLCollection) ) {
throw new Error('Param className is invalid. Expected HTMLCollection');
}
if (nodes.length === 0) {
throw new Error('Elements with class name ' + className + ' not present');
}
const components = [];
for (const node of nodes) {
components.push(new Component(node));
}
return new this(components);
}
/**
* @param {string} tagName - HTML tag
* @returns {Component} - The componentCollection instance
*/
static fromTag(tagName) {
if (typeof tagName !== 'string') {
throw new Error('Param tagName is invalid');
}
const nodes = document.getElementsByTagName(tagName);
if (! (nodes instanceof HTMLCollection) ) {
throw new Error('Param tagName is invalid. Expected HTMLCollection');
}
const components = [];
for (const node of nodes) {
components.push(new Component(node));
}
return new this(components);
}
}
export default ComponentCollection;