@total_onion/onion-modalcontroller 1.0.17 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,14 @@
1
1
  export default class modalController {
2
- constructor() {
2
+ constructor(settings = {}) {
3
3
  let defaultGlobalSettings = {
4
4
  bodyClass: "modal-active",
5
5
  activeStateClass: "modal-active",
6
6
  enableDebugLogs: true,
7
7
  userInteracted: false,
8
+ closeSelector: "#modal-controller-popup__close-btn",
9
+ closeDelay: 0,
10
+ closingClass: "",
11
+ activateDelay: 0,
8
12
  };
9
13
  this.scanForNewTriggers();
10
14
 
@@ -12,7 +16,7 @@ export default class modalController {
12
16
  return modalController.instance;
13
17
  }
14
18
  modalController.instance = this;
15
- this.globalSettings = defaultGlobalSettings;
19
+ this.globalSettings = { ...defaultGlobalSettings, ...settings };
16
20
  this.enableDebugLogs = this.globalSettings.enableDebugLogs;
17
21
  this.handleModalTriggers();
18
22
  this.handleBgClicks();
@@ -30,12 +34,22 @@ export default class modalController {
30
34
  });
31
35
  }
32
36
  handleCloseButtonClicks() {
33
- const closeButton = document.getElementById(
34
- "modal-controller-popup__close-btn"
37
+ const modalPopup = document.getElementById("modal-controller-popup");
38
+ if (!modalPopup) {
39
+ return;
40
+ }
41
+ const closeButtons = modalPopup.querySelectorAll(
42
+ this.globalSettings.closeSelector || "#modal-controller-popup__close-btn"
35
43
  );
36
- closeButton?.addEventListener("click", (event) => {
37
- const modalPopup = document.getElementById("modal-controller-popup");
38
- this.closePopup(modalPopup);
44
+ closeButtons.forEach((closeButton) => {
45
+ if (closeButton.dataset.modalpopupCloseBound === "true") {
46
+ return;
47
+ }
48
+ closeButton.dataset.modalpopupCloseBound = "true";
49
+ closeButton.addEventListener("click", () => {
50
+ const modalPopup = document.getElementById("modal-controller-popup");
51
+ this.closePopup(modalPopup);
52
+ });
39
53
  });
40
54
  }
41
55
  handleModalTriggers() {
@@ -56,7 +70,6 @@ export default class modalController {
56
70
  </div>`;
57
71
  document.body.insertAdjacentHTML("beforeend", modalPopupHtml);
58
72
  modalPopup = document.getElementById("modal-controller-popup");
59
- this.handleCloseButtonClicks();
60
73
  }
61
74
  if (!modalPopup) {
62
75
  return;
@@ -79,7 +92,15 @@ export default class modalController {
79
92
  ) {
80
93
  popupContent.appendChild(modalPopupContent);
81
94
  }
82
- modalPopupContent.classList.add("active");
95
+ const activateDelay = Number(this.globalSettings.activateDelay) || 0;
96
+ if (activateDelay > 0) {
97
+ modalPopupContent.classList.remove("active");
98
+ window.setTimeout(() => {
99
+ modalPopupContent.classList.add("active");
100
+ }, activateDelay);
101
+ } else {
102
+ modalPopupContent.classList.add("active");
103
+ }
83
104
  requestAnimationFrame(() => {
84
105
  modalPopup.classList.add("open");
85
106
  document.documentElement.classList.add("lock-position");
@@ -90,6 +111,9 @@ export default class modalController {
90
111
  }
91
112
  }
92
113
  closePopup(modalPopup) {
114
+ if (!modalPopup) {
115
+ return;
116
+ }
93
117
  modalPopup.classList.remove("open");
94
118
  document.documentElement.classList.remove("lock-position");
95
119
  const popupContent = modalPopup.querySelector(
@@ -100,9 +124,26 @@ export default class modalController {
100
124
  const activeContents = popupContent.querySelectorAll(
101
125
  "[data-modalpopupcontent].active"
102
126
  );
127
+ const closeDelay = Number(this.globalSettings.closeDelay) || 0;
128
+ const closingClass = this.globalSettings.closingClass;
129
+
130
+ if (closeDelay > 0 && closingClass) {
131
+ activeContents.forEach((activeContent) => {
132
+ activeContent.classList.add(closingClass);
133
+ });
134
+ }
135
+
103
136
  activeContents.forEach((activeContent) => {
104
137
  activeContent.classList.remove("active");
105
138
  });
139
+
140
+ if (closeDelay > 0 && closingClass) {
141
+ window.setTimeout(() => {
142
+ activeContents.forEach((activeContent) => {
143
+ activeContent.classList.remove(closingClass);
144
+ });
145
+ }, closeDelay);
146
+ }
106
147
  }
107
148
  }
108
149
  closePopupOnClickOutside(event, modalPopup) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@total_onion/onion-modalcontroller",
3
- "version": "1.0.17",
3
+ "version": "1.1.0",
4
4
  "description": "Pop up modal controller",
5
5
  "main": "onion-modalcontroller.js",
6
6
  "scripts": {