@formixru/b2b-ui 2.0.1 → 2.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## v2.1.0
2
+
3
+ - В Request добавлены `reloadOnHideSidebar`/`hideSidebar`, а так же параметр `hideLoaderOnSuccess`
4
+ - В Request добавлена функция `__FORMIX__REQUEST__INIT_CONTENT` вместо `__FORMIX__FORM__INIT_CONTENT`/`__FORMIX__DIALOG__INIT_CONTENT`/`__FORMIX__SIDEBAR_INIT_CONTENT`
5
+ - Поддержка id диалогового окна или сайдбара как c `#`, так и без неё
6
+
1
7
  ## v2.0.1
2
8
 
3
9
  - Исправлена работа `Request`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formixru/b2b-ui",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -2,8 +2,9 @@ import _throttle from 'lodash-es/throttle.js';
2
2
 
3
3
  import { cssVar } from '../../helpers/css-var.js';
4
4
  import { mm } from '../../helpers/mm.js';
5
+ import { hide as hideLoader } from '../loader/index.js';
5
6
  import { disableScroll, enableScroll } from '../overlay/index.js';
6
- import { request } from '../request/index.js';
7
+ import { initRequestContent, request } from '../request/index.js';
7
8
 
8
9
  const isDialogOverflow = ($b) => {
9
10
  return $b.scrollHeight > $b.clientHeight;
@@ -88,35 +89,30 @@ export const hide = async ($b) => {
88
89
 
89
90
  $b.hidden = true;
90
91
  enableScroll();
92
+
91
93
  $b.dispatchEvent(new CustomEvent('dialog-hidden'));
92
94
  } else {
93
95
  enableScroll();
94
96
  }
95
97
  };
96
98
 
97
- export const initDialogContent = ($b) => {
98
- try {
99
- window.__FORMIX__DIALOG__INIT_CONTENT($b);
100
- } catch {
101
- console.warn('Функция __FORMIX__DIALOG__INIT_CONTENT не установлена');
102
- }
103
- };
104
-
105
99
  export const get = async (id, url) => {
100
+ const elementId = id.startsWith('#') ? id : `#${id}`;
106
101
  if (url && url !== '#') {
107
- const { content } = await request({ url });
102
+ const { content } = await request({ url, hideLoaderOnSuccess: false });
108
103
  if (content) {
109
- const $b = document.querySelector(id);
104
+ const $b = document.querySelector(elementId);
110
105
  if ($b) {
111
106
  $b.querySelector('.dialog__container').innerHTML = content;
112
107
  await show($b);
113
- initDialogContent($b);
108
+ initRequestContent($b);
109
+ hideLoader();
114
110
  } else {
115
- console.error(`Диалоговое окно с id ${id} не найдено`);
111
+ console.error(`Диалоговое окно с id ${elementId} не найдено`);
116
112
  }
117
113
  }
118
114
  } else {
119
- const $b = document.querySelector(id);
115
+ const $b = document.querySelector(elementId);
120
116
  show($b);
121
117
  }
122
118
  };
@@ -2,16 +2,7 @@
2
2
 
3
3
  import { getSmartCaptcha } from '../../helpers/get-smart-captcha.js';
4
4
  import { scrollTo } from '../../helpers/scroll-to.js';
5
- import { initDialogContent } from '../dialog/index.js';
6
- import { request } from '../request/index.js';
7
-
8
- const initFormContent = ($b) => {
9
- try {
10
- window.__FORMIX__FORM__INIT_CONTENT($b);
11
- } catch {
12
- console.warn('Функция __FORMIX__FORM__INIT_CONTENT не установлена');
13
- }
14
- };
5
+ import { initRequestContent, request } from '../request/index.js';
15
6
 
16
7
  export const send = async ($b, url, method, data) => {
17
8
  const { success, content } = await request({
@@ -27,7 +18,7 @@ export const send = async ($b, url, method, data) => {
27
18
  const $dialog = $b.closest('.dialog');
28
19
  if ($dialog) {
29
20
  $dialog.querySelector('.dialog__container').innerHTML = content;
30
- initDialogContent($dialog);
21
+ initRequestContent($dialog);
31
22
  setTimeout(() => {
32
23
  scrollToError($dialog);
33
24
  });
@@ -37,7 +28,7 @@ export const send = async ($b, url, method, data) => {
37
28
  const $form = $parent.querySelector('.form');
38
29
  if ($form) {
39
30
  init($form);
40
- initFormContent($form);
31
+ initRequestContent($form);
41
32
  setTimeout(() => {
42
33
  scrollToError($form);
43
34
  });
@@ -3,11 +3,27 @@
3
3
  import { is } from '@advdominion/is';
4
4
 
5
5
  import { errorHandler } from '../../helpers/error-handler.js';
6
- import { hide as hideDialog, initDialogContent, show as showDialog } from '../dialog/index.js';
6
+ import { hide as hideDialog, show as showDialog } from '../dialog/index.js';
7
7
  import { clearLoaderTimeout, hide as hideLoader, show as showLoader } from '../loader/index.js';
8
- import { initSidebarContent, show as showSidebar } from '../sidebar/index.js';
8
+ import { hide as hideSidebar, show as showSidebar } from '../sidebar/index.js';
9
9
 
10
- export const request = async ({ $b, url = '', method = 'GET', data = {}, loader = true, showLoaderDelay }) => {
10
+ export const initRequestContent = ($b) => {
11
+ try {
12
+ window.__FORMIX__REQUEST__INIT_CONTENT($b);
13
+ } catch {
14
+ console.warn('Функция __FORMIX__REQUEST__INIT_CONTENT не установлена');
15
+ }
16
+ };
17
+
18
+ export const request = async ({
19
+ $b,
20
+ url = '',
21
+ method = 'GET',
22
+ data = {},
23
+ loader = true,
24
+ showLoaderDelay,
25
+ hideLoaderOnSuccess = true,
26
+ }) => {
11
27
  url = new URL(url, location.origin);
12
28
  const options = {
13
29
  method,
@@ -78,7 +94,7 @@ export const request = async ({ $b, url = '', method = 'GET', data = {}, loader
78
94
  if ($dialog) {
79
95
  $dialog.querySelector('.dialog__container').innerHTML = data.dialog.content;
80
96
  await showDialog($dialog);
81
- initDialogContent($dialog);
97
+ initRequestContent($dialog);
82
98
  } else {
83
99
  console.error(`Диалоговое окно с id ${data.trigger} не найдено`);
84
100
  }
@@ -110,11 +126,33 @@ export const request = async ({ $b, url = '', method = 'GET', data = {}, loader
110
126
  if ($sidebar) {
111
127
  $sidebar.innerHTML = data.sidebar.content;
112
128
  await showSidebar($sidebar);
113
- initSidebarContent($sidebar);
129
+ initRequestContent($sidebar);
114
130
  } else {
115
131
  console.error(`Сайдбар с id ${data.trigger} не найден`);
116
132
  }
117
133
  }
134
+ if (data.reloadOnHideSidebar) {
135
+ if (data.sidebar) {
136
+ const $sidebar = document.querySelector(data.sidebar.id);
137
+ $sidebar?.addEventListener('sidebar-hide', () => {
138
+ location.reload();
139
+ });
140
+ } else {
141
+ $b?.closest('.sidebar').addEventListener('sidebar-hide', () => {
142
+ location.reload();
143
+ });
144
+ }
145
+ }
146
+ if (data.hideSidebar) {
147
+ if (data.sidebar) {
148
+ const $sidebar = document.querySelector(data.sidebar.id);
149
+ if ($sidebar) {
150
+ hideSidebar($sidebar);
151
+ }
152
+ } else if ($b) {
153
+ hideSidebar($b.closest('.sidebar'));
154
+ }
155
+ }
118
156
  if (data.trigger) {
119
157
  const $trigger = document.querySelector(data.trigger);
120
158
  if ($trigger) {
@@ -126,7 +164,13 @@ export const request = async ({ $b, url = '', method = 'GET', data = {}, loader
126
164
  }
127
165
  }
128
166
  }
129
- if (!(data.reloadOnHideDialog && data.hideDialog) && (!data.trigger || data.hideDialog) && loader) {
167
+ if (
168
+ !(data.reloadOnHideDialog && data.hideDialog) &&
169
+ !(data.reloadOnHideSidebar && data.hideSidebar) &&
170
+ (!data.trigger || data.hideDialog || data.hideSidebar) &&
171
+ loader &&
172
+ hideLoaderOnSuccess
173
+ ) {
130
174
  hideLoader();
131
175
  }
132
176
  }
@@ -155,7 +199,7 @@ document.body.addEventListener('click', (event) => {
155
199
  }
156
200
  if ($el.dataset.requestData) {
157
201
  try {
158
- options.method = JSON.parse($el.dataset.requestData);
202
+ options.data = JSON.parse($el.dataset.requestData);
159
203
  } catch {
160
204
  console.warn('Ошибка при попытке преобразования значения data-request-data в JSON');
161
205
  }
@@ -1,67 +1,83 @@
1
1
  import { cssVar } from '../../helpers/css-var.js';
2
2
  import { mm } from '../../helpers/mm.js';
3
+ import { hide as hideLoader } from '../loader/index.js';
3
4
  import { disableScroll, enableScroll, hide as hideOverlay, show as showOverlay } from '../overlay/index.js';
4
- import { request } from '../request/index.js';
5
+ import { initRequestContent, request } from '../request/index.js';
5
6
 
6
7
  export const show = async ($b) => {
7
- if ($b.id !== 'settings-generator') {
8
- disableScroll();
9
- }
10
- $b.hidden = false;
11
- showOverlay();
12
- let width = mm('tablet-landscape-up')
13
- ? $b.offsetWidth + $b.querySelector('.sidebar__aside').offsetWidth
14
- : $b.offsetWidth;
15
- if ($b.classList.contains('sidebar_left')) {
16
- width = width * -1;
8
+ if ($b?.hidden) {
9
+ $b.dispatchEvent(new CustomEvent('sidebar-show'));
10
+
11
+ if ($b.id !== 'settings-generator') {
12
+ disableScroll();
13
+ }
14
+ $b.hidden = false;
15
+ showOverlay();
16
+
17
+ let width = mm('tablet-landscape-up')
18
+ ? $b.offsetWidth + $b.querySelector('.sidebar__aside').offsetWidth
19
+ : $b.offsetWidth;
20
+ if ($b.classList.contains('sidebar_left')) {
21
+ width = width * -1;
22
+ }
23
+ await $b.animate([{ transform: `translateX(${width}px)` }, { transform: 'translateX(0px)' }], {
24
+ duration: cssVar('--duration-enter-m'),
25
+ easing: cssVar('--easing-deceleration'),
26
+ }).finished;
27
+
28
+ $b.dispatchEvent(new CustomEvent('sidebar-shown'));
17
29
  }
18
- await $b.animate([{ transform: `translateX(${width}px)` }, { transform: 'translateX(0px)' }], {
19
- duration: cssVar('--duration-enter-m'),
20
- easing: cssVar('--easing-deceleration'),
21
- }).finished;
30
+
31
+ return new Promise((resolve) => {
32
+ resolve();
33
+ });
22
34
  };
23
35
 
24
36
  export const hide = async ($b) => {
25
- hideOverlay();
26
- let width = mm('tablet-landscape-up')
27
- ? $b.offsetWidth + $b.querySelector('.sidebar__aside').offsetWidth
28
- : $b.offsetWidth;
29
- if ($b.classList.contains('sidebar_left')) {
30
- width = width * -1;
31
- }
32
- await $b.animate([{ transform: 'translateX(0px)' }, { transform: `translateX(${width}px)` }], {
33
- duration: cssVar('--duration-leave-m'),
34
- easing: cssVar('--easing-acceleration'),
35
- }).finished;
36
- $b.hidden = true;
37
- if ($b.id !== 'settings-generator') {
38
- enableScroll();
39
- }
40
- };
37
+ if ($b && !$b.hidden) {
38
+ $b.dispatchEvent(new CustomEvent('sidebar-hide'));
41
39
 
42
- export const initSidebarContent = ($b) => {
43
- try {
44
- window.__FORMIX__SIDEBAR__INIT_CONTENT($b);
45
- } catch {
46
- console.warn('Функция __FORMIX__SIDEBAR__INIT_CONTENT не установлена');
40
+ hideOverlay();
41
+
42
+ let width = mm('tablet-landscape-up')
43
+ ? $b.offsetWidth + $b.querySelector('.sidebar__aside').offsetWidth
44
+ : $b.offsetWidth;
45
+ if ($b.classList.contains('sidebar_left')) {
46
+ width = width * -1;
47
+ }
48
+ await $b.animate([{ transform: 'translateX(0px)' }, { transform: `translateX(${width}px)` }], {
49
+ duration: cssVar('--duration-leave-m'),
50
+ easing: cssVar('--easing-acceleration'),
51
+ }).finished;
52
+
53
+ $b.hidden = true;
54
+ if ($b.id !== 'settings-generator') {
55
+ enableScroll();
56
+ }
57
+
58
+ $b.dispatchEvent(new CustomEvent('sidebar-hidden'));
59
+ } else if ($b.id !== 'settings-generator') {
60
+ enableScroll();
47
61
  }
48
62
  };
49
63
 
50
64
  export const get = async (id, url, showLoaderDelay) => {
65
+ const elementId = id.startsWith('#') ? id : `#${id}`;
51
66
  if (url && url !== '#') {
52
- const { content } = await request({ url, showLoaderDelay });
67
+ const { content } = await request({ url, showLoaderDelay, hideLoaderOnSuccess: false });
53
68
  if (content) {
54
- const $b = document.querySelector(id);
69
+ const $b = document.querySelector(elementId);
55
70
  if ($b) {
56
71
  $b.innerHTML = content;
57
72
  await show($b);
58
- initSidebarContent($b);
73
+ initRequestContent($b);
74
+ hideLoader();
59
75
  } else {
60
- console.error(`Сайдбар с id ${id} не найден`);
76
+ console.error(`Сайдбар с id ${elementId} не найден`);
61
77
  }
62
78
  }
63
79
  } else {
64
- const $b = document.querySelector(id);
80
+ const $b = document.querySelector(elementId);
65
81
  show($b);
66
82
  }
67
83
  };
@@ -1,126 +0,0 @@
1
- /* globals BX */
2
-
3
- import { is } from '@advdominion/is';
4
-
5
- import { hide as hideDialog, initDialogContent, show as showDialog } from '../components/dialog/index.js';
6
- import { clearLoaderTimeout, hide as hideLoader, show as showLoader } from '../components/loader.js';
7
- import { initSidebarContent, show as showSidebar } from '../components/sidebar/index.js';
8
- import { errorHandler } from './error-handler.js';
9
-
10
- export const req = async ({ $b, url = '', method = 'GET', data = {}, loader = true, showLoaderDelay }) => {
11
- url = new URL(url, location.origin);
12
- const options = {
13
- method,
14
- headers: {
15
- 'X-Requested-With': 'XMLHttpRequest',
16
- 'X-Session-Id': BX.message('bitrix_sessid'),
17
- },
18
- };
19
- if (method === 'GET') {
20
- for (const [name, value] of data) {
21
- url.searchParams.append(name, value);
22
- }
23
- } else {
24
- options.body = data;
25
- }
26
- if (loader) {
27
- showLoader(showLoaderDelay);
28
- }
29
- try {
30
- const response = await fetch(url, options);
31
- if (!response.ok) {
32
- throw response;
33
- }
34
- const data = await response.json().catch(async () => {
35
- console.warn('Ошибка при попытке преобразования ответа в JSON.');
36
- const content = await response.text();
37
- return { content };
38
- });
39
-
40
- if (is(data.redirect, 'String')) {
41
- if (data.redirect) {
42
- location.assign(data.redirect);
43
- if (data.redirect.startsWith('tg:')) {
44
- if (loader) {
45
- hideLoader();
46
- }
47
- } else {
48
- clearLoaderTimeout();
49
- }
50
- } else {
51
- location.reload();
52
- }
53
- } else {
54
- try {
55
- await window.__FORMIX__REQ__INTERCEPT_DATA(data);
56
- } catch {
57
- console.warn('Функция __FORMIX__REQUEST__INTERCEPT_DATA не установлена');
58
- }
59
- if (data.dialog) {
60
- const $dialog = document.querySelector(data.dialog.id);
61
- if ($dialog) {
62
- $dialog.querySelector('.dialog__container').innerHTML = data.dialog.content;
63
- await showDialog($dialog);
64
- initDialogContent($dialog);
65
- } else {
66
- console.error(`Диалоговое окно с id ${data.trigger} не найдено`);
67
- }
68
- }
69
- if (data.reloadOnHideDialog) {
70
- if (data.dialog) {
71
- const $dialog = document.querySelector(data.dialog.id);
72
- $dialog?.addEventListener('dialog-hide', () => {
73
- location.reload();
74
- });
75
- } else {
76
- $b?.closest('.dialog').addEventListener('dialog-hide', () => {
77
- location.reload();
78
- });
79
- }
80
- }
81
- if (data.hideDialog) {
82
- if (data.dialog) {
83
- const $dialog = document.querySelector(data.dialog.id);
84
- if ($dialog) {
85
- hideDialog($dialog);
86
- }
87
- } else if ($b) {
88
- hideDialog($b.closest('.dialog'));
89
- }
90
- }
91
- if (data.sidebar) {
92
- const $sidebar = document.querySelector(data.sidebar.id);
93
- if ($sidebar) {
94
- $sidebar.innerHTML = data.sidebar.content;
95
- await showSidebar($sidebar);
96
- initSidebarContent($sidebar);
97
- } else {
98
- console.error(`Сайдбар с id ${data.trigger} не найден`);
99
- }
100
- }
101
- if (data.trigger) {
102
- const $trigger = document.querySelector(data.trigger);
103
- if ($trigger) {
104
- $trigger?.click();
105
- console.error(`Элемент с селектором ${data.trigger} не найден`);
106
- } else if (loader) {
107
- hideLoader();
108
- }
109
- }
110
- if (!(data.reloadOnHideDialog && data.hideDialog) && (!data.trigger || data.hideDialog) && loader) {
111
- hideLoader();
112
- }
113
- }
114
-
115
- return data;
116
- } catch (error) {
117
- if (error.status === 401) {
118
- location.reload();
119
- } else {
120
- if (loader) {
121
- hideLoader();
122
- }
123
- errorHandler(error);
124
- }
125
- }
126
- };