@libs-ui/utils 0.1.1-1
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/README.md +3 -0
- package/base64.d.ts +5 -0
- package/cache.d.ts +42 -0
- package/color.d.ts +11 -0
- package/communicate-micro.d.ts +16 -0
- package/constants.d.ts +10 -0
- package/crypto-3rd.d.ts +7 -0
- package/crypto.d.ts +8 -0
- package/dangerous-object.d.ts +79 -0
- package/date.d.ts +44 -0
- package/dom.d.ts +52 -0
- package/download.d.ts +3 -0
- package/esm2022/base64.mjs +43 -0
- package/esm2022/cache.mjs +388 -0
- package/esm2022/color.mjs +133 -0
- package/esm2022/communicate-micro.mjs +149 -0
- package/esm2022/constants.mjs +11 -0
- package/esm2022/crypto-3rd.mjs +38 -0
- package/esm2022/crypto.mjs +41 -0
- package/esm2022/dangerous-object.mjs +149 -0
- package/esm2022/date.mjs +191 -0
- package/esm2022/dom.mjs +256 -0
- package/esm2022/download.mjs +41 -0
- package/esm2022/file.mjs +90 -0
- package/esm2022/format-number.mjs +66 -0
- package/esm2022/format-text.mjs +149 -0
- package/esm2022/function-check-embed-frame.mjs +10 -0
- package/esm2022/get-smart-axis-scale.mjs +174 -0
- package/esm2022/helpers.mjs +651 -0
- package/esm2022/http-params.mjs +80 -0
- package/esm2022/index.mjs +30 -0
- package/esm2022/inject-token.mjs +5 -0
- package/esm2022/key-cache.mjs +31 -0
- package/esm2022/key-code.mjs +123 -0
- package/esm2022/language.mjs +70 -0
- package/esm2022/libs-ui-utils.mjs +5 -0
- package/esm2022/pattern.mjs +62 -0
- package/esm2022/random.mjs +42 -0
- package/esm2022/two-way-signal-object.mjs +131 -0
- package/esm2022/uri.mjs +25 -0
- package/esm2022/url-search-params.mjs +99 -0
- package/esm2022/uuid.mjs +18 -0
- package/esm2022/xss-filter.mjs +10 -0
- package/fesm2022/libs-ui-utils.mjs +3234 -0
- package/fesm2022/libs-ui-utils.mjs.map +1 -0
- package/file.d.ts +18 -0
- package/format-number.d.ts +2 -0
- package/format-text.d.ts +11 -0
- package/function-check-embed-frame.d.ts +2 -0
- package/get-smart-axis-scale.d.ts +34 -0
- package/helpers.d.ts +270 -0
- package/http-params.d.ts +37 -0
- package/index.d.ts +29 -0
- package/inject-token.d.ts +4 -0
- package/key-cache.d.ts +1 -0
- package/key-code.d.ts +122 -0
- package/language.d.ts +37 -0
- package/package.json +29 -0
- package/pattern.d.ts +20 -0
- package/random.d.ts +3 -0
- package/two-way-signal-object.d.ts +15 -0
- package/uri.d.ts +5 -0
- package/url-search-params.d.ts +25 -0
- package/uuid.d.ts +1 -0
- package/xss-filter.d.ts +3 -0
package/esm2022/date.mjs
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { isSignal } from '@angular/core';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import 'dayjs/locale/en';
|
|
4
|
+
import 'dayjs/locale/vi';
|
|
5
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
6
|
+
import localeData from 'dayjs/plugin/localeData';
|
|
7
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
8
|
+
import updateLocale from 'dayjs/plugin/updateLocale';
|
|
9
|
+
import utc from 'dayjs/plugin/utc';
|
|
10
|
+
import { UtilsCache } from './cache';
|
|
11
|
+
dayjs.extend(localeData);
|
|
12
|
+
dayjs.extend(updateLocale);
|
|
13
|
+
dayjs.extend(utc);
|
|
14
|
+
dayjs.extend(timezone);
|
|
15
|
+
dayjs.extend(customParseFormat);
|
|
16
|
+
let timeZoneSetup = 'Asia/Ho_Chi_Minh';
|
|
17
|
+
export const setDefaultTimeZone = (localeZone = timeZoneSetup) => {
|
|
18
|
+
timeZoneSetup = localeZone;
|
|
19
|
+
dayjs.tz.setDefault(localeZone);
|
|
20
|
+
};
|
|
21
|
+
let functionFormatDate = undefined;
|
|
22
|
+
export const updateFunctionFormatDate = (functionCustom) => {
|
|
23
|
+
functionFormatDate = functionCustom;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @description Lấy đối tượng dayjs theo config
|
|
27
|
+
* @param config nếu không có config sẽ trả về đối tượng dayjs là thời gian hiện tại
|
|
28
|
+
* @param config.date thời gian cần lấy
|
|
29
|
+
* @param config.returnDayjsIfConfigDateNotExist true nếu muốn trả về đối tượng dayjs nếu config.date không có
|
|
30
|
+
* @param config.utc true nếu muốn lấy thời gian UTC
|
|
31
|
+
* @param config.formatOfDate định dạng thời gian đang được truyền vào
|
|
32
|
+
*/
|
|
33
|
+
export const getDayjs = (config) => {
|
|
34
|
+
// helper cast để tránh lặp lại kiểu điều kiện ở các return
|
|
35
|
+
const out = (v) => v;
|
|
36
|
+
if (!config) {
|
|
37
|
+
return out(dayjs().tz());
|
|
38
|
+
}
|
|
39
|
+
config.date = !config.date && config.returnDayjsIfConfigDateNotExist ? dayjs().tz() : config.date;
|
|
40
|
+
if (typeof config.date === 'number') {
|
|
41
|
+
config.date = dayjs.unix(config.date);
|
|
42
|
+
}
|
|
43
|
+
if (!config.date) {
|
|
44
|
+
return out(undefined);
|
|
45
|
+
}
|
|
46
|
+
let { date, utc, formatOfDate } = config;
|
|
47
|
+
while (isSignal(date)) {
|
|
48
|
+
date = date();
|
|
49
|
+
}
|
|
50
|
+
while (isSignal(utc)) {
|
|
51
|
+
utc = utc();
|
|
52
|
+
}
|
|
53
|
+
while (isSignal(formatOfDate)) {
|
|
54
|
+
formatOfDate = formatOfDate();
|
|
55
|
+
}
|
|
56
|
+
if (utc) {
|
|
57
|
+
if (formatOfDate) {
|
|
58
|
+
return out(dayjs(date, formatOfDate).utc());
|
|
59
|
+
}
|
|
60
|
+
const dateInputIsUTC = (dayjs.isDayjs(date) && date.isUTC()) || (typeof date === 'string' && date.includes('Z'));
|
|
61
|
+
if (dateInputIsUTC) {
|
|
62
|
+
return out(dayjs(date));
|
|
63
|
+
}
|
|
64
|
+
return out(dayjs(date).utc());
|
|
65
|
+
}
|
|
66
|
+
if (typeof date === 'string' && !date.includes('Z') && !date.includes('+')) {
|
|
67
|
+
return out(formatOfDate ? dayjs.tz(date, formatOfDate, config.localeZone || timeZoneSetup) : dayjs.tz(date, config.localeZone || timeZoneSetup));
|
|
68
|
+
}
|
|
69
|
+
return out((formatOfDate ? dayjs(date, formatOfDate) : dayjs(date)).tz());
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* @description Kiểm tra xem hai ngày có khác nhau không (khác ngày trong tuần)
|
|
73
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
74
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
75
|
+
* @returns true nếu hai ngày khác nhau, false nếu giống nhau hoặc không thể so sánh
|
|
76
|
+
*/
|
|
77
|
+
export const isDifferenceDay = (date1, date2) => {
|
|
78
|
+
if (isDifferenceMonth(date1, date2)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const day1 = getDayjs({ date: date1 })?.day();
|
|
82
|
+
const day2 = getDayjs({ date: date2 })?.day();
|
|
83
|
+
return day1 !== day2;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* @description Kiểm tra xem hai ngày có khác tháng không
|
|
87
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
88
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
89
|
+
* @returns true nếu hai ngày khác tháng, false nếu cùng tháng hoặc không thể so sánh
|
|
90
|
+
*/
|
|
91
|
+
export const isDifferenceMonth = (date1, date2) => {
|
|
92
|
+
if (isDifferenceYear(date1, date2)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const month1 = getDayjs({ date: date1 })?.month();
|
|
96
|
+
const month2 = getDayjs({ date: date2 })?.month();
|
|
97
|
+
return month1 !== month2;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* @description Kiểm tra xem hai ngày có khác năm không
|
|
101
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
102
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
103
|
+
* @returns true nếu hai ngày khác năm, false nếu cùng năm hoặc không thể so sánh
|
|
104
|
+
*/
|
|
105
|
+
export const isDifferenceYear = (date1, date2) => {
|
|
106
|
+
const year1 = getDayjs({ date: date1 })?.year();
|
|
107
|
+
const year2 = getDayjs({ date: date2 })?.year();
|
|
108
|
+
return year1 !== year2;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* @description Lấy ra chuỗi thời gian hiển thị theo định dạng và ngôn ngữ
|
|
112
|
+
* @param date thời gian cần định dạng
|
|
113
|
+
* @param format định dạng thời gian muốn lấy ra
|
|
114
|
+
* @param lang lấy theo ngôn ngữ
|
|
115
|
+
*/
|
|
116
|
+
export const formatDate = (date, formatOutput = 'YYYY/MM/DD HH:mm', lang, formatInput) => {
|
|
117
|
+
if (!date) {
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
lang = lang || UtilsCache.getLang();
|
|
121
|
+
if (functionFormatDate) {
|
|
122
|
+
return functionFormatDate(date, formatOutput, lang);
|
|
123
|
+
}
|
|
124
|
+
date = getDayjs({ date, formatOfDate: formatInput }).locale(lang);
|
|
125
|
+
if (lang === 'vi') {
|
|
126
|
+
dayjs.updateLocale('vi', {
|
|
127
|
+
monthsShort: 'Thg 1_Thg 2_Thg 3_Thg 4_Thg 5_Thg 6_Thg 7_Thg 8_Thg 9_Thg 10_Thg 11_Thg 12'.split('_'),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return date.format(getFormatData(getTypeByFormat(formatOutput), lang)) || '';
|
|
131
|
+
};
|
|
132
|
+
const getTypeByFormat = (format) => {
|
|
133
|
+
if (format === 'dm' || format === 'dmy' || format === 'dmy hm' || format === 'my') {
|
|
134
|
+
return format;
|
|
135
|
+
}
|
|
136
|
+
if (format === 'DD/MM/YYYY' || format === 'YYYY-MM-DD' || format === 'dd/MM/yyyy' || format === 'dd-MM-yyyy' || format === 'dd/mm/yyyy') {
|
|
137
|
+
return 'dmy';
|
|
138
|
+
}
|
|
139
|
+
if (format === 'MM-DD' || format === 'dd/MM' || format === 'dd/mm') {
|
|
140
|
+
return 'dm';
|
|
141
|
+
}
|
|
142
|
+
if (format === 'M/YYYY' || format === 'YYYY-MM' || format === 'MM/yyyy') {
|
|
143
|
+
return 'my';
|
|
144
|
+
}
|
|
145
|
+
if (format === 'YYYY/MM/DD hh:mm:ss' || format === 'dmy hms' || format === 'dd/mm/yyyy hh:mm:ss') {
|
|
146
|
+
return 'dmy hms';
|
|
147
|
+
}
|
|
148
|
+
if (format === 'hh:mm' || format === 'HH:mm') {
|
|
149
|
+
return 'hh:mm';
|
|
150
|
+
}
|
|
151
|
+
if (format === 'hh:mm A' || format === 'HH:mm A') {
|
|
152
|
+
return 'hh:mm A';
|
|
153
|
+
}
|
|
154
|
+
return 'dmy hm';
|
|
155
|
+
};
|
|
156
|
+
const getFormatData = (type, lang) => {
|
|
157
|
+
switch (type) {
|
|
158
|
+
case 'dm':
|
|
159
|
+
if (lang === 'vi') {
|
|
160
|
+
return 'D MMM';
|
|
161
|
+
}
|
|
162
|
+
return 'MMM D';
|
|
163
|
+
case 'dmy':
|
|
164
|
+
if (lang === 'vi') {
|
|
165
|
+
return 'D MMM, YYYY';
|
|
166
|
+
}
|
|
167
|
+
return 'MMM D, YYYY';
|
|
168
|
+
case 'dmy hm':
|
|
169
|
+
if (lang === 'vi') {
|
|
170
|
+
return 'D MMM, YYYY HH:mm';
|
|
171
|
+
}
|
|
172
|
+
return 'MMM D, YYYY HH:mm';
|
|
173
|
+
case 'my':
|
|
174
|
+
if (lang === 'vi') {
|
|
175
|
+
return 'MMM, YYYY';
|
|
176
|
+
}
|
|
177
|
+
return 'MMM YYYY ';
|
|
178
|
+
case 'dmy hms':
|
|
179
|
+
if (lang === 'vi') {
|
|
180
|
+
return 'D MMM, YYYY HH:mm:ss';
|
|
181
|
+
}
|
|
182
|
+
return 'MMM D, YYYY HH:mm:ss';
|
|
183
|
+
case 'hh:mm':
|
|
184
|
+
case 'HH:mm':
|
|
185
|
+
return 'HH:mm';
|
|
186
|
+
case 'hh:mm A':
|
|
187
|
+
case 'HH:mm A':
|
|
188
|
+
return 'HH:mm A';
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxVQUFVLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3pCLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDM0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNoQyxJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQVUsR0FBRyxhQUFhLEVBQUUsRUFBRTtJQUMvRCxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUdGLElBQUksa0JBQWtCLEdBQTBDLFNBQVMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSx3QkFB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QVksRUFBRSxFQUFFO0lBQ25JLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLElBQUk7WUFDUCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBRWpCLEtBQUssS0FBSztZQUNSLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNsQixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFFdkIsS0FBSyxRQUFRO1lBQ1gsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsQ0FBQztZQUVELE9BQU8sbUJBQW1CLENBQUM7UUFFN0IsS0FBSyxJQUFJO1lBQ1AsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sV0FBVyxDQUFDO1lBQ3JCLENBQUM7WUFFRCxPQUFPLFdBQVcsQ0FBQztRQUVyQixLQUFLLFNBQVM7WUFDWixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxzQkFBc0IsQ0FBQztZQUNoQyxDQUFDO1lBRUQsT0FBTyxzQkFBc0IsQ0FBQztRQUVoQyxLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFDO1FBRWpCLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHZXREYXlqc0NvbmZpZywgR2V0RGF5anNSZXR1cm4sIE5vbk51bGxhYmxlRGF0ZSwgVFlQRV9PQkpFQ1QgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbic7XG5pbXBvcnQgJ2RheWpzL2xvY2FsZS92aSc7XG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0JztcbmltcG9ydCBsb2NhbGVEYXRhIGZyb20gJ2RheWpzL3BsdWdpbi9sb2NhbGVEYXRhJztcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xuaW1wb3J0IHVwZGF0ZUxvY2FsZSBmcm9tICdkYXlqcy9wbHVnaW4vdXBkYXRlTG9jYWxlJztcbmltcG9ydCB1dGMgZnJvbSAnZGF5anMvcGx1Z2luL3V0Yyc7XG5pbXBvcnQgeyBVdGlsc0NhY2hlIH0gZnJvbSAnLi9jYWNoZSc7XG5kYXlqcy5leHRlbmQobG9jYWxlRGF0YSk7XG5kYXlqcy5leHRlbmQodXBkYXRlTG9jYWxlKTtcbmRheWpzLmV4dGVuZCh1dGMpO1xuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5sZXQgdGltZVpvbmVTZXR1cCA9ICdBc2lhL0hvX0NoaV9NaW5oJztcblxuZXhwb3J0IGNvbnN0IHNldERlZmF1bHRUaW1lWm9uZSA9IChsb2NhbGVab25lID0gdGltZVpvbmVTZXR1cCkgPT4ge1xuICB0aW1lWm9uZVNldHVwID0gbG9jYWxlWm9uZTtcbiAgZGF5anMudHouc2V0RGVmYXVsdChsb2NhbGVab25lKTtcbn07XG5cbmV4cG9ydCB0eXBlIFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUgPSAodGltZTogZGF5anMuQ29uZmlnVHlwZSwgZm9ybWF0T3V0cHV0OiBzdHJpbmcsIGxhbmc/OiBzdHJpbmcpID0+IHN0cmluZztcbmxldCBmdW5jdGlvbkZvcm1hdERhdGU6IFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGdW5jdGlvbkZvcm1hdERhdGUgPSAoZnVuY3Rpb25DdXN0b206IFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUpID0+IHtcbiAgZnVuY3Rpb25Gb3JtYXREYXRlID0gZnVuY3Rpb25DdXN0b207XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBM4bqleSDEkeG7kWkgdMaw4bujbmcgZGF5anMgdGhlbyBjb25maWdcbiAqIEBwYXJhbSBjb25maWcgbuG6v3Uga2jDtG5nIGPDsyBjb25maWcgc+G6vSB0cuG6oyB24buBIMSR4buRaSB0xrDhu6NuZyBkYXlqcyBsw6AgdGjhu51pIGdpYW4gaGnhu4duIHThuqFpXG4gKiBAcGFyYW0gY29uZmlnLmRhdGUgdGjhu51pIGdpYW4gY+G6p24gbOG6pXlcbiAqIEBwYXJhbSBjb25maWcucmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdCB0cnVlIG7hur91IG114buRbiB0cuG6oyB24buBIMSR4buRaSB0xrDhu6NuZyBkYXlqcyBu4bq/dSBjb25maWcuZGF0ZSBraMO0bmcgY8OzXG4gKiBAcGFyYW0gY29uZmlnLnV0YyB0cnVlIG7hur91IG114buRbiBs4bqleSB0aOG7nWkgZ2lhbiBVVENcbiAqIEBwYXJhbSBjb25maWcuZm9ybWF0T2ZEYXRlIMSR4buLbmggZOG6oW5nIHRo4budaSBnaWFuIMSRYW5nIMSRxrDhu6NjIHRydXnhu4FuIHbDoG9cbiAqL1xuZXhwb3J0IGNvbnN0IGdldERheWpzID0gPEMgZXh0ZW5kcyBHZXREYXlqc0NvbmZpZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oY29uZmlnPzogQyk6IEdldERheWpzUmV0dXJuPEM+ID0+IHtcbiAgLy8gaGVscGVyIGNhc3QgxJHhu4MgdHLDoW5oIGzhurdwIGzhuqFpIGtp4buDdSDEkWnhu4F1IGtp4buHbiDhu58gY8OhYyByZXR1cm5cbiAgY29uc3Qgb3V0ID0gKHY6IHVua25vd24pID0+IHYgYXMgR2V0RGF5anNSZXR1cm48Qz47XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIG91dChkYXlqcygpLnR6KCkpO1xuICB9XG4gIGNvbmZpZy5kYXRlID0gIWNvbmZpZy5kYXRlICYmIGNvbmZpZy5yZXR1cm5EYXlqc0lmQ29uZmlnRGF0ZU5vdEV4aXN0ID8gZGF5anMoKS50eigpIDogY29uZmlnLmRhdGU7XG4gIGlmICh0eXBlb2YgY29uZmlnLmRhdGUgPT09ICdudW1iZXInKSB7XG4gICAgY29uZmlnLmRhdGUgPSBkYXlqcy51bml4KGNvbmZpZy5kYXRlKTtcbiAgfVxuICBpZiAoIWNvbmZpZy5kYXRlKSB7XG4gICAgcmV0dXJuIG91dCh1bmRlZmluZWQpO1xuICB9XG4gIGxldCB7IGRhdGUsIHV0YywgZm9ybWF0T2ZEYXRlIH0gPSBjb25maWcgYXMgVFlQRV9PQkpFQ1Q7XG5cbiAgd2hpbGUgKGlzU2lnbmFsKGRhdGUpKSB7XG4gICAgZGF0ZSA9IGRhdGUoKTtcbiAgfVxuICB3aGlsZSAoaXNTaWduYWwodXRjKSkge1xuICAgIHV0YyA9IHV0YygpO1xuICB9XG4gIHdoaWxlIChpc1NpZ25hbChmb3JtYXRPZkRhdGUpKSB7XG4gICAgZm9ybWF0T2ZEYXRlID0gZm9ybWF0T2ZEYXRlKCk7XG4gIH1cblxuICBpZiAodXRjKSB7XG4gICAgaWYgKGZvcm1hdE9mRGF0ZSkge1xuICAgICAgcmV0dXJuIG91dChkYXlqcyhkYXRlLCBmb3JtYXRPZkRhdGUpLnV0YygpKTtcbiAgICB9XG4gICAgY29uc3QgZGF0ZUlucHV0SXNVVEMgPSAoZGF5anMuaXNEYXlqcyhkYXRlKSAmJiBkYXRlLmlzVVRDKCkpIHx8ICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycgJiYgKGRhdGUgYXMgc3RyaW5nKS5pbmNsdWRlcygnWicpKTtcblxuICAgIGlmIChkYXRlSW5wdXRJc1VUQykge1xuICAgICAgcmV0dXJuIG91dChkYXlqcyhkYXRlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dChkYXlqcyhkYXRlKS51dGMoKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnICYmICEoZGF0ZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCdaJykgJiYgIShkYXRlIGFzIHN0cmluZykuaW5jbHVkZXMoJysnKSkge1xuICAgIHJldHVybiBvdXQoZm9ybWF0T2ZEYXRlID8gZGF5anMudHooZGF0ZSwgZm9ybWF0T2ZEYXRlLCBjb25maWcubG9jYWxlWm9uZSB8fCB0aW1lWm9uZVNldHVwKSA6IGRheWpzLnR6KGRhdGUsIGNvbmZpZy5sb2NhbGVab25lIHx8IHRpbWVab25lU2V0dXApKTtcbiAgfVxuXG4gIHJldHVybiBvdXQoKGZvcm1hdE9mRGF0ZSA/IGRheWpzKGRhdGUsIGZvcm1hdE9mRGF0ZSkgOiBkYXlqcyhkYXRlKSkudHooKSk7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLaeG7g20gdHJhIHhlbSBoYWkgbmfDoHkgY8OzIGtow6FjIG5oYXUga2jDtG5nIChraMOhYyBuZ8OgeSB0cm9uZyB0deG6p24pXG4gKiBAcGFyYW0gZGF0ZTEgbmfDoHkgdGjhu6kgbmjhuqV0IGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gZGF0ZTIgbmfDoHkgdGjhu6kgaGFpIGPhuqduIHNvIHPDoW5oXG4gKiBAcmV0dXJucyB0cnVlIG7hur91IGhhaSBuZ8OgeSBraMOhYyBuaGF1LCBmYWxzZSBu4bq/dSBnaeG7kW5nIG5oYXUgaG/hurdjIGtow7RuZyB0aOG7gyBzbyBzw6FuaFxuICovXG5leHBvcnQgY29uc3QgaXNEaWZmZXJlbmNlRGF5ID0gKGRhdGUxOiBOb25OdWxsYWJsZURhdGUsIGRhdGUyOiBOb25OdWxsYWJsZURhdGUpID0+IHtcbiAgaWYgKGlzRGlmZmVyZW5jZU1vbnRoKGRhdGUxLCBkYXRlMikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBkYXkxID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMSB9KT8uZGF5KCk7XG4gIGNvbnN0IGRheTIgPSBnZXREYXlqcyh7IGRhdGU6IGRhdGUyIH0pPy5kYXkoKTtcblxuICByZXR1cm4gZGF5MSAhPT0gZGF5Mjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtp4buDbSB0cmEgeGVtIGhhaSBuZ8OgeSBjw7Mga2jDoWMgdGjDoW5nIGtow7RuZ1xuICogQHBhcmFtIGRhdGUxIG5nw6B5IHRo4bupIG5o4bqldCBj4bqnbiBzbyBzw6FuaFxuICogQHBhcmFtIGRhdGUyIG5nw6B5IHRo4bupIGhhaSBj4bqnbiBzbyBzw6FuaFxuICogQHJldHVybnMgdHJ1ZSBu4bq/dSBoYWkgbmfDoHkga2jDoWMgdGjDoW5nLCBmYWxzZSBu4bq/dSBjw7luZyB0aMOhbmcgaG/hurdjIGtow7RuZyB0aOG7gyBzbyBzw6FuaFxuICovXG5leHBvcnQgY29uc3QgaXNEaWZmZXJlbmNlTW9udGggPSAoZGF0ZTE6IE5vbk51bGxhYmxlRGF0ZSwgZGF0ZTI6IE5vbk51bGxhYmxlRGF0ZSkgPT4ge1xuICBpZiAoaXNEaWZmZXJlbmNlWWVhcihkYXRlMSwgZGF0ZTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgbW9udGgxID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMSB9KT8ubW9udGgoKTtcbiAgY29uc3QgbW9udGgyID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMiB9KT8ubW9udGgoKTtcblxuICByZXR1cm4gbW9udGgxICE9PSBtb250aDI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLaeG7g20gdHJhIHhlbSBoYWkgbmfDoHkgY8OzIGtow6FjIG7Eg20ga2jDtG5nXG4gKiBAcGFyYW0gZGF0ZTEgbmfDoHkgdGjhu6kgbmjhuqV0IGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gZGF0ZTIgbmfDoHkgdGjhu6kgaGFpIGPhuqduIHNvIHPDoW5oXG4gKiBAcmV0dXJucyB0cnVlIG7hur91IGhhaSBuZ8OgeSBraMOhYyBuxINtLCBmYWxzZSBu4bq/dSBjw7luZyBuxINtIGhv4bq3YyBraMO0bmcgdGjhu4Mgc28gc8OhbmhcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGlmZmVyZW5jZVllYXIgPSAoZGF0ZTE6IE5vbk51bGxhYmxlRGF0ZSwgZGF0ZTI6IE5vbk51bGxhYmxlRGF0ZSkgPT4ge1xuICBjb25zdCB5ZWFyMSA9IGdldERheWpzKHsgZGF0ZTogZGF0ZTEgfSk/LnllYXIoKTtcbiAgY29uc3QgeWVhcjIgPSBnZXREYXlqcyh7IGRhdGU6IGRhdGUyIH0pPy55ZWFyKCk7XG5cbiAgcmV0dXJuIHllYXIxICE9PSB5ZWFyMjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEzhuqV5IHJhIGNodeG7l2kgdGjhu51pIGdpYW4gaGnhu4NuIHRo4buLIHRoZW8gxJHhu4tuaCBk4bqhbmcgdsOgIG5nw7RuIG5n4buvXG4gKiBAcGFyYW0gZGF0ZSB0aOG7nWkgZ2lhbiBj4bqnbiDEkeG7i25oIGThuqFuZ1xuICogQHBhcmFtIGZvcm1hdCDEkeG7i25oIGThuqFuZyB0aOG7nWkgZ2lhbiBtdeG7kW4gbOG6pXkgcmFcbiAqIEBwYXJhbSBsYW5nIGzhuqV5IHRoZW8gbmfDtG4gbmfhu69cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZTogZGF5anMuQ29uZmlnVHlwZSwgZm9ybWF0T3V0cHV0ID0gJ1lZWVkvTU0vREQgSEg6bW0nLCBsYW5nPzogc3RyaW5nLCBmb3JtYXRJbnB1dD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBsYW5nID0gbGFuZyB8fCAoVXRpbHNDYWNoZS5nZXRMYW5nKCkgYXMgc3RyaW5nKTtcbiAgaWYgKGZ1bmN0aW9uRm9ybWF0RGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbkZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3V0cHV0LCBsYW5nKTtcbiAgfVxuXG4gIGRhdGUgPSBnZXREYXlqcyh7IGRhdGUsIGZvcm1hdE9mRGF0ZTogZm9ybWF0SW5wdXQgfSkubG9jYWxlKGxhbmcpO1xuICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgIGRheWpzLnVwZGF0ZUxvY2FsZSgndmknLCB7XG4gICAgICBtb250aHNTaG9ydDogJ1RoZyAxX1RoZyAyX1RoZyAzX1RoZyA0X1RoZyA1X1RoZyA2X1RoZyA3X1RoZyA4X1RoZyA5X1RoZyAxMF9UaGcgMTFfVGhnIDEyJy5zcGxpdCgnXycpLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGUuZm9ybWF0KGdldEZvcm1hdERhdGEoZ2V0VHlwZUJ5Rm9ybWF0KGZvcm1hdE91dHB1dCksIGxhbmcpKSB8fCAnJztcbn07XG5cbmNvbnN0IGdldFR5cGVCeUZvcm1hdCA9IChmb3JtYXQ6IHN0cmluZyk6ICdkbScgfCAnZG15JyB8ICdkbXkgaG0nIHwgJ215JyB8ICdkbXkgaG1zJyB8ICdoaDptbScgfCAnSEg6bW0nIHwgJ2hoOm1tIEEnIHwgJ0hIOm1tIEEnID0+IHtcbiAgaWYgKGZvcm1hdCA9PT0gJ2RtJyB8fCBmb3JtYXQgPT09ICdkbXknIHx8IGZvcm1hdCA9PT0gJ2RteSBobScgfHwgZm9ybWF0ID09PSAnbXknKSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdERC9NTS9ZWVlZJyB8fCBmb3JtYXQgPT09ICdZWVlZLU1NLUREJyB8fCBmb3JtYXQgPT09ICdkZC9NTS95eXl5JyB8fCBmb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCBmb3JtYXQgPT09ICdkZC9tbS95eXl5Jykge1xuICAgIHJldHVybiAnZG15JztcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdNTS1ERCcgfHwgZm9ybWF0ID09PSAnZGQvTU0nIHx8IGZvcm1hdCA9PT0gJ2RkL21tJykge1xuICAgIHJldHVybiAnZG0nO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ00vWVlZWScgfHwgZm9ybWF0ID09PSAnWVlZWS1NTScgfHwgZm9ybWF0ID09PSAnTU0veXl5eScpIHtcbiAgICByZXR1cm4gJ215JztcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdZWVlZL01NL0REIGhoOm1tOnNzJyB8fCBmb3JtYXQgPT09ICdkbXkgaG1zJyB8fCBmb3JtYXQgPT09ICdkZC9tbS95eXl5IGhoOm1tOnNzJykge1xuICAgIHJldHVybiAnZG15IGhtcyc7XG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAnaGg6bW0nIHx8IGZvcm1hdCA9PT0gJ0hIOm1tJykge1xuICAgIHJldHVybiAnaGg6bW0nO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ2hoOm1tIEEnIHx8IGZvcm1hdCA9PT0gJ0hIOm1tIEEnKSB7XG4gICAgcmV0dXJuICdoaDptbSBBJztcbiAgfVxuXG4gIHJldHVybiAnZG15IGhtJztcbn07XG5cbmNvbnN0IGdldEZvcm1hdERhdGEgPSAodHlwZTogJ2RtJyB8ICdkbXknIHwgJ2RteSBobScgfCAnbXknIHwgJ2RteSBobXMnIHwgJ2hoOm1tJyB8ICdoaDptbSBBJyB8ICdISDptbScgfCAnSEg6bW0gQScsIGxhbmc6IHN0cmluZykgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdkbSc6XG4gICAgICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgICAgICByZXR1cm4gJ0QgTU1NJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gRCc7XG5cbiAgICBjYXNlICdkbXknOlxuICAgICAgaWYgKGxhbmcgPT09ICd2aScpIHtcbiAgICAgICAgcmV0dXJuICdEIE1NTSwgWVlZWSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTU1NIEQsIFlZWVknO1xuXG4gICAgY2FzZSAnZG15IGhtJzpcbiAgICAgIGlmIChsYW5nID09PSAndmknKSB7XG4gICAgICAgIHJldHVybiAnRCBNTU0sIFlZWVkgSEg6bW0nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01NTSBELCBZWVlZIEhIOm1tJztcblxuICAgIGNhc2UgJ215JzpcbiAgICAgIGlmIChsYW5nID09PSAndmknKSB7XG4gICAgICAgIHJldHVybiAnTU1NLCBZWVlZJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gWVlZWSAnO1xuXG4gICAgY2FzZSAnZG15IGhtcyc6XG4gICAgICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgICAgICByZXR1cm4gJ0QgTU1NLCBZWVlZIEhIOm1tOnNzJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gRCwgWVlZWSBISDptbTpzcyc7XG5cbiAgICBjYXNlICdoaDptbSc6XG4gICAgY2FzZSAnSEg6bW0nOlxuICAgICAgcmV0dXJuICdISDptbSc7XG5cbiAgICBjYXNlICdoaDptbSBBJzpcbiAgICBjYXNlICdISDptbSBBJzpcbiAgICAgIHJldHVybiAnSEg6bW0gQSc7XG4gIH1cbn07XG4iXX0=
|
package/esm2022/dom.mjs
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import DeviceDetector from 'device-detector-js';
|
|
2
|
+
import Quill from 'quill';
|
|
3
|
+
import { finalize, fromEvent, lastValueFrom, mergeMap, startWith, takeUntil, tap, timer } from 'rxjs';
|
|
4
|
+
import { decodeEscapeHtml } from './format-text';
|
|
5
|
+
import { set } from './helpers';
|
|
6
|
+
const deviceDetector = new DeviceDetector();
|
|
7
|
+
const parser = new DOMParser();
|
|
8
|
+
const quill = new Quill(document.createElement('div'));
|
|
9
|
+
export const getDeviceInfo = () => {
|
|
10
|
+
return deviceDetector.parse(window.navigator.userAgent);
|
|
11
|
+
};
|
|
12
|
+
export const getPlatFromBrowser = () => {
|
|
13
|
+
const info = getDeviceInfo();
|
|
14
|
+
return `${info.client?.name} ${info.client?.version}`;
|
|
15
|
+
};
|
|
16
|
+
export const getEventNameHandleClick = (() => {
|
|
17
|
+
const deviceInfo = getDeviceInfo();
|
|
18
|
+
let nameEventHandleClick = deviceInfo.device?.type === 'desktop' ? 'click' : 'touchstart';
|
|
19
|
+
if ('onpointerdown' in window) {
|
|
20
|
+
nameEventHandleClick = 'pointerdown';
|
|
21
|
+
}
|
|
22
|
+
return nameEventHandleClick;
|
|
23
|
+
})();
|
|
24
|
+
export const getDocumentByString = (htmlStr) => {
|
|
25
|
+
return parser.parseFromString(htmlStr, 'text/html');
|
|
26
|
+
};
|
|
27
|
+
export const cloneIBoundingClientRect = (rect) => {
|
|
28
|
+
return {
|
|
29
|
+
top: rect['top'],
|
|
30
|
+
left: rect['left'],
|
|
31
|
+
width: rect['width'],
|
|
32
|
+
height: rect['height'],
|
|
33
|
+
bottom: rect['bottom'],
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export const setStylesElement = (el, styles) => {
|
|
37
|
+
Object.keys(styles).forEach((key) => set(el, `style.${key}`, styles[key]));
|
|
38
|
+
};
|
|
39
|
+
export const getViewport = (win = window) => {
|
|
40
|
+
const doc = win.document.documentElement, body = win.document.getElementsByTagName('body')[0], w = win.innerWidth || doc.clientWidth || body.clientWidth, h = win.innerHeight || doc.clientHeight || body.clientHeight;
|
|
41
|
+
return { width: w, height: h };
|
|
42
|
+
};
|
|
43
|
+
export const setCaretPosition = (element, position) => {
|
|
44
|
+
if (!element || !element.setSelectionRange) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
element.focus();
|
|
48
|
+
element.setSelectionRange(position, position);
|
|
49
|
+
};
|
|
50
|
+
export const checkViewInScreen = (container, element, elementScroll, maxTopLeft) => {
|
|
51
|
+
if (!container || !element) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const rectContainer = cloneIBoundingClientRect(container.getBoundingClientRect());
|
|
55
|
+
if (elementScroll) {
|
|
56
|
+
const rectElementScroll = elementScroll.getBoundingClientRect();
|
|
57
|
+
rectContainer['left'] = rectElementScroll.left;
|
|
58
|
+
rectContainer['top'] = rectElementScroll.top;
|
|
59
|
+
}
|
|
60
|
+
const rectElement = element.getBoundingClientRect();
|
|
61
|
+
const { left, top } = rectElement;
|
|
62
|
+
const topContainer = rectContainer['top'];
|
|
63
|
+
const leftContainer = rectContainer['left'];
|
|
64
|
+
const widthContainer = rectContainer['width'];
|
|
65
|
+
const heightContainer = rectContainer['height'];
|
|
66
|
+
const scrollTopContainer = container.scrollTop;
|
|
67
|
+
const scrollLeftContainer = container.scrollLeft;
|
|
68
|
+
const limitTop = topContainer + scrollTopContainer + heightContainer;
|
|
69
|
+
const limitLeft = leftContainer + scrollLeftContainer + widthContainer;
|
|
70
|
+
const maxTopItem = top + (maxTopLeft?.top || 0);
|
|
71
|
+
const maxLeftItem = left + (maxTopLeft?.left || 0);
|
|
72
|
+
if (topContainer <= maxTopItem && maxTopItem <= limitTop && leftContainer <= maxLeftItem && maxLeftItem <= limitLeft) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
};
|
|
77
|
+
export const checkMouseOverInContainer = (mousePosition, element, rect) => {
|
|
78
|
+
if (!element && !rect) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const rectElement = rect || element?.getBoundingClientRect() || {};
|
|
82
|
+
const { left, top, width, height } = rectElement;
|
|
83
|
+
const limitLeft = left + width;
|
|
84
|
+
const limitTop = top + height;
|
|
85
|
+
const { clientX, clientY } = mousePosition;
|
|
86
|
+
if (left <= clientX && clientX <= limitLeft && top <= clientY && clientY <= limitTop) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
export const getDragEventByElement = (config) => {
|
|
92
|
+
let timer;
|
|
93
|
+
const addClass = () => {
|
|
94
|
+
timer = setTimeout(() => {
|
|
95
|
+
document.body.classList.add('!select-none');
|
|
96
|
+
document.body.classList.add('!cursor-grabbing');
|
|
97
|
+
}, 250);
|
|
98
|
+
};
|
|
99
|
+
const removeClass = () => {
|
|
100
|
+
document.body.classList.remove('!select-none');
|
|
101
|
+
document.body.classList.remove('!cursor-grabbing');
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
};
|
|
104
|
+
fromEvent(config.elementMouseDown, 'mouseleave')
|
|
105
|
+
.pipe(tap(() => document.body.classList.remove('cursor-pointer')), takeUntil(config.onDestroy))
|
|
106
|
+
.subscribe();
|
|
107
|
+
fromEvent(config.elementMouseDown, 'mouseenter')
|
|
108
|
+
.pipe(tap(() => document.body.classList.add('cursor-pointer')), takeUntil(config.onDestroy))
|
|
109
|
+
.subscribe();
|
|
110
|
+
const mouseDown = fromEvent(config.elementMouseDown, 'mousedown').pipe(tap((e) => {
|
|
111
|
+
e.stopPropagation();
|
|
112
|
+
addClass();
|
|
113
|
+
config.functionMouseDown?.(e);
|
|
114
|
+
}));
|
|
115
|
+
const mouseup = fromEvent(config.elementMouseUp || document, 'mouseup').pipe(tap((e) => {
|
|
116
|
+
e.stopPropagation();
|
|
117
|
+
removeClass();
|
|
118
|
+
config.functionMouseUp?.(e);
|
|
119
|
+
}));
|
|
120
|
+
const mousemove = fromEvent(config.elementMouseMove || document, 'mousemove').pipe(tap((e) => {
|
|
121
|
+
e.stopPropagation();
|
|
122
|
+
config.functionMouseMove?.(e);
|
|
123
|
+
}), takeUntil(mouseup));
|
|
124
|
+
return mouseDown.pipe(mergeMap((e) => (config.isStartWithMouseDownEvent ? mousemove.pipe(startWith(e)) : mousemove)), takeUntil(config.onDestroy), finalize(removeClass));
|
|
125
|
+
};
|
|
126
|
+
export const getHTMLFromQuill = async (data, options) => {
|
|
127
|
+
const { replaceNewLineTo = '<br>', replaceTagBRTo, replaceTags, replaceBrToDiv } = options || {};
|
|
128
|
+
const delta = typeof data === 'string' ? await getDeltaFromHTML(data) : data;
|
|
129
|
+
if (options?.functionReplaceDelta) {
|
|
130
|
+
options.functionReplaceDelta(delta);
|
|
131
|
+
}
|
|
132
|
+
delta.ops.forEach((op) => {
|
|
133
|
+
if (op.insert) {
|
|
134
|
+
if (typeof op.insert === 'string') {
|
|
135
|
+
if (replaceNewLineTo) {
|
|
136
|
+
op.insert = op.insert.replace(/\n/g, replaceNewLineTo);
|
|
137
|
+
}
|
|
138
|
+
if (replaceTagBRTo) {
|
|
139
|
+
op.insert = op.insert.replace(/<br>/g, replaceTagBRTo);
|
|
140
|
+
}
|
|
141
|
+
if (replaceTags?.length) {
|
|
142
|
+
for (const tag of replaceTags) {
|
|
143
|
+
op.insert = op.insert.replace(new RegExp(`<${tag.tag}>`, 'g'), `<${tag.replaceTo}>`);
|
|
144
|
+
op.insert = op.insert.replace(new RegExp(`</${tag.tag}>`, 'g'), `</${tag.replaceTo}>`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
quill.setContents(delta);
|
|
151
|
+
let htmlText = options?.getRootHtml ? quill.root.innerHTML : quill.root.firstElementChild?.innerHTML;
|
|
152
|
+
if (replaceBrToDiv) {
|
|
153
|
+
htmlText = convertHtmlToDivBlocks(htmlText || '');
|
|
154
|
+
}
|
|
155
|
+
return decodeEscapeHtml(htmlText || '');
|
|
156
|
+
};
|
|
157
|
+
export const convertHtmlToDivBlocks = (html) => {
|
|
158
|
+
const BREAK_TOKEN = '<<<BREAK>>>';
|
|
159
|
+
// Bước 1: thay <br> thành token tạm
|
|
160
|
+
const normalizedHtml = html.replace(/<br\s*\/?>/gi, BREAK_TOKEN);
|
|
161
|
+
// Bước 2: tách theo token
|
|
162
|
+
const parts = normalizedHtml.split(BREAK_TOKEN);
|
|
163
|
+
const parser = new DOMParser();
|
|
164
|
+
const divs = [];
|
|
165
|
+
for (const raw of parts) {
|
|
166
|
+
const trimmed = raw.trim();
|
|
167
|
+
if (!trimmed)
|
|
168
|
+
continue;
|
|
169
|
+
// parse mỗi phần nhỏ như một document riêng
|
|
170
|
+
const doc = parser.parseFromString(trimmed, 'text/html');
|
|
171
|
+
const body = doc.body;
|
|
172
|
+
// Lấy lại nội dung bên trong body
|
|
173
|
+
divs.push(`<div>${body.innerHTML}</div>`);
|
|
174
|
+
}
|
|
175
|
+
return divs.join('');
|
|
176
|
+
};
|
|
177
|
+
export const getDeltaFromHTML = async (html) => {
|
|
178
|
+
quill.root.innerHTML = html;
|
|
179
|
+
setTimeout(() => {
|
|
180
|
+
console.log(quill.getContents());
|
|
181
|
+
}, 1000);
|
|
182
|
+
await lastValueFrom(timer(1000));
|
|
183
|
+
return quill.getContents();
|
|
184
|
+
};
|
|
185
|
+
export const processPasteData = async (e, config) => {
|
|
186
|
+
const element = config.element;
|
|
187
|
+
const files = e.clipboardData?.files;
|
|
188
|
+
if (files?.length) {
|
|
189
|
+
e.preventDefault();
|
|
190
|
+
config.handlerPasteFile?.(files);
|
|
191
|
+
config.callBack?.('file');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Lưu selection TRƯỚC khi prevent default
|
|
195
|
+
const selection = window.getSelection();
|
|
196
|
+
let savedRange = null;
|
|
197
|
+
if (selection && selection.rangeCount > 0) {
|
|
198
|
+
const range = selection.getRangeAt(0);
|
|
199
|
+
// Chỉ lưu nếu range nằm trong contentText element
|
|
200
|
+
const container = range.commonAncestorContainer;
|
|
201
|
+
const isInContentElement = element.contains(container.nodeType === Node.TEXT_NODE ? container.parentNode : container);
|
|
202
|
+
if (isInContentElement) {
|
|
203
|
+
savedRange = range.cloneRange();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Prevent default để tự xử lý paste
|
|
207
|
+
e.preventDefault();
|
|
208
|
+
// Sử dụng Quill để clean HTML content
|
|
209
|
+
const htmlContent = e.clipboardData?.getData('text/html') || '';
|
|
210
|
+
const plainText = e.clipboardData?.getData('text/plain') || '';
|
|
211
|
+
let contentToInsert = (plainText || '').replace(/\n/g, '<br>');
|
|
212
|
+
if (htmlContent) {
|
|
213
|
+
contentToInsert = await getHTMLFromQuill(htmlContent);
|
|
214
|
+
}
|
|
215
|
+
if (!contentToInsert) {
|
|
216
|
+
config.callBack?.('no-content');
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (savedRange) {
|
|
220
|
+
insertContentWithRange(contentToInsert, savedRange, element);
|
|
221
|
+
config.callBack?.('range');
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
element.innerHTML += contentToInsert;
|
|
225
|
+
config.callBack?.('content');
|
|
226
|
+
};
|
|
227
|
+
export const insertContentWithRange = (content, savedRange, element) => {
|
|
228
|
+
const selection = window.getSelection();
|
|
229
|
+
if (!selection) {
|
|
230
|
+
// Fallback: append vào cuối
|
|
231
|
+
element.innerHTML += content;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Restore selection
|
|
235
|
+
selection.removeAllRanges();
|
|
236
|
+
selection.addRange(savedRange);
|
|
237
|
+
// Xóa nội dung đã select (nếu có)
|
|
238
|
+
savedRange.deleteContents();
|
|
239
|
+
// Tạo document fragment từ HTML content
|
|
240
|
+
const tempDiv = document.createElement('div');
|
|
241
|
+
tempDiv.innerHTML = content;
|
|
242
|
+
const fragment = document.createDocumentFragment();
|
|
243
|
+
while (tempDiv.firstChild) {
|
|
244
|
+
fragment.appendChild(tempDiv.firstChild);
|
|
245
|
+
}
|
|
246
|
+
// Insert fragment tại vị trí range
|
|
247
|
+
savedRange.insertNode(fragment);
|
|
248
|
+
// Di chuyển cursor đến cuối nội dung vừa insert
|
|
249
|
+
if (fragment.lastChild) {
|
|
250
|
+
savedRange.setStartAfter(fragment.lastChild);
|
|
251
|
+
}
|
|
252
|
+
savedRange.collapse(true);
|
|
253
|
+
selection.removeAllRanges();
|
|
254
|
+
selection.addRange(savedRange);
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sY0FBYyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBVyxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVoQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzdCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3hELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFH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QVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxnREFBZ0Q7SUFDaEQsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSUJvdW5kaW5nQ2xpZW50UmVjdCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IERldmljZURldGVjdG9yIGZyb20gJ2RldmljZS1kZXRlY3Rvci1qcyc7XG5pbXBvcnQgUXVpbGwgZnJvbSAncXVpbGwnO1xuaW1wb3J0IERlbHRhIGZyb20gJ3F1aWxsLWRlbHRhJztcbmltcG9ydCB7IGZpbmFsaXplLCBmcm9tRXZlbnQsIGxhc3RWYWx1ZUZyb20sIG1lcmdlTWFwLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVjb2RlRXNjYXBlSHRtbCB9IGZyb20gJy4vZm9ybWF0LXRleHQnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuY29uc3QgZGV2aWNlRGV0ZWN0b3IgPSBuZXcgRGV2aWNlRGV0ZWN0b3IoKTtcbmNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbmNvbnN0IHF1aWxsID0gbmV3IFF1aWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcblxuZXhwb3J0IGNvbnN0IGdldERldmljZUluZm8gPSAoKSA9PiB7XG4gIHJldHVybiBkZXZpY2VEZXRlY3Rvci5wYXJzZSh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFBsYXRGcm9tQnJvd3NlciA9ICgpID0+IHtcbiAgY29uc3QgaW5mbyA9IGdldERldmljZUluZm8oKTtcbiAgcmV0dXJuIGAke2luZm8uY2xpZW50Py5uYW1lfSAke2luZm8uY2xpZW50Py52ZXJzaW9ufWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnROYW1lSGFuZGxlQ2xpY2sgPSAoKCkgPT4ge1xuICBjb25zdCBkZXZpY2VJbmZvID0gZ2V0RGV2aWNlSW5mbygpO1xuICBsZXQgbmFtZUV2ZW50SGFuZGxlQ2xpY2sgPSBkZXZpY2VJbmZvLmRldmljZT8udHlwZSA9PT0gJ2Rlc2t0b3AnID8gJ2NsaWNrJyA6ICd0b3VjaHN0YXJ0JztcbiAgaWYgKCdvbnBvaW50ZXJkb3duJyBpbiB3aW5kb3cpIHtcbiAgICBuYW1lRXZlbnRIYW5kbGVDbGljayA9ICdwb2ludGVyZG93bic7XG4gIH1cblxuICByZXR1cm4gbmFtZUV2ZW50SGFuZGxlQ2xpY2s7XG59KSgpO1xuXG5leHBvcnQgY29uc3QgZ2V0RG9jdW1lbnRCeVN0cmluZyA9IChodG1sU3RyOiBzdHJpbmcpOiBEb2N1bWVudCA9PiB7XG4gIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWxTdHIsICd0ZXh0L2h0bWwnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9uZUlCb3VuZGluZ0NsaWVudFJlY3QgPSAocmVjdDogSUJvdW5kaW5nQ2xpZW50UmVjdCk6IElCb3VuZGluZ0NsaWVudFJlY3QgPT4ge1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdFsndG9wJ10sXG4gICAgbGVmdDogcmVjdFsnbGVmdCddLFxuICAgIHdpZHRoOiByZWN0Wyd3aWR0aCddLFxuICAgIGhlaWdodDogcmVjdFsnaGVpZ2h0J10sXG4gICAgYm90dG9tOiByZWN0Wydib3R0b20nXSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTdHlsZXNFbGVtZW50ID0gKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHNldChlbCwgYHN0eWxlLiR7a2V5fWAsIHN0eWxlc1trZXldKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Vmlld3BvcnQgPSAod2luOiBXaW5kb3cgPSB3aW5kb3cpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gPT4ge1xuICBjb25zdCBkb2MgPSB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgIGJvZHkgPSB3aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSxcbiAgICB3ID0gd2luLmlubmVyV2lkdGggfHwgZG9jLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgaCA9IHdpbi5pbm5lckhlaWdodCB8fCBkb2MuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0O1xuXG4gIHJldHVybiB7IHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDYXJldFBvc2l0aW9uID0gKGVsZW1lbnQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LmZvY3VzKCk7XG4gIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb24sIHBvc2l0aW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja1ZpZXdJblNjcmVlbiA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZWxlbWVudFNjcm9sbD86IEhUTUxFbGVtZW50LCBtYXhUb3BMZWZ0PzogeyB0b3A/OiBudW1iZXI7IGxlZnQ/OiBudW1iZXIgfSk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWNvbnRhaW5lciB8fCAhZWxlbWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJlY3RDb250YWluZXIgPSBjbG9uZUlCb3VuZGluZ0NsaWVudFJlY3QoY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICBpZiAoZWxlbWVudFNjcm9sbCkge1xuICAgIGNvbnN0IHJlY3RFbGVtZW50U2Nyb2xsID0gZWxlbWVudFNjcm9sbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJlY3RDb250YWluZXJbJ2xlZnQnXSA9IHJlY3RFbGVtZW50U2Nyb2xsLmxlZnQ7XG4gICAgcmVjdENvbnRhaW5lclsndG9wJ10gPSByZWN0RWxlbWVudFNjcm9sbC50b3A7XG4gIH1cblxuICBjb25zdCByZWN0RWxlbWVudCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSByZWN0RWxlbWVudDtcbiAgY29uc3QgdG9wQ29udGFpbmVyID0gcmVjdENvbnRhaW5lclsndG9wJ107XG4gIGNvbnN0IGxlZnRDb250YWluZXIgPSByZWN0Q29udGFpbmVyWydsZWZ0J107XG4gIGNvbnN0IHdpZHRoQ29udGFpbmVyID0gcmVjdENvbnRhaW5lclsnd2lkdGgnXTtcbiAgY29uc3QgaGVpZ2h0Q29udGFpbmVyID0gcmVjdENvbnRhaW5lclsnaGVpZ2h0J107XG4gIGNvbnN0IHNjcm9sbFRvcENvbnRhaW5lciA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gIGNvbnN0IHNjcm9sbExlZnRDb250YWluZXIgPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcbiAgY29uc3QgbGltaXRUb3AgPSB0b3BDb250YWluZXIgKyBzY3JvbGxUb3BDb250YWluZXIgKyBoZWlnaHRDb250YWluZXI7XG4gIGNvbnN0IGxpbWl0TGVmdCA9IGxlZnRDb250YWluZXIgKyBzY3JvbGxMZWZ0Q29udGFpbmVyICsgd2lkdGhDb250YWluZXI7XG5cbiAgY29uc3QgbWF4VG9wSXRlbSA9IHRvcCArIChtYXhUb3BMZWZ0Py50b3AgfHwgMCk7XG4gIGNvbnN0IG1heExlZnRJdGVtID0gbGVmdCArIChtYXhUb3BMZWZ0Py5sZWZ0IHx8IDApO1xuXG4gIGlmICh0b3BDb250YWluZXIgPD0gbWF4VG9wSXRlbSAmJiBtYXhUb3BJdGVtIDw9IGxpbWl0VG9wICYmIGxlZnRDb250YWluZXIgPD0gbWF4TGVmdEl0ZW0gJiYgbWF4TGVmdEl0ZW0gPD0gbGltaXRMZWZ0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciA9IChtb3VzZVBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCwgcmVjdD86IERPTVJlY3QpOiBib29sZWFuID0+IHtcbiAgaWYgKCFlbGVtZW50ICYmICFyZWN0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY3RFbGVtZW50ID0gcmVjdCB8fCBlbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCAoe30gYXMgRE9NUmVjdCk7XG4gIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0RWxlbWVudDtcbiAgY29uc3QgbGltaXRMZWZ0ID0gbGVmdCArIHdpZHRoO1xuICBjb25zdCBsaW1pdFRvcCA9IHRvcCArIGhlaWdodDtcbiAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBtb3VzZVBvc2l0aW9uO1xuICBpZiAobGVmdCA8PSBjbGllbnRYICYmIGNsaWVudFggPD0gbGltaXRMZWZ0ICYmIHRvcCA8PSBjbGllbnRZICYmIGNsaWVudFkgPD0gbGltaXRUb3ApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREcmFnRXZlbnRCeUVsZW1lbnQgPSAoY29uZmlnOiB7XG4gIGVsZW1lbnRNb3VzZURvd246IEhUTUxFbGVtZW50O1xuICBmdW5jdGlvbk1vdXNlRG93bj86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgaXNTdGFydFdpdGhNb3VzZURvd25FdmVudD86IGJvb2xlYW47XG4gIGVsZW1lbnRNb3VzZU1vdmU/OiBIVE1MRWxlbWVudDtcbiAgZnVuY3Rpb25Nb3VzZU1vdmU/OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIGVsZW1lbnRNb3VzZVVwPzogSFRNTEVsZW1lbnQ7XG4gIGZ1bmN0aW9uTW91c2VVcD86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgb25EZXN0cm95OiBTdWJqZWN0PGFueT47XG59KSA9PiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGNvbnN0IGFkZENsYXNzID0gKCkgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJyFzZWxlY3Qtbm9uZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCchY3Vyc29yLWdyYWJiaW5nJyk7XG4gICAgfSwgMjUwKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCchc2VsZWN0LW5vbmUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJyFjdXJzb3ItZ3JhYmJpbmcnKTtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xuICBmcm9tRXZlbnQoY29uZmlnLmVsZW1lbnRNb3VzZURvd24sICdtb3VzZWxlYXZlJylcbiAgICAucGlwZShcbiAgICAgIHRhcCgoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N1cnNvci1wb2ludGVyJykpLFxuICAgICAgdGFrZVVudGlsKGNvbmZpZy5vbkRlc3Ryb3kpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcbiAgZnJvbUV2ZW50KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2VlbnRlcicpXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdjdXJzb3ItcG9pbnRlcicpKSxcbiAgICAgIHRha2VVbnRpbChjb25maWcub25EZXN0cm95KVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgY29uc3QgbW91c2VEb3duID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2Vkb3duJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBhZGRDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VEb3duPy4oZSk7XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgbW91c2V1cCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb25maWcuZWxlbWVudE1vdXNlVXAgfHwgZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZW1vdmVDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VVcD8uKGUpO1xuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgbW91c2Vtb3ZlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VNb3ZlIHx8IGRvY3VtZW50LCAnbW91c2Vtb3ZlJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25maWcuZnVuY3Rpb25Nb3VzZU1vdmU/LihlKTtcbiAgICB9KSxcbiAgICB0YWtlVW50aWwobW91c2V1cClcbiAgKTtcblxuICByZXR1cm4gbW91c2VEb3duLnBpcGUoXG4gICAgbWVyZ2VNYXAoKGU6IE1vdXNlRXZlbnQpID0+IChjb25maWcuaXNTdGFydFdpdGhNb3VzZURvd25FdmVudCA/IG1vdXNlbW92ZS5waXBlKHN0YXJ0V2l0aChlKSkgOiBtb3VzZW1vdmUpKSxcbiAgICB0YWtlVW50aWwoY29uZmlnLm9uRGVzdHJveSksXG4gICAgZmluYWxpemUocmVtb3ZlQ2xhc3MpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SFRNTEZyb21RdWlsbCA9IGFzeW5jIChcbiAgZGF0YTogRGVsdGEgfCBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgZ2V0Um9vdEh0bWw/OiBib29sZWFuO1xuICAgIHJlcGxhY2VOZXdMaW5lVG8/OiBzdHJpbmc7XG4gICAgcmVwbGFjZVRhZ0JSVG8/OiBzdHJpbmc7XG4gICAgcmVwbGFjZUJyVG9EaXY/OiBib29sZWFuO1xuICAgIGZ1bmN0aW9uUmVwbGFjZURlbHRhPzogKG9wOiBEZWx0YSkgPT4gdm9pZDtcbiAgICByZXBsYWNlVGFncz86IHtcbiAgICAgIHRhZzogc3RyaW5nO1xuICAgICAgcmVwbGFjZVRvOiBzdHJpbmc7XG4gICAgfVtdO1xuICB9XG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHJlcGxhY2VOZXdMaW5lVG8gPSAnPGJyPicsIHJlcGxhY2VUYWdCUlRvLCByZXBsYWNlVGFncywgcmVwbGFjZUJyVG9EaXYgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGRlbHRhID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gYXdhaXQgZ2V0RGVsdGFGcm9tSFRNTChkYXRhKSA6IGRhdGE7XG4gIGlmIChvcHRpb25zPy5mdW5jdGlvblJlcGxhY2VEZWx0YSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25SZXBsYWNlRGVsdGEoZGVsdGEpO1xuICB9XG5cbiAgZGVsdGEub3BzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgaWYgKG9wLmluc2VydCkge1xuICAgICAgaWYgKHR5cGVvZiBvcC5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChyZXBsYWNlTmV3TGluZVRvKSB7XG4gICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UoL1xcbi9nLCByZXBsYWNlTmV3TGluZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVwbGFjZVRhZ0JSVG8pIHtcbiAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZSgvPGJyPi9nLCByZXBsYWNlVGFnQlJUbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVwbGFjZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHJlcGxhY2VUYWdzKSB7XG4gICAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZShuZXcgUmVnRXhwKGA8JHt0YWcudGFnfT5gLCAnZycpLCBgPCR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UobmV3IFJlZ0V4cChgPC8ke3RhZy50YWd9PmAsICdnJyksIGA8LyR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHF1aWxsLnNldENvbnRlbnRzKGRlbHRhKTtcbiAgbGV0IGh0bWxUZXh0ID0gb3B0aW9ucz8uZ2V0Um9vdEh0bWwgPyBxdWlsbC5yb290LmlubmVySFRNTCA6IHF1aWxsLnJvb3QuZmlyc3RFbGVtZW50Q2hpbGQ/LmlubmVySFRNTDtcbiAgaWYgKHJlcGxhY2VCclRvRGl2KSB7XG4gICAgaHRtbFRleHQgPSBjb252ZXJ0SHRtbFRvRGl2QmxvY2tzKGh0bWxUZXh0IHx8ICcnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlRXNjYXBlSHRtbChodG1sVGV4dCB8fCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEh0bWxUb0RpdkJsb2NrcyA9IChodG1sOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBCUkVBS19UT0tFTiA9ICc8PDxCUkVBSz4+Pic7XG4gIC8vIELGsOG7m2MgMTogdGhheSA8YnI+IHRow6BuaCB0b2tlbiB04bqhbVxuICBjb25zdCBub3JtYWxpemVkSHRtbCA9IGh0bWwucmVwbGFjZSgvPGJyXFxzKlxcLz8+L2dpLCBCUkVBS19UT0tFTik7XG5cbiAgLy8gQsaw4bubYyAyOiB0w6FjaCB0aGVvIHRva2VuXG4gIGNvbnN0IHBhcnRzID0gbm9ybWFsaXplZEh0bWwuc3BsaXQoQlJFQUtfVE9LRU4pO1xuXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgZGl2czogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBwYXJ0cykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgY29udGludWU7XG5cbiAgICAvLyBwYXJzZSBt4buXaSBwaOG6p24gbmjhu48gbmjGsCBt4buZdCBkb2N1bWVudCByacOqbmdcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRyaW1tZWQsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBib2R5ID0gZG9jLmJvZHk7XG5cbiAgICAvLyBM4bqleSBs4bqhaSBu4buZaSBkdW5nIGLDqm4gdHJvbmcgYm9keVxuICAgIGRpdnMucHVzaChgPGRpdj4ke2JvZHkuaW5uZXJIVE1MfTwvZGl2PmApO1xuICB9XG5cbiAgcmV0dXJuIGRpdnMuam9pbignJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVsdGFGcm9tSFRNTCA9IGFzeW5jIChodG1sOiBzdHJpbmcpOiBQcm9taXNlPERlbHRhPiA9PiB7XG4gIHF1aWxsLnJvb3QuaW5uZXJIVE1MID0gaHRtbDtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc29sZS5sb2cocXVpbGwuZ2V0Q29udGVudHMoKSk7XG4gIH0sIDEwMDApO1xuXG4gIGF3YWl0IGxhc3RWYWx1ZUZyb20odGltZXIoMTAwMCkpO1xuICByZXR1cm4gcXVpbGwuZ2V0Q29udGVudHMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFzdGVEYXRhID0gYXN5bmMgKFxuICBlOiBDbGlwYm9hcmRFdmVudCxcbiAgY29uZmlnOiB7XG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlclBhc3RlRmlsZT86IChmaWxlczogRmlsZUxpc3QpID0+IHZvaWQ7XG4gICAgY2FsbEJhY2s/OiAocG9zaXRvblJldHVybjogJ2ZpbGUnIHwgJ3JhbmdlJyB8ICdjb250ZW50JyB8ICduby1jb250ZW50JykgPT4gdm9pZDtcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBjb25maWcuZWxlbWVudDtcbiAgY29uc3QgZmlsZXMgPSBlLmNsaXBib2FyZERhdGE/LmZpbGVzO1xuICBpZiAoZmlsZXM/Lmxlbmd0aCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25maWcuaGFuZGxlclBhc3RlRmlsZT8uKGZpbGVzKTtcbiAgICBjb25maWcuY2FsbEJhY2s/LignZmlsZScpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBMxrB1IHNlbGVjdGlvbiBUUsav4buaQyBraGkgcHJldmVudCBkZWZhdWx0XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgbGV0IHNhdmVkUmFuZ2U6IFJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAvLyBDaOG7iSBsxrB1IG7hur91IHJhbmdlIG7hurFtIHRyb25nIGNvbnRlbnRUZXh0IGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICBjb25zdCBpc0luQ29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNvbnRhaW5zKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcik7XG4gICAgaWYgKGlzSW5Db250ZW50RWxlbWVudCkge1xuICAgICAgc2F2ZWRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgLy8gUHJldmVudCBkZWZhdWx0IMSR4buDIHThu7EgeOG7rSBsw70gcGFzdGVcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBT4butIGThu6VuZyBRdWlsbCDEkeG7gyBjbGVhbiBIVE1MIGNvbnRlbnRcbiAgY29uc3QgaHRtbENvbnRlbnQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpIHx8ICcnO1xuICBjb25zdCBwbGFpblRleHQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvcGxhaW4nKSB8fCAnJztcbiAgbGV0IGNvbnRlbnRUb0luc2VydCA9IChwbGFpblRleHQgfHwgJycpLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICBpZiAoaHRtbENvbnRlbnQpIHtcbiAgICBjb250ZW50VG9JbnNlcnQgPSBhd2FpdCBnZXRIVE1MRnJvbVF1aWxsKGh0bWxDb250ZW50KTtcbiAgfVxuXG4gIGlmICghY29udGVudFRvSW5zZXJ0KSB7XG4gICAgY29uZmlnLmNhbGxCYWNrPy4oJ25vLWNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2F2ZWRSYW5nZSkge1xuICAgIGluc2VydENvbnRlbnRXaXRoUmFuZ2UoY29udGVudFRvSW5zZXJ0LCBzYXZlZFJhbmdlLCBlbGVtZW50KTtcbiAgICBjb25maWcuY2FsbEJhY2s/LigncmFuZ2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudFRvSW5zZXJ0O1xuICBjb25maWcuY2FsbEJhY2s/LignY29udGVudCcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydENvbnRlbnRXaXRoUmFuZ2UgPSAoY29udGVudDogc3RyaW5nLCBzYXZlZFJhbmdlOiBSYW5nZSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoIXNlbGVjdGlvbikge1xuICAgIC8vIEZhbGxiYWNrOiBhcHBlbmQgdsOgbyBjdeG7kWlcbiAgICBlbGVtZW50LmlubmVySFRNTCArPSBjb250ZW50O1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBSZXN0b3JlIHNlbGVjdGlvblxuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbiAgLy8gWMOzYSBu4buZaSBkdW5nIMSRw6Mgc2VsZWN0IChu4bq/dSBjw7MpXG4gIHNhdmVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgLy8gVOG6oW8gZG9jdW1lbnQgZnJhZ21lbnQgdOG7qyBIVE1MIGNvbnRlbnRcbiAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0ZW1wRGl2LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcbiAgfVxuICAvLyBJbnNlcnQgZnJhZ21lbnQgdOG6oWkgduG7iyB0csOtIHJhbmdlXG4gIHNhdmVkUmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7XG4gIC8vIERpIGNodXnhu4NuIGN1cnNvciDEkeG6v24gY3Xhu5FpIG7hu5lpIGR1bmcgduG7q2EgaW5zZXJ0XG4gIGlmIChmcmFnbWVudC5sYXN0Q2hpbGQpIHtcbiAgICBzYXZlZFJhbmdlLnNldFN0YXJ0QWZ0ZXIoZnJhZ21lbnQubGFzdENoaWxkKTtcbiAgfVxuICBzYXZlZFJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { convertBase64ToBlob } from './base64';
|
|
2
|
+
export const downloadFileByUrlUseXmlRequest = (fileUrl, filename) => {
|
|
3
|
+
const xmlRequest = new XMLHttpRequest();
|
|
4
|
+
xmlRequest.open('GET', fileUrl, true);
|
|
5
|
+
xmlRequest.responseType = 'blob';
|
|
6
|
+
xmlRequest.onerror = () => {
|
|
7
|
+
const url = window.URL.createObjectURL(xmlRequest.response);
|
|
8
|
+
downloadFileByUrl(url, filename);
|
|
9
|
+
};
|
|
10
|
+
xmlRequest.onload = () => {
|
|
11
|
+
const url = window.URL.createObjectURL(xmlRequest.response);
|
|
12
|
+
downloadFileByUrl(url, filename);
|
|
13
|
+
};
|
|
14
|
+
xmlRequest.send();
|
|
15
|
+
};
|
|
16
|
+
export const downloadFileByUrl = async (fileUrl, filename, onlyOpen) => {
|
|
17
|
+
const downloadFileElement = document.createElement('a');
|
|
18
|
+
if (!onlyOpen) {
|
|
19
|
+
const response = await fetch(fileUrl);
|
|
20
|
+
if (response.ok) {
|
|
21
|
+
const blob = await response.blob();
|
|
22
|
+
fileUrl = URL.createObjectURL(blob);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
downloadFileElement.href = fileUrl;
|
|
26
|
+
downloadFileElement.download = filename;
|
|
27
|
+
downloadFileElement.target = '_blank';
|
|
28
|
+
downloadFileElement.click();
|
|
29
|
+
downloadFileElement.remove();
|
|
30
|
+
};
|
|
31
|
+
export const downloadImageFromELement = (imageElement, typeFileDownload, nameFile) => {
|
|
32
|
+
const parentElement = imageElement?.src;
|
|
33
|
+
const blobData = convertBase64ToBlob(parentElement);
|
|
34
|
+
const blob = new Blob([blobData], { type: typeFileDownload || 'image/png' });
|
|
35
|
+
const url = window.URL.createObjectURL(blob);
|
|
36
|
+
const link = document.createElement('a');
|
|
37
|
+
link.href = url;
|
|
38
|
+
link.download = nameFile || 'barcode';
|
|
39
|
+
link.click();
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9kb3dubG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO0lBQ2xGLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFeEMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVELGlCQUFpQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFDRixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLFFBQWtCLEVBQUUsRUFBRTtJQUMvRixNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ25DLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDeEMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFlBQThCLEVBQUUsZ0JBQXlCLEVBQUUsUUFBaUIsRUFBRSxFQUFFO0lBQ3ZILE1BQU0sYUFBYSxHQUFHLFlBQVksRUFBRSxHQUFHLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksU0FBUyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnZlcnRCYXNlNjRUb0Jsb2IgfSBmcm9tICcuL2Jhc2U2NCc7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVCeVVybFVzZVhtbFJlcXVlc3QgPSAoZmlsZVVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHhtbFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICB4bWxSZXF1ZXN0Lm9wZW4oJ0dFVCcsIGZpbGVVcmwsIHRydWUpO1xuICB4bWxSZXF1ZXN0LnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgeG1sUmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHhtbFJlcXVlc3QucmVzcG9uc2UpO1xuXG4gICAgZG93bmxvYWRGaWxlQnlVcmwodXJsLCBmaWxlbmFtZSk7XG4gIH07XG4gIHhtbFJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHhtbFJlcXVlc3QucmVzcG9uc2UpO1xuXG4gICAgZG93bmxvYWRGaWxlQnlVcmwodXJsLCBmaWxlbmFtZSk7XG4gIH07XG4gIHhtbFJlcXVlc3Quc2VuZCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkRmlsZUJ5VXJsID0gYXN5bmMgKGZpbGVVcmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgb25seU9wZW4/OiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IGRvd25sb2FkRmlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgaWYgKCFvbmx5T3Blbikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmlsZVVybCk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG5cbiAgICAgIGZpbGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIH1cbiAgfVxuICBkb3dubG9hZEZpbGVFbGVtZW50LmhyZWYgPSBmaWxlVXJsO1xuICBkb3dubG9hZEZpbGVFbGVtZW50LmRvd25sb2FkID0gZmlsZW5hbWU7XG4gIGRvd25sb2FkRmlsZUVsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gIGRvd25sb2FkRmlsZUVsZW1lbnQuY2xpY2soKTtcbiAgZG93bmxvYWRGaWxlRWxlbWVudC5yZW1vdmUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEltYWdlRnJvbUVMZW1lbnQgPSAoaW1hZ2VFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50LCB0eXBlRmlsZURvd25sb2FkPzogc3RyaW5nLCBuYW1lRmlsZT86IHN0cmluZykgPT4ge1xuICBjb25zdCBwYXJlbnRFbGVtZW50ID0gaW1hZ2VFbGVtZW50Py5zcmM7XG4gIGNvbnN0IGJsb2JEYXRhID0gY29udmVydEJhc2U2NFRvQmxvYihwYXJlbnRFbGVtZW50KTtcbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtibG9iRGF0YV0sIHsgdHlwZTogdHlwZUZpbGVEb3dubG9hZCB8fCAnaW1hZ2UvcG5nJyB9KTtcbiAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgbGluay5ocmVmID0gdXJsO1xuICBsaW5rLmRvd25sb2FkID0gbmFtZUZpbGUgfHwgJ2JhcmNvZGUnO1xuICBsaW5rLmNsaWNrKCk7XG59O1xuIl19
|