@windwalker-io/unicorn-next 0.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/.editorconfig +18 -0
- package/.gulp.json +7 -0
- package/bin/release.mjs +47 -0
- package/dist/chunks/_arrayPush.js +168 -0
- package/dist/chunks/_arrayPush.js.map +1 -0
- package/dist/chunks/_baseRest.js +73 -0
- package/dist/chunks/_baseRest.js.map +1 -0
- package/dist/chunks/_commonjsHelpers.js +7 -0
- package/dist/chunks/_commonjsHelpers.js.map +1 -0
- package/dist/chunks/_getPrototype.js +130 -0
- package/dist/chunks/_getPrototype.js.map +1 -0
- package/dist/chunks/button-radio.js +147 -0
- package/dist/chunks/button-radio.js.map +1 -0
- package/dist/chunks/checkboxes-multi-select.js +44 -0
- package/dist/chunks/checkboxes-multi-select.js.map +1 -0
- package/dist/chunks/cloneDeep.js +287 -0
- package/dist/chunks/cloneDeep.js.map +1 -0
- package/dist/chunks/cropper.min.js +5 -0
- package/dist/chunks/cropper.min.js.map +1 -0
- package/dist/chunks/field-cascade-select.js +256 -0
- package/dist/chunks/field-cascade-select.js.map +1 -0
- package/dist/chunks/field-file-drag.js +218 -0
- package/dist/chunks/field-file-drag.js.map +1 -0
- package/dist/chunks/field-flatpickr.js +893 -0
- package/dist/chunks/field-flatpickr.js.map +1 -0
- package/dist/chunks/field-modal-select.js +403 -0
- package/dist/chunks/field-modal-select.js.map +1 -0
- package/dist/chunks/field-modal-tree.js +790 -0
- package/dist/chunks/field-modal-tree.js.map +1 -0
- package/dist/chunks/field-multi-uploader.js +256 -0
- package/dist/chunks/field-multi-uploader.js.map +1 -0
- package/dist/chunks/field-repeatable.js +132 -0
- package/dist/chunks/field-repeatable.js.map +1 -0
- package/dist/chunks/field-single-image-drag.js +338 -0
- package/dist/chunks/field-single-image-drag.js.map +1 -0
- package/dist/chunks/form.js +154 -0
- package/dist/chunks/form.js.map +1 -0
- package/dist/chunks/grid.js +345 -0
- package/dist/chunks/grid.js.map +1 -0
- package/dist/chunks/http-client.js +229 -0
- package/dist/chunks/http-client.js.map +1 -0
- package/dist/chunks/iframe-modal.js +124 -0
- package/dist/chunks/iframe-modal.js.map +1 -0
- package/dist/chunks/index.js +309 -0
- package/dist/chunks/index.js.map +1 -0
- package/dist/chunks/isArguments.js +146 -0
- package/dist/chunks/isArguments.js.map +1 -0
- package/dist/chunks/keep-tab.js +101 -0
- package/dist/chunks/keep-tab.js.map +1 -0
- package/dist/chunks/legacy.js +210 -0
- package/dist/chunks/legacy.js.map +1 -0
- package/dist/chunks/list-dependent.js +231 -0
- package/dist/chunks/list-dependent.js.map +1 -0
- package/dist/chunks/s3-multipart-uploader.js +172 -0
- package/dist/chunks/s3-multipart-uploader.js.map +1 -0
- package/dist/chunks/s3-uploader.js +136 -0
- package/dist/chunks/s3-uploader.js.map +1 -0
- package/dist/chunks/show-on.js +237 -0
- package/dist/chunks/show-on.js.map +1 -0
- package/dist/chunks/tinymce.js +196 -0
- package/dist/chunks/tinymce.js.map +1 -0
- package/dist/chunks/ui-bootstrap5.js +71 -0
- package/dist/chunks/ui-bootstrap5.js.map +1 -0
- package/dist/chunks/unicorn.js +2202 -0
- package/dist/chunks/unicorn.js.map +1 -0
- package/dist/chunks/validation.js +854 -0
- package/dist/chunks/validation.js.map +1 -0
- package/dist/editor.css +1 -0
- package/dist/index.d.ts +1427 -0
- package/dist/multi-level-menu.css +1 -0
- package/dist/switcher.css +1 -0
- package/dist/unicorn-next.css +12 -0
- package/dist/unicorn.js +125 -0
- package/dist/unicorn.js.map +1 -0
- package/fusionfile.mjs +155 -0
- package/images/ajax-loader.gif +0 -0
- package/images/placeholder/avatar.png +0 -0
- package/images/placeholder/image-16x10.png +0 -0
- package/images/placeholder/image-16x9.png +0 -0
- package/images/placeholder/image-1x1.png +0 -0
- package/images/placeholder/image-4x3.png +0 -0
- package/package.json +102 -0
- package/scss/bootstrap/multi-level-menu.scss +121 -0
- package/scss/editor.scss +116 -0
- package/scss/field/file-drag.scss +102 -0
- package/scss/field/single-image-drag.scss +88 -0
- package/scss/field/vue-drag-uploader.scss +160 -0
- package/scss/switcher.scss +156 -0
- package/src/app.ts +128 -0
- package/src/bootstrap/button-radio.ts +208 -0
- package/src/bootstrap/keep-tab.ts +155 -0
- package/src/composable/index.ts +21 -0
- package/src/composable/useCheckboxesMultiSelect.ts +22 -0
- package/src/composable/useFieldCascadeSelect.ts +9 -0
- package/src/composable/useFieldFileDrag.ts +9 -0
- package/src/composable/useFieldFlatpickr.ts +3 -0
- package/src/composable/useFieldModalSelect.ts +6 -0
- package/src/composable/useFieldModalTree.ts +3 -0
- package/src/composable/useFieldMultiUploader.ts +3 -0
- package/src/composable/useFieldRepeatable.ts +9 -0
- package/src/composable/useFieldSingleImageDrag.ts +5 -0
- package/src/composable/useForm.ts +43 -0
- package/src/composable/useGrid.ts +57 -0
- package/src/composable/useHttp.ts +8 -0
- package/src/composable/useIframeModal.ts +9 -0
- package/src/composable/useListDependent.ts +26 -0
- package/src/composable/useQueue.ts +13 -0
- package/src/composable/useS3Uploader.ts +32 -0
- package/src/composable/useShowOn.ts +9 -0
- package/src/composable/useStack.ts +13 -0
- package/src/composable/useTinymce.ts +29 -0
- package/src/composable/useTomSelect.ts +72 -0
- package/src/composable/useUIBootstrap5.ts +48 -0
- package/src/composable/useUniDirective.ts +32 -0
- package/src/composable/useValidation.ts +39 -0
- package/src/data.ts +36 -0
- package/src/events.ts +73 -0
- package/src/legacy/legacy.ts +186 -0
- package/src/legacy/loader.ts +125 -0
- package/src/module/checkboxes-multi-select.ts +54 -0
- package/src/module/field-cascade-select.ts +292 -0
- package/src/module/field-file-drag.ts +292 -0
- package/src/module/field-flatpickr.ts +127 -0
- package/src/module/field-modal-select.ts +174 -0
- package/src/module/field-modal-tree.ts +27 -0
- package/src/module/field-multi-uploader.ts +361 -0
- package/src/module/field-repeatable.ts +202 -0
- package/src/module/field-single-image-drag.ts +468 -0
- package/src/module/form.ts +223 -0
- package/src/module/grid.ts +465 -0
- package/src/module/http-client.ts +243 -0
- package/src/module/iframe-modal.ts +167 -0
- package/src/module/list-dependent.ts +321 -0
- package/src/module/s3-multipart-uploader.ts +300 -0
- package/src/module/s3-uploader.ts +234 -0
- package/src/module/show-on.ts +173 -0
- package/src/module/tinymce.ts +263 -0
- package/src/module/ui-bootstrap5.ts +107 -0
- package/src/module/validation.ts +1019 -0
- package/src/plugin/index.ts +1 -0
- package/src/plugin/php-adapter.ts +65 -0
- package/src/polyfill/form-request-submit.ts +31 -0
- package/src/polyfill/index.ts +9 -0
- package/src/service/animate.ts +58 -0
- package/src/service/crypto.ts +27 -0
- package/src/service/dom-watcher.ts +62 -0
- package/src/service/dom.ts +265 -0
- package/src/service/helper.ts +48 -0
- package/src/service/index.ts +10 -0
- package/src/service/lang.ts +122 -0
- package/src/service/loader.ts +152 -0
- package/src/service/router.ts +118 -0
- package/src/service/ui.ts +497 -0
- package/src/service/uri.ts +106 -0
- package/src/types/base.ts +9 -0
- package/src/types/index.ts +4 -0
- package/src/types/modal-tree.ts +12 -0
- package/src/types/plugin.ts +6 -0
- package/src/types/shims.d.ts +18 -0
- package/src/types/ui.ts +6 -0
- package/src/unicorn.ts +63 -0
- package/src/utilities/arr.ts +25 -0
- package/src/utilities/base.ts +9 -0
- package/src/utilities/data.ts +48 -0
- package/src/utilities/index.ts +5 -0
- package/src/utilities/tree.ts +20 -0
- package/src/vue/components/ModalTree/ModalTreeApp.vue +175 -0
- package/src/vue/components/ModalTree/TreeItem.vue +262 -0
- package/src/vue/components/ModalTree/TreeModal.vue +225 -0
- package/tests/test.js +4 -0
- package/tsconfig.js.json +25 -0
- package/tsconfig.json +17 -0
- package/vite.assets.config.ts +61 -0
- package/vite.config.test.ts +36 -0
- package/vite.config.ts +112 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { a5 as mergeDeep, m as useStack, u as useHttpClient, a8 as useImport } from "./unicorn.js";
|
|
2
|
+
const instances = {};
|
|
3
|
+
let hooks = [];
|
|
4
|
+
let imported = false;
|
|
5
|
+
async function get(selector, options = {}) {
|
|
6
|
+
const tinymce2 = await loadTinymce();
|
|
7
|
+
return instances[selector] ??= new TinymceController(tinymce2, document.querySelector(selector), options);
|
|
8
|
+
}
|
|
9
|
+
function destroy(selector) {
|
|
10
|
+
delete instances[selector];
|
|
11
|
+
}
|
|
12
|
+
function addHook(handler) {
|
|
13
|
+
hooks.push(handler);
|
|
14
|
+
}
|
|
15
|
+
function clearHooks() {
|
|
16
|
+
hooks = [];
|
|
17
|
+
}
|
|
18
|
+
async function loadTinymce() {
|
|
19
|
+
await useImport("@tinymce");
|
|
20
|
+
if (imported) {
|
|
21
|
+
return tinymce;
|
|
22
|
+
}
|
|
23
|
+
imported = true;
|
|
24
|
+
for (const hook of hooks) {
|
|
25
|
+
hook(tinymce);
|
|
26
|
+
}
|
|
27
|
+
await registerDragPlugin(tinymce);
|
|
28
|
+
return tinymce;
|
|
29
|
+
}
|
|
30
|
+
const defaultOptions = {};
|
|
31
|
+
class TinymceController {
|
|
32
|
+
constructor(tinymce2, element, options) {
|
|
33
|
+
this.tinymce = tinymce2;
|
|
34
|
+
this.element = element;
|
|
35
|
+
options.target = element;
|
|
36
|
+
this.options = mergeDeep(
|
|
37
|
+
{
|
|
38
|
+
unicorn: {
|
|
39
|
+
stack_name: "uploading"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultOptions,
|
|
43
|
+
this.prepareOptions(options, tinymce2.majorVersion)
|
|
44
|
+
);
|
|
45
|
+
tinymce2.EditorManager.init(this.options).then((editor) => {
|
|
46
|
+
this.editor = editor[0];
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
editor;
|
|
50
|
+
options = {};
|
|
51
|
+
prepareOptions(options, version = "6") {
|
|
52
|
+
const defaults = {};
|
|
53
|
+
if (options.images_upload_url) {
|
|
54
|
+
defaults.paste_data_images = true;
|
|
55
|
+
defaults.remove_script_host = false;
|
|
56
|
+
defaults.relative_urls = false;
|
|
57
|
+
if (Number(version) >= 6) {
|
|
58
|
+
defaults.images_upload_handler = (blobInfo, progress) => this.imageUploadHandler(blobInfo, progress);
|
|
59
|
+
} else {
|
|
60
|
+
options.plugins.push("paste");
|
|
61
|
+
defaults.images_upload_handler = (blobInfo, success, failure, progress) => this.imageUploadHandler(blobInfo, progress).then((url) => {
|
|
62
|
+
success(url);
|
|
63
|
+
return url;
|
|
64
|
+
}).catch((e) => {
|
|
65
|
+
failure(e.message, { remove: true });
|
|
66
|
+
throw e;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
defaults.plugins = defaults.plugins || [];
|
|
71
|
+
defaults.setup = (editor) => {
|
|
72
|
+
editor.on("change", () => {
|
|
73
|
+
this.tinymce.triggerSave();
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
options = mergeDeep({}, defaults, options);
|
|
77
|
+
if (options.plugins.indexOf("unicorndragdrop") === -1) {
|
|
78
|
+
options.plugins.push("unicorndragdrop");
|
|
79
|
+
}
|
|
80
|
+
return options;
|
|
81
|
+
}
|
|
82
|
+
insert(text) {
|
|
83
|
+
this.editor?.insertContent(text);
|
|
84
|
+
}
|
|
85
|
+
getValue() {
|
|
86
|
+
return this.editor?.getContent() ?? "";
|
|
87
|
+
}
|
|
88
|
+
setValue(text) {
|
|
89
|
+
this.editor?.setContent(text);
|
|
90
|
+
}
|
|
91
|
+
// filePickerCallback(callback, value, meta) {
|
|
92
|
+
// const input = document.createElement('input');
|
|
93
|
+
// input.setAttribute('type', 'file');
|
|
94
|
+
// input.style.display = 'none';
|
|
95
|
+
//
|
|
96
|
+
// if (meta.filetype === 'image') {
|
|
97
|
+
// input.setAttribute('accept', `image/\*`);
|
|
98
|
+
// }
|
|
99
|
+
//
|
|
100
|
+
// document.body.appendChild(input);
|
|
101
|
+
//
|
|
102
|
+
// input.onchange = function () {
|
|
103
|
+
// const file = this.files[0];
|
|
104
|
+
//
|
|
105
|
+
// const reader = new FileReader();
|
|
106
|
+
// reader.onload = function () {
|
|
107
|
+
// const id = 'blobid' + (new Date()).getTime();
|
|
108
|
+
// const blobCache = tinymce.activeEditor.editorUpload.blobCache;
|
|
109
|
+
// const base64 = reader.result.split(',')[1];
|
|
110
|
+
// const blobInfo = blobCache.create(id, file, base64);
|
|
111
|
+
// blobCache.add(blobInfo);
|
|
112
|
+
//
|
|
113
|
+
// /* call the callback and populate the Title field with the file name */
|
|
114
|
+
// callback(blobInfo.blobUri(), { title: file.name, text: file.name });
|
|
115
|
+
// };
|
|
116
|
+
// reader.readAsDataURL(file);
|
|
117
|
+
// input.remove();
|
|
118
|
+
// };
|
|
119
|
+
//
|
|
120
|
+
// input.click();
|
|
121
|
+
// }
|
|
122
|
+
async imageUploadHandler(blobInfo, progress) {
|
|
123
|
+
const element = this.element;
|
|
124
|
+
element.dispatchEvent(new CustomEvent("upload-start"));
|
|
125
|
+
const formData = new FormData();
|
|
126
|
+
formData.append("file", blobInfo.blob(), blobInfo.filename());
|
|
127
|
+
const stack = useStack(this.options.unicorn.stack_name);
|
|
128
|
+
stack.push(true);
|
|
129
|
+
const { post, isAxiosError } = await useHttpClient();
|
|
130
|
+
try {
|
|
131
|
+
let res = await post(
|
|
132
|
+
this.options.images_upload_url,
|
|
133
|
+
formData,
|
|
134
|
+
{
|
|
135
|
+
withCredentials: false,
|
|
136
|
+
onUploadProgress: (e) => {
|
|
137
|
+
progress(e.loaded / e.total * 100);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
element.dispatchEvent(new CustomEvent("upload-success"));
|
|
142
|
+
return res.data.data.url;
|
|
143
|
+
} catch (err) {
|
|
144
|
+
if (isAxiosError(err)) {
|
|
145
|
+
const message = err?.response?.data?.message || err.message;
|
|
146
|
+
console.error(err?.response?.data?.message || err.message, err);
|
|
147
|
+
element.dispatchEvent(new CustomEvent("upload-error", { detail: err }));
|
|
148
|
+
return Promise.reject({ message, remove: true });
|
|
149
|
+
}
|
|
150
|
+
throw err;
|
|
151
|
+
} finally {
|
|
152
|
+
element.dispatchEvent(new CustomEvent("upload-complete"));
|
|
153
|
+
stack.pop();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function registerDragPlugin(tinymce2) {
|
|
158
|
+
tinymce2.PluginManager.add("unicorndragdrop", function(editor) {
|
|
159
|
+
tinymce2.DOM.bind(document, "dragleave", function(e) {
|
|
160
|
+
e.stopPropagation();
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
if (tinymce2.activeEditor) {
|
|
163
|
+
tinymce2.activeEditor.contentAreaContainer.style.transition = "all .3s";
|
|
164
|
+
tinymce2.activeEditor.contentAreaContainer.style.borderWidth = "";
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
});
|
|
168
|
+
if (typeof FormData !== "undefined") {
|
|
169
|
+
editor.on("dragenter", (e) => {
|
|
170
|
+
e.stopPropagation();
|
|
171
|
+
return false;
|
|
172
|
+
});
|
|
173
|
+
editor.on("dragover", (e) => {
|
|
174
|
+
e.preventDefault();
|
|
175
|
+
if (tinymce2.activeEditor) {
|
|
176
|
+
tinymce2.activeEditor.contentAreaContainer.style.transition = "all .3s";
|
|
177
|
+
tinymce2.activeEditor.contentAreaContainer.style.border = "3px dashed rgba(0, 0, 0, .35)";
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
});
|
|
181
|
+
editor.on("drop", (e) => {
|
|
182
|
+
editor.contentAreaContainer.style.borderWidth = "";
|
|
183
|
+
editor.contentAreaContainer.style.borderWidth = "";
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
return Promise.resolve();
|
|
188
|
+
}
|
|
189
|
+
export {
|
|
190
|
+
TinymceController,
|
|
191
|
+
addHook,
|
|
192
|
+
clearHooks,
|
|
193
|
+
destroy,
|
|
194
|
+
get
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=tinymce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinymce.js","sources":["../../src/module/tinymce.ts"],"sourcesContent":["import type { Editor, EditorOptions, TinyMCE } from 'tinymce';\r\nimport { useHttpClient, useStack } from '../composable';\r\nimport { useImport } from '../service';\r\nimport { Dictionary, MaybePromise } from '../types';\r\nimport { mergeDeep } from '../utilities';\r\n\r\nconst instances: Dictionary<TinymceController> = {};\r\nlet hooks: ((tinymce: TinyMCE) => MaybePromise<any>)[] = [];\r\n\r\nlet imported = false;\r\n\r\ndeclare type UploadHandlerParams = Parameters<NonNullable<EditorOptions['images_upload_handler']>>;\r\n\r\nexport async function get(\r\n selector: string,\r\n options: Record<string, any> = {}\r\n): Promise<TinymceController> {\r\n const tinymce = await loadTinymce();\r\n\r\n return instances[selector] ??= new TinymceController(tinymce, document.querySelector(selector)!, options);\r\n}\r\n\r\nexport function destroy(selector: string): void {\r\n delete instances[selector];\r\n}\r\n\r\nexport function addHook(handler: ((tinymce: TinyMCE) => MaybePromise<any>)) {\r\n hooks.push(handler);\r\n}\r\n\r\nexport function clearHooks() {\r\n hooks = [];\r\n}\r\n\r\nasync function loadTinymce(): Promise<TinyMCE> {\r\n await useImport('@tinymce');\r\n\r\n if (imported) {\r\n return tinymce;\r\n }\r\n imported = true;\r\n for (const hook of hooks) {\r\n hook(tinymce);\r\n }\r\n await registerDragPlugin(tinymce);\r\n return tinymce;\r\n}\r\n\r\nconst defaultOptions: Record<string, any> = {};\r\n\r\nexport class TinymceController {\r\n editor?: Editor;\r\n options: Record<string, any> = {};\r\n\r\n constructor(protected tinymce: TinyMCE, public element: HTMLElement, options: Record<string, any>) {\r\n options.target = element;\r\n\r\n this.options = mergeDeep(\r\n {\r\n unicorn: {\r\n stack_name: 'uploading'\r\n }\r\n },\r\n defaultOptions,\r\n this.prepareOptions(options, tinymce.majorVersion),\r\n );\r\n\r\n tinymce.EditorManager.init(this.options).then((editor) => {\r\n this.editor = editor[0];\r\n });\r\n }\r\n\r\n prepareOptions(options: Record<string, any>, version = '6') {\r\n const defaults: Partial<EditorOptions> = {};\r\n\r\n if (options.images_upload_url) {\r\n defaults.paste_data_images = true;\r\n defaults.remove_script_host = false;\r\n defaults.relative_urls = false;\r\n\r\n if (Number(version) >= 6) {\r\n defaults.images_upload_handler = (blobInfo, progress) =>\r\n this.imageUploadHandler(blobInfo, progress);\r\n } else {\r\n options.plugins.push('paste');\r\n\r\n // @ts-ignore\r\n defaults.images_upload_handler = (blobInfo, success, failure, progress) =>\r\n this.imageUploadHandler(blobInfo, progress)\r\n .then((url) => {\r\n success(url);\r\n return url;\r\n })\r\n .catch((e) => {\r\n failure(e.message, { remove: true });\r\n throw e;\r\n });\r\n }\r\n }\r\n\r\n // defaults.file_picker_callback = (...args) => this.filePickerCallback(...args);\r\n\r\n defaults.plugins = defaults.plugins || [];\r\n\r\n defaults.setup = (editor) => {\r\n editor.on('change', () => {\r\n this.tinymce.triggerSave();\r\n });\r\n };\r\n\r\n options = mergeDeep({}, defaults, options);\r\n\r\n if (options.plugins.indexOf('unicorndragdrop') === -1) {\r\n options.plugins.push('unicorndragdrop');\r\n }\r\n\r\n return options;\r\n }\r\n\r\n insert(text: string) {\r\n this.editor?.insertContent(text);\r\n }\r\n\r\n getValue(): string {\r\n return this.editor?.getContent() ?? '';\r\n }\r\n\r\n setValue(text: string): void {\r\n this.editor?.setContent(text);\r\n }\r\n\r\n // filePickerCallback(callback, value, meta) {\r\n // const input = document.createElement('input');\r\n // input.setAttribute('type', 'file');\r\n // input.style.display = 'none';\r\n //\r\n // if (meta.filetype === 'image') {\r\n // input.setAttribute('accept', `image/\\*`);\r\n // }\r\n //\r\n // document.body.appendChild(input);\r\n //\r\n // input.onchange = function () {\r\n // const file = this.files[0];\r\n //\r\n // const reader = new FileReader();\r\n // reader.onload = function () {\r\n // const id = 'blobid' + (new Date()).getTime();\r\n // const blobCache = tinymce.activeEditor.editorUpload.blobCache;\r\n // const base64 = reader.result.split(',')[1];\r\n // const blobInfo = blobCache.create(id, file, base64);\r\n // blobCache.add(blobInfo);\r\n //\r\n // /* call the callback and populate the Title field with the file name */\r\n // callback(blobInfo.blobUri(), { title: file.name, text: file.name });\r\n // };\r\n // reader.readAsDataURL(file);\r\n // input.remove();\r\n // };\r\n //\r\n // input.click();\r\n // }\r\n\r\n async imageUploadHandler(blobInfo: UploadHandlerParams[0], progress: UploadHandlerParams[1]) {\r\n const element = this.element;\r\n\r\n element.dispatchEvent(new CustomEvent('upload-start'));\r\n\r\n const formData = new FormData();\r\n formData.append('file', blobInfo.blob(), blobInfo.filename());\r\n\r\n const stack = useStack(this.options.unicorn.stack_name);\r\n stack.push(true);\r\n\r\n const { post, isAxiosError } = await useHttpClient();\r\n\r\n try {\r\n let res = await post(\r\n this.options.images_upload_url,\r\n formData,\r\n {\r\n withCredentials: false,\r\n onUploadProgress: (e) => {\r\n progress(e.loaded / e.total! * 100);\r\n }\r\n }\r\n );\r\n element.dispatchEvent(new CustomEvent('upload-success'));\r\n\r\n return res.data.data.url;\r\n } catch (err) {\r\n if (isAxiosError(err)) {\r\n const message = err?.response?.data?.message || err.message;\r\n console.error(err?.response?.data?.message || err.message, err);\r\n element.dispatchEvent(new CustomEvent('upload-error', { detail: err }));\r\n\r\n return Promise.reject({ message, remove: true });\r\n }\r\n\r\n throw err;\r\n } finally {\r\n element.dispatchEvent(new CustomEvent('upload-complete'));\r\n stack.pop();\r\n }\r\n }\r\n}\r\n\r\nfunction registerDragPlugin(tinymce: TinyMCE) {\r\n tinymce.PluginManager.add('unicorndragdrop', function (editor) {\r\n // Reset the drop area border\r\n tinymce.DOM.bind(document, 'dragleave', function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n if (tinymce.activeEditor) {\r\n tinymce.activeEditor.contentAreaContainer.style.transition = 'all .3s';\r\n tinymce.activeEditor.contentAreaContainer.style.borderWidth = '';\r\n }\r\n\r\n return false;\r\n });\r\n\r\n if (typeof FormData !== 'undefined') {\r\n\r\n // Fix for Chrome\r\n editor.on('dragenter', e => {\r\n e.stopPropagation();\r\n return false;\r\n });\r\n\r\n // Notify user when file is over the drop area\r\n editor.on('dragover', e => {\r\n e.preventDefault();\r\n\r\n if (tinymce.activeEditor) {\r\n tinymce.activeEditor.contentAreaContainer.style.transition = 'all .3s';\r\n tinymce.activeEditor.contentAreaContainer.style.border = '3px dashed rgba(0, 0, 0, .35)';\r\n }\r\n\r\n return false;\r\n });\r\n\r\n editor.on('drop', e => {\r\n editor.contentAreaContainer.style.borderWidth = '';\r\n editor.contentAreaContainer.style.borderWidth = '';\r\n });\r\n }\r\n });\r\n\r\n return Promise.resolve();\r\n}\r\n\r\nexport interface TinymceModule {\r\n get: typeof get;\r\n destroy: typeof destroy;\r\n addHook: typeof addHook;\r\n clearHooks: typeof clearHooks;\r\n TinymceController: typeof TinymceController;\r\n}\r\n\r\ndeclare global {\r\n var tinymce: TinyMCE;\r\n}\r\n"],"names":["tinymce"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as bootstrap from "bootstrap";
|
|
2
|
+
import { Tooltip } from "bootstrap";
|
|
3
|
+
import { B as html, v as selectOne, w as selectAll } from "./unicorn.js";
|
|
4
|
+
class UIBootstrap5 {
|
|
5
|
+
static instance = null;
|
|
6
|
+
bootstrap = bootstrap;
|
|
7
|
+
static get() {
|
|
8
|
+
return this.instance ??= new this();
|
|
9
|
+
}
|
|
10
|
+
renderMessage(messages, type = "info") {
|
|
11
|
+
if (!Array.isArray(messages)) {
|
|
12
|
+
messages = [messages];
|
|
13
|
+
}
|
|
14
|
+
let text = "";
|
|
15
|
+
messages.forEach((msg) => {
|
|
16
|
+
text += `<div class="">${msg}</div>`;
|
|
17
|
+
});
|
|
18
|
+
const msgHtml = html(`<div class="alert alert-${type} alert-dismissible fade show" role="alert">
|
|
19
|
+
${text}
|
|
20
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
21
|
+
</div>`);
|
|
22
|
+
const container = selectOne(".c-messages-container");
|
|
23
|
+
if (container) {
|
|
24
|
+
container.appendChild(msgHtml);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
clearMessages() {
|
|
28
|
+
const container = selectOne(".c-messages-container");
|
|
29
|
+
if (container) {
|
|
30
|
+
container.innerHTML = "";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async keepTab(selector, options = {}) {
|
|
34
|
+
const module = await import("./keep-tab.js");
|
|
35
|
+
await module.ready;
|
|
36
|
+
if (selector) {
|
|
37
|
+
return new module.KeepTab(selector, options);
|
|
38
|
+
}
|
|
39
|
+
return module;
|
|
40
|
+
}
|
|
41
|
+
async buttonRadio(selector, options = {}) {
|
|
42
|
+
const m = await import("./button-radio.js");
|
|
43
|
+
await m.ready;
|
|
44
|
+
if (selector) {
|
|
45
|
+
return m.ButtonRadio.handle(selector, options);
|
|
46
|
+
}
|
|
47
|
+
return m;
|
|
48
|
+
}
|
|
49
|
+
tooltip(selector = '[data-bs-toggle="tooltip"]', config = {}) {
|
|
50
|
+
return this.selectAsArray(selector).map((ele) => Tooltip.getOrCreateInstance(ele, config));
|
|
51
|
+
}
|
|
52
|
+
selectAsArray(selector) {
|
|
53
|
+
if (selector instanceof NodeList) {
|
|
54
|
+
return Array.from(selector);
|
|
55
|
+
} else if (typeof selector === "string") {
|
|
56
|
+
return selectAll(selector);
|
|
57
|
+
} else {
|
|
58
|
+
return [selector];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
getMajorVersion(module) {
|
|
62
|
+
return Number(module.VERSION.split(".").shift());
|
|
63
|
+
}
|
|
64
|
+
pushBootstrapToGlobal() {
|
|
65
|
+
window.bootstrap = bootstrap;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
UIBootstrap5
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=ui-bootstrap5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-bootstrap5.js","sources":["../../src/module/ui-bootstrap5.ts"],"sourcesContent":["import * as bootstrap from 'bootstrap';\r\nimport { Tooltip } from 'bootstrap';\r\nimport type { ButtonRadio, ButtonRadioModule, ButtonRadioOptions } from '../bootstrap/button-radio';\r\nimport type { KeepTab, KeepTabModule, KeepTabOptions } from '../bootstrap/keep-tab';\r\nimport { getBoundedInstanceList, html, selectAll, selectOne } from '../service';\r\nimport type { UIThemeInterface } from '../types';\r\n\r\nexport class UIBootstrap5 implements UIThemeInterface {\r\n static instance: UIBootstrap5 | null = null;\r\n\r\n bootstrap = bootstrap;\r\n\r\n static get() {\r\n return this.instance ??= new this();\r\n }\r\n\r\n renderMessage(messages: string | string[], type: string = 'info') {\r\n if (!Array.isArray(messages)) {\r\n messages = [messages];\r\n }\r\n\r\n let text = '';\r\n\r\n messages.forEach((msg) => {\r\n text += `<div class=\"\">${msg}</div>`;\r\n });\r\n\r\n const msgHtml = html(`<div class=\"alert alert-${type} alert-dismissible fade show\" role=\"alert\">\r\n ${text}\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\r\n</div>`);\r\n\r\n const container = selectOne('.c-messages-container');\r\n\r\n if (container) {\r\n container.appendChild(msgHtml);\r\n }\r\n }\r\n\r\n clearMessages() {\r\n const container = selectOne('.c-messages-container');\r\n\r\n if (container) {\r\n container.innerHTML = '';\r\n }\r\n }\r\n\r\n async keepTab(): Promise<KeepTabModule>;\r\n async keepTab(selector?: string | HTMLElement, options?: KeepTabOptions): Promise<KeepTab>;\r\n async keepTab(selector?: string | HTMLElement, options: KeepTabOptions = {}): Promise<any> {\r\n const module = await import('../bootstrap/keep-tab');\r\n\r\n await module.ready;\r\n\r\n if (selector) {\r\n return new module.KeepTab(selector, options);\r\n }\r\n\r\n return module;\r\n }\r\n\r\n async buttonRadio(): Promise<ButtonRadioModule>;\r\n async buttonRadio(selector?: string | HTMLElement, options?: ButtonRadioOptions): Promise<ButtonRadio>;\r\n async buttonRadio(selector?: string | HTMLElement, options: ButtonRadioOptions = {}): Promise<any> {\r\n const m = await import('../bootstrap/button-radio');\r\n\r\n await m.ready;\r\n\r\n if (selector) {\r\n return m.ButtonRadio.handle(selector, options);\r\n }\r\n\r\n return m;\r\n }\r\n\r\n tooltip(\r\n selector: NodeListOf<Element> | Element | string = '[data-bs-toggle=\"tooltip\"]',\r\n config: Partial<Tooltip.Options> = {}\r\n ): Tooltip[] {\r\n return this.selectAsArray(selector)\r\n .map((ele) => Tooltip.getOrCreateInstance(ele, config));\r\n }\r\n\r\n protected selectAsArray(selector: NodeListOf<Element> | Element | string) {\r\n if (selector instanceof NodeList) {\r\n return Array.from(selector);\r\n } else if (typeof selector === 'string') {\r\n return selectAll(selector);\r\n } else {\r\n return [selector];\r\n }\r\n }\r\n\r\n getMajorVersion(module: any) {\r\n return Number(module.VERSION.split('.').shift());\r\n }\r\n\r\n pushBootstrapToGlobal() {\r\n window.bootstrap = bootstrap;\r\n }\r\n}\r\n\r\ndeclare global {\r\n export interface Window {\r\n bootstrap: typeof bootstrap;\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAOO,MAAM,aAAyC;AAAA,EACpD,OAAO,WAAgC;AAAA,EAEvC,YAAY;AAAA,EAEZ,OAAO,MAAM;AACX,WAAO,KAAK,aAAa,IAAI,KAAA;AAAA,EAC/B;AAAA,EAEA,cAAc,UAA6B,OAAe,QAAQ;AAChE,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,iBAAW,CAAC,QAAQ;AAAA,IACtB;AAEA,QAAI,OAAO;AAEX,aAAS,QAAQ,CAAC,QAAQ;AACxB,cAAQ,iBAAiB,GAAG;AAAA,IAC9B,CAAC;AAED,UAAM,UAAU,KAAK,2BAA2B,IAAI;AAAA,IACpD,IAAI;AAAA;AAAA,OAED;AAEH,UAAM,YAAY,UAAU,uBAAuB;AAEnD,QAAI,WAAW;AACb,gBAAU,YAAY,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,UAAM,YAAY,UAAU,uBAAuB;AAEnD,QAAI,WAAW;AACb,gBAAU,YAAY;AAAA,IACxB;AAAA,EACF;AAAA,EAIA,MAAM,QAAQ,UAAiC,UAA0B,IAAkB;AACzF,UAAM,SAAS,MAAM,OAAO,eAAuB;AAEnD,UAAM,OAAO;AAEb,QAAI,UAAU;AACZ,aAAO,IAAI,OAAO,QAAQ,UAAU,OAAO;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA,EAIA,MAAM,YAAY,UAAiC,UAA8B,IAAkB;AACjG,UAAM,IAAI,MAAM,OAAO,mBAA2B;AAElD,UAAM,EAAE;AAER,QAAI,UAAU;AACZ,aAAO,EAAE,YAAY,OAAO,UAAU,OAAO;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QACE,WAAmD,8BACnD,SAAmC,CAAA,GACxB;AACX,WAAO,KAAK,cAAc,QAAQ,EAC/B,IAAI,CAAC,QAAQ,QAAQ,oBAAoB,KAAK,MAAM,CAAC;AAAA,EAC1D;AAAA,EAEU,cAAc,UAAkD;AACxE,QAAI,oBAAoB,UAAU;AAChC,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B,WAAW,OAAO,aAAa,UAAU;AACvC,aAAO,UAAU,QAAQ;AAAA,IAC3B,OAAO;AACL,aAAO,CAAC,QAAQ;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,gBAAgB,QAAa;AAC3B,WAAO,OAAO,OAAO,QAAQ,MAAM,GAAG,EAAE,OAAO;AAAA,EACjD;AAAA,EAEA,wBAAwB;AACtB,WAAO,YAAY;AAAA,EACrB;AACF;"}
|