@composy/log-viewer-vue 0.0.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 +46 -0
- package/dist/index.css +3 -0
- package/dist/index.js +260 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.css +3 -0
- package/dist/index.min.js +1 -0
- package/es/components/LogViewer.js +17 -0
- package/es/components/LogViewer.js.map +1 -0
- package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js +109 -0
- package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/es/composables/useLogViewer.d.ts +116 -0
- package/es/composables/useLogViewer.d.ts.map +1 -0
- package/es/composables/useLogViewer.js +113 -0
- package/es/composables/useLogViewer.js.map +1 -0
- package/es/index.d.ts +15 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +19 -0
- package/es/index.js.map +1 -0
- package/es/plugin.d.ts +8 -0
- package/es/plugin.d.ts.map +1 -0
- package/es/plugin.js +18 -0
- package/es/plugin.js.map +1 -0
- package/es/style/css.js +1 -0
- package/es/style/index.js +1 -0
- package/es/style/index.less +1 -0
- package/lib/components/LogViewer.cjs +21 -0
- package/lib/components/LogViewer.cjs.map +1 -0
- package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs +109 -0
- package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
- package/lib/composables/useLogViewer.cjs +114 -0
- package/lib/composables/useLogViewer.cjs.map +1 -0
- package/lib/composables/useLogViewer.d.ts +116 -0
- package/lib/index.cjs +53 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/package.json +3 -0
- package/lib/plugin.cjs +19 -0
- package/lib/plugin.cjs.map +1 -0
- package/lib/plugin.d.ts +8 -0
- package/lib/style/css.js +1 -0
- package/lib/style/index.css +2 -0
- package/lib/style/index.js +1 -0
- package/package.json +95 -0
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @composy/log-viewer-vue
|
|
2
|
+
|
|
3
|
+
审计日志查看器 - 操作日志可视化与追溯(Vue 3 适配层)
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 🧩 Vue 3 组件
|
|
8
|
+
- 🪝 组合式函数 (Composables)
|
|
9
|
+
- ⚡ 响应式数据绑定
|
|
10
|
+
|
|
11
|
+
## 安装
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @composy/log-viewer-vue
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
```vue
|
|
20
|
+
<template>
|
|
21
|
+
<!-- 使用组件 -->
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup>
|
|
25
|
+
// import { /* 组件 */ } from '@composy/log-viewer-vue'
|
|
26
|
+
</script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 目录结构
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
packages/vue/
|
|
33
|
+
├── src/ # 源码
|
|
34
|
+
├── package.json
|
|
35
|
+
├── tsconfig.json # ESM 构建配置
|
|
36
|
+
└── tsconfig.cjs.json # CJS 构建配置
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 依赖
|
|
40
|
+
|
|
41
|
+
- `@composy/log-viewer-core` — 核心引擎
|
|
42
|
+
- `vue` ^3.3.0 (peerDependency)
|
|
43
|
+
|
|
44
|
+
## License
|
|
45
|
+
|
|
46
|
+
MIT
|
package/dist/index.css
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* ***********************************
|
|
3
|
+
* @composy/log-viewer-vue v0.0.1 *
|
|
4
|
+
* Built with rollup *
|
|
5
|
+
* Build time: 2024-08-17 11:42:24 *
|
|
6
|
+
* Build mode: production *
|
|
7
|
+
* Minified: No *
|
|
8
|
+
* ***********************************
|
|
9
|
+
*/
|
|
10
|
+
(function(global, factory) {
|
|
11
|
+
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("vue"), require("@composy/log-viewer-core")) : typeof define === "function" && define.amd ? define([
|
|
12
|
+
"exports",
|
|
13
|
+
"vue",
|
|
14
|
+
"@composy/log-viewer-core"
|
|
15
|
+
], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.LDesignPackagesVue3 = {}, global.Vue, global.ComposyLogViewerCore));
|
|
16
|
+
})(this, function(exports, vue, _composy_log_viewer_core) {
|
|
17
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
18
|
+
//#region src/components/LogViewer.vue?vue&type=script&setup=true&lang.ts
|
|
19
|
+
var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
20
|
+
__name: "LogViewer",
|
|
21
|
+
props: {
|
|
22
|
+
data: {
|
|
23
|
+
type: Array,
|
|
24
|
+
required: false,
|
|
25
|
+
default: () => []
|
|
26
|
+
},
|
|
27
|
+
filter: {
|
|
28
|
+
type: Object,
|
|
29
|
+
required: false
|
|
30
|
+
},
|
|
31
|
+
theme: {
|
|
32
|
+
type: String,
|
|
33
|
+
required: false,
|
|
34
|
+
default: "light"
|
|
35
|
+
},
|
|
36
|
+
pageSize: {
|
|
37
|
+
type: Number,
|
|
38
|
+
required: false,
|
|
39
|
+
default: 20
|
|
40
|
+
},
|
|
41
|
+
showFilter: {
|
|
42
|
+
type: Boolean,
|
|
43
|
+
required: false,
|
|
44
|
+
default: true
|
|
45
|
+
},
|
|
46
|
+
showDiff: {
|
|
47
|
+
type: Boolean,
|
|
48
|
+
required: false,
|
|
49
|
+
default: true
|
|
50
|
+
},
|
|
51
|
+
showAnomalyBadge: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
required: false,
|
|
54
|
+
default: true
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
emits: [
|
|
58
|
+
"entry-click",
|
|
59
|
+
"entry-expand",
|
|
60
|
+
"entry-collapse",
|
|
61
|
+
"filter-change",
|
|
62
|
+
"theme-change",
|
|
63
|
+
"page-change"
|
|
64
|
+
],
|
|
65
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
66
|
+
const props = __props;
|
|
67
|
+
const emit = __emit;
|
|
68
|
+
const containerRef = (0, vue.ref)(null);
|
|
69
|
+
let instance = null;
|
|
70
|
+
(0, vue.onMounted)(() => {
|
|
71
|
+
if (!containerRef.value) return;
|
|
72
|
+
instance = (0, _composy_log_viewer_core.createLogViewer)({
|
|
73
|
+
container: containerRef.value,
|
|
74
|
+
data: props.data,
|
|
75
|
+
filter: props.filter,
|
|
76
|
+
theme: props.theme,
|
|
77
|
+
pageSize: props.pageSize,
|
|
78
|
+
showFilter: props.showFilter,
|
|
79
|
+
showDiff: props.showDiff,
|
|
80
|
+
showAnomalyBadge: props.showAnomalyBadge
|
|
81
|
+
});
|
|
82
|
+
instance.on("entry:click", (entry) => emit("entry-click", entry));
|
|
83
|
+
instance.on("entry:expand", (entry) => emit("entry-expand", entry));
|
|
84
|
+
instance.on("entry:collapse", (entry) => emit("entry-collapse", entry));
|
|
85
|
+
instance.on("filter:change", (filter) => emit("filter-change", filter));
|
|
86
|
+
instance.on("theme:change", (theme) => emit("theme-change", theme));
|
|
87
|
+
instance.on("page:change", (page) => emit("page-change", page));
|
|
88
|
+
});
|
|
89
|
+
(0, vue.watch)(() => props.data, (newData) => {
|
|
90
|
+
instance?.setData(newData);
|
|
91
|
+
}, { deep: true });
|
|
92
|
+
(0, vue.watch)(() => props.filter, (newFilter) => {
|
|
93
|
+
if (newFilter) instance?.setFilter(newFilter);
|
|
94
|
+
}, { deep: true });
|
|
95
|
+
(0, vue.watch)(() => props.theme, (newTheme) => {
|
|
96
|
+
instance?.setTheme(newTheme);
|
|
97
|
+
});
|
|
98
|
+
(0, vue.onUnmounted)(() => {
|
|
99
|
+
instance?.destroy();
|
|
100
|
+
instance = null;
|
|
101
|
+
});
|
|
102
|
+
__expose({ getInstance: () => instance });
|
|
103
|
+
return (_ctx, _cache) => {
|
|
104
|
+
return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
105
|
+
ref_key: "containerRef",
|
|
106
|
+
ref: containerRef,
|
|
107
|
+
class: "lv-vue-root"
|
|
108
|
+
}, null, 512);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/components/LogViewer.vue
|
|
114
|
+
LogViewer_vue_vue_type_script_setup_true_lang_default.__file = "src/components/LogViewer.vue";
|
|
115
|
+
var LogViewer_default = LogViewer_vue_vue_type_script_setup_true_lang_default;
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region src/composables/useLogViewer.ts
|
|
118
|
+
function useLogViewer() {
|
|
119
|
+
const instance = (0, vue.ref)(null);
|
|
120
|
+
const data = (0, vue.ref)([]);
|
|
121
|
+
const filter = (0, vue.ref)({});
|
|
122
|
+
const theme = (0, vue.ref)("light");
|
|
123
|
+
const pagination = (0, vue.ref)({
|
|
124
|
+
page: 1,
|
|
125
|
+
pageSize: 20
|
|
126
|
+
});
|
|
127
|
+
function create(container, config) {
|
|
128
|
+
if (instance.value) instance.value.destroy();
|
|
129
|
+
instance.value = (0, _composy_log_viewer_core.createLogViewer)({
|
|
130
|
+
container,
|
|
131
|
+
...config
|
|
132
|
+
});
|
|
133
|
+
instance.value.on("data:change", (entries) => {
|
|
134
|
+
data.value = entries;
|
|
135
|
+
});
|
|
136
|
+
instance.value.on("filter:change", (f) => {
|
|
137
|
+
filter.value = f;
|
|
138
|
+
});
|
|
139
|
+
instance.value.on("theme:change", (t) => {
|
|
140
|
+
theme.value = t;
|
|
141
|
+
});
|
|
142
|
+
instance.value.on("page:change", () => {
|
|
143
|
+
if (instance.value) pagination.value = instance.value.getPagination();
|
|
144
|
+
});
|
|
145
|
+
if (config?.data) data.value = config.data;
|
|
146
|
+
if (config?.theme) theme.value = config.theme;
|
|
147
|
+
if (config?.filter) filter.value = config.filter;
|
|
148
|
+
}
|
|
149
|
+
function setData(entries) {
|
|
150
|
+
instance.value?.setData(entries);
|
|
151
|
+
data.value = entries;
|
|
152
|
+
}
|
|
153
|
+
function appendData(entries) {
|
|
154
|
+
instance.value?.appendData(entries);
|
|
155
|
+
data.value = instance.value?.getData() || [];
|
|
156
|
+
}
|
|
157
|
+
function setFilter(f) {
|
|
158
|
+
instance.value?.setFilter(f);
|
|
159
|
+
filter.value = f;
|
|
160
|
+
}
|
|
161
|
+
function resetFilter() {
|
|
162
|
+
instance.value?.resetFilter();
|
|
163
|
+
filter.value = {};
|
|
164
|
+
}
|
|
165
|
+
function setTheme(t) {
|
|
166
|
+
instance.value?.setTheme(t);
|
|
167
|
+
theme.value = t;
|
|
168
|
+
}
|
|
169
|
+
function expandEntry(id) {
|
|
170
|
+
instance.value?.expandEntry(id);
|
|
171
|
+
}
|
|
172
|
+
function collapseEntry(id) {
|
|
173
|
+
instance.value?.collapseEntry(id);
|
|
174
|
+
}
|
|
175
|
+
function collapseAll() {
|
|
176
|
+
instance.value?.collapseAll();
|
|
177
|
+
}
|
|
178
|
+
function goToPage(page) {
|
|
179
|
+
instance.value?.goToPage(page);
|
|
180
|
+
}
|
|
181
|
+
function refresh() {
|
|
182
|
+
instance.value?.refresh();
|
|
183
|
+
}
|
|
184
|
+
function destroy() {
|
|
185
|
+
instance.value?.destroy();
|
|
186
|
+
instance.value = null;
|
|
187
|
+
}
|
|
188
|
+
function on(event, callback) {
|
|
189
|
+
return instance.value?.on(event, callback) || (() => {});
|
|
190
|
+
}
|
|
191
|
+
(0, vue.onUnmounted)(() => {
|
|
192
|
+
destroy();
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
instance,
|
|
196
|
+
data,
|
|
197
|
+
filter,
|
|
198
|
+
theme,
|
|
199
|
+
pagination,
|
|
200
|
+
create,
|
|
201
|
+
setData,
|
|
202
|
+
appendData,
|
|
203
|
+
setFilter,
|
|
204
|
+
resetFilter,
|
|
205
|
+
setTheme,
|
|
206
|
+
expandEntry,
|
|
207
|
+
collapseEntry,
|
|
208
|
+
collapseAll,
|
|
209
|
+
goToPage,
|
|
210
|
+
refresh,
|
|
211
|
+
destroy,
|
|
212
|
+
on
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//#endregion
|
|
216
|
+
//#region src/plugin.ts
|
|
217
|
+
const LogViewerPlugin = { install(app) {
|
|
218
|
+
app.component("LogViewer", LogViewer_default);
|
|
219
|
+
} };
|
|
220
|
+
//#endregion
|
|
221
|
+
//#region src/index.ts
|
|
222
|
+
const VERSION = "0.1.0";
|
|
223
|
+
//#endregion
|
|
224
|
+
Object.defineProperty(exports, "ACTION_COLORS", {
|
|
225
|
+
enumerable: true,
|
|
226
|
+
get: function() {
|
|
227
|
+
return _composy_log_viewer_core.ACTION_COLORS;
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
Object.defineProperty(exports, "ACTION_LABELS", {
|
|
231
|
+
enumerable: true,
|
|
232
|
+
get: function() {
|
|
233
|
+
return _composy_log_viewer_core.ACTION_LABELS;
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
exports.LogViewer = LogViewer_default;
|
|
237
|
+
exports.LogViewerPlugin = LogViewerPlugin;
|
|
238
|
+
exports.VERSION = VERSION;
|
|
239
|
+
Object.defineProperty(exports, "createLogViewer", {
|
|
240
|
+
enumerable: true,
|
|
241
|
+
get: function() {
|
|
242
|
+
return _composy_log_viewer_core.createLogViewer;
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
Object.defineProperty(exports, "formatDate", {
|
|
246
|
+
enumerable: true,
|
|
247
|
+
get: function() {
|
|
248
|
+
return _composy_log_viewer_core.formatDate;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
Object.defineProperty(exports, "formatRelativeTime", {
|
|
252
|
+
enumerable: true,
|
|
253
|
+
get: function() {
|
|
254
|
+
return _composy_log_viewer_core.formatRelativeTime;
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
exports.useLogViewer = useLogViewer;
|
|
258
|
+
});
|
|
259
|
+
/*! End of @composy/log-viewer-vue | Powered by @composy/builder */
|
|
260
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/composables/useLogViewer.ts","../src/plugin.ts","../src/index.ts"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n","<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n","/**\n * useLogViewer - Vue 3 组合式 API\n */\nimport { ref, onUnmounted } from 'vue'\nimport {\n createLogViewer,\n type LogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type PaginationConfig,\n} from '@composy/log-viewer-core'\n\n/**\n * useLogViewer - use Log Viewer function\n * @returns 返回值说明\n */\nexport function useLogViewer() {\n const instance = ref<LogViewer | null>(null)\n const data = ref<LogEntry[]>([])\n const filter = ref<FilterConfig>({})\n const theme = ref<ThemeMode>('light')\n const pagination = ref<PaginationConfig>({ page: 1, pageSize: 20 })\n\n function create(container: HTMLElement | string, config?: Partial<LogViewerConfig>) {\n if (instance.value) {\n instance.value.destroy()\n }\n\n instance.value = createLogViewer({\n container,\n ...config,\n })\n\n // Sync refs\n instance.value.on('data:change', (entries: LogEntry[]) => {\n data.value = entries\n })\n instance.value.on('filter:change', (f: FilterConfig) => {\n filter.value = f\n })\n instance.value.on('theme:change', (t: ThemeMode) => {\n theme.value = t\n })\n instance.value.on('page:change', () => {\n if (instance.value) {\n pagination.value = instance.value.getPagination()\n }\n })\n\n if (config?.data) data.value = config.data\n if (config?.theme) theme.value = config.theme\n if (config?.filter) filter.value = config.filter\n }\n\n function setData(entries: LogEntry[]) {\n instance.value?.setData(entries)\n data.value = entries\n }\n\n function appendData(entries: LogEntry[]) {\n instance.value?.appendData(entries)\n data.value = instance.value?.getData() || []\n }\n\n function setFilter(f: FilterConfig) {\n instance.value?.setFilter(f)\n filter.value = f\n }\n\n function resetFilter() {\n instance.value?.resetFilter()\n filter.value = {}\n }\n\n function setTheme(t: ThemeMode) {\n instance.value?.setTheme(t)\n theme.value = t\n }\n\n function expandEntry(id: string) {\n instance.value?.expandEntry(id)\n }\n\n function collapseEntry(id: string) {\n instance.value?.collapseEntry(id)\n }\n\n function collapseAll() {\n instance.value?.collapseAll()\n }\n\n function goToPage(page: number) {\n instance.value?.goToPage(page)\n }\n\n function refresh() {\n instance.value?.refresh()\n }\n\n function destroy() {\n instance.value?.destroy()\n instance.value = null\n }\n\n function on(event: string, callback: (...args: unknown[]) => void): () => void {\n return instance.value?.on(event, callback) || (() => {})\n }\n\n onUnmounted(() => {\n destroy()\n })\n\n return {\n instance,\n data,\n filter,\n theme,\n pagination,\n create,\n setData,\n appendData,\n setFilter,\n resetFilter,\n setTheme,\n expandEntry,\n collapseEntry,\n collapseAll,\n goToPage,\n refresh,\n destroy,\n on,\n }\n}\n","/**\n * Vue 插件 - 全局注册 LogViewer 组件\n */\nimport type { App } from 'vue'\nimport LogViewer from './components/LogViewer.vue'\n\nexport const LogViewerPlugin = {\n install(app: App) {\n app.component('LogViewer', LogViewer)\n },\n}\n","/**\n * @composy/log-viewer-vue\n *\n * 审计日志查看器 — Vue 3 适配层\n * 提供 LogViewer 组件、useLogViewer 组合式函数和 Vue 插件\n *\n * @packageDocumentation\n */\n\nexport const VERSION = '0.1.0'\n\n// 组件\nexport { default as LogViewer } from './components/LogViewer.vue'\n\n// 组合式 API\nexport { useLogViewer } from './composables/useLogViewer'\n\n// 插件\nexport { LogViewerPlugin } from './plugin'\n\n// 重新导出核心类型\nexport type {\n ActionType,\n ThemeMode,\n AnomalyType,\n DiffEntry,\n LogEntry,\n FilterConfig,\n PaginationConfig,\n LogViewerConfig,\n LogViewerInstance,\n LogViewerEvents,\n} from '@composy/log-viewer-core'\n\nexport {\n createLogViewer,\n ACTION_LABELS,\n ACTION_COLORS,\n formatDate,\n formatRelativeTime,\n} from '@composy/log-viewer-core'\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(exports,require("vue"),require("@composy/log-viewer-core")):typeof define==="function"&&define.amd?define(["exports","vue","@composy/log-viewer-core"],factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,factory(global.LDesignPackagesVue3={},global.Vue,global.ComposyLogViewerCore));})(this,function(exports,vue,_composy_log_viewer_core){Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var LogViewer_vue_vue_type_script_setup_true_lang_default=(0,vue.defineComponent)({__name:"LogViewer",props:{data:{type:Array,required:false,default:()=>[]},filter:{type:Object,required:false},theme:{type:String,required:false,default:"light"},pageSize:{type:Number,required:false,default:20},showFilter:{type:Boolean,required:false,default:true},showDiff:{type:Boolean,required:false,default:true},showAnomalyBadge:{type:Boolean,required:false,default:true}},emits:["entry-click","entry-expand","entry-collapse","filter-change","theme-change","page-change"],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;const containerRef=(0,vue.ref)(null);let instance=null;(0,vue.onMounted)(()=>{if(!containerRef.value)return;instance=(0,_composy_log_viewer_core.createLogViewer)({container:containerRef.value,data:props.data,filter:props.filter,theme:props.theme,pageSize:props.pageSize,showFilter:props.showFilter,showDiff:props.showDiff,showAnomalyBadge:props.showAnomalyBadge});instance.on("entry:click",(entry)=>emit("entry-click",entry));instance.on("entry:expand",(entry)=>emit("entry-expand",entry));instance.on("entry:collapse",(entry)=>emit("entry-collapse",entry));instance.on("filter:change",(filter)=>emit("filter-change",filter));instance.on("theme:change",(theme)=>emit("theme-change",theme));instance.on("page:change",(page)=>emit("page-change",page));});(0,vue.watch)(()=>props.data,(newData)=>{instance?.setData(newData);},{deep:true});(0,vue.watch)(()=>props.filter,(newFilter)=>{if(newFilter)instance?.setFilter(newFilter);},{deep:true});(0,vue.watch)(()=>props.theme,(newTheme)=>{instance?.setTheme(newTheme);});(0,vue.onUnmounted)(()=>{instance?.destroy();instance=null;});__expose({getInstance:()=>instance});return(_ctx,_cache)=>{return(0,vue.openBlock)(),(0,vue.createElementBlock)("div",{ref_key:"containerRef",ref:containerRef,class:"lv-vue-root"},null,512);};}});LogViewer_vue_vue_type_script_setup_true_lang_default.__file="src/components/LogViewer.vue";var LogViewer_default=LogViewer_vue_vue_type_script_setup_true_lang_default;function useLogViewer(){const instance=(0,vue.ref)(null);const data=(0,vue.ref)([]);const filter=(0,vue.ref)({});const theme=(0,vue.ref)("light");const pagination=(0,vue.ref)({page:1,pageSize:20});function create(container,config){if(instance.value)instance.value.destroy();instance.value=(0,_composy_log_viewer_core.createLogViewer)({container,...config});instance.value.on("data:change",(entries)=>{data.value=entries;});instance.value.on("filter:change",(f)=>{filter.value=f;});instance.value.on("theme:change",(t)=>{theme.value=t;});instance.value.on("page:change",()=>{if(instance.value)pagination.value=instance.value.getPagination();});if(config?.data)data.value=config.data;if(config?.theme)theme.value=config.theme;if(config?.filter)filter.value=config.filter;}function setData(entries){instance.value?.setData(entries);data.value=entries;}function appendData(entries){instance.value?.appendData(entries);data.value=instance.value?.getData()||[];}function setFilter(f){instance.value?.setFilter(f);filter.value=f;}function resetFilter(){instance.value?.resetFilter();filter.value={};}function setTheme(t){instance.value?.setTheme(t);theme.value=t;}function expandEntry(id){instance.value?.expandEntry(id);}function collapseEntry(id){instance.value?.collapseEntry(id);}function collapseAll(){instance.value?.collapseAll();}function goToPage(page){instance.value?.goToPage(page);}function refresh(){instance.value?.refresh();}function destroy(){instance.value?.destroy();instance.value=null;}function on(event,callback){return instance.value?.on(event,callback)||(()=>{});}(0,vue.onUnmounted)(()=>{destroy();});return{instance,data,filter,theme,pagination,create,setData,appendData,setFilter,resetFilter,setTheme,expandEntry,collapseEntry,collapseAll,goToPage,refresh,destroy,on};}const LogViewerPlugin={install(app){app.component("LogViewer",LogViewer_default);}};const VERSION="0.1.0";Object.defineProperty(exports,"ACTION_COLORS",{enumerable:true,get:function(){return _composy_log_viewer_core.ACTION_COLORS;}});Object.defineProperty(exports,"ACTION_LABELS",{enumerable:true,get:function(){return _composy_log_viewer_core.ACTION_LABELS;}});exports.LogViewer=LogViewer_default;exports.LogViewerPlugin=LogViewerPlugin;exports.VERSION=VERSION;Object.defineProperty(exports,"createLogViewer",{enumerable:true,get:function(){return _composy_log_viewer_core.createLogViewer;}});Object.defineProperty(exports,"formatDate",{enumerable:true,get:function(){return _composy_log_viewer_core.formatDate;}});Object.defineProperty(exports,"formatRelativeTime",{enumerable:true,get:function(){return _composy_log_viewer_core.formatRelativeTime;}});exports.useLogViewer=useLogViewer;});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* ***********************************
|
|
3
|
+
* @composy/log-viewer-vue v0.0.1 *
|
|
4
|
+
* Built with rollup *
|
|
5
|
+
* Build time: 2024-08-17 11:42:24 *
|
|
6
|
+
* Build mode: production *
|
|
7
|
+
* Minified: No *
|
|
8
|
+
* ***********************************
|
|
9
|
+
*/
|
|
10
|
+
import LogViewer_vue_vue_type_script_setup_true_lang_default from "./LogViewer.vue_vue_type_script_setup_true_lang.js";
|
|
11
|
+
//#region src/components/LogViewer.vue
|
|
12
|
+
LogViewer_vue_vue_type_script_setup_true_lang_default.__file = "src/components/LogViewer.vue";
|
|
13
|
+
var LogViewer_default = LogViewer_vue_vue_type_script_setup_true_lang_default;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { LogViewer_default as default };
|
|
16
|
+
/*! End of @composy/log-viewer-vue | Powered by @composy/builder */
|
|
17
|
+
//# sourceMappingURL=LogViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogViewer.js","names":[],"sources":["../../src/components/LogViewer.vue"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n"],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* ***********************************
|
|
3
|
+
* @composy/log-viewer-vue v0.0.1 *
|
|
4
|
+
* Built with rollup *
|
|
5
|
+
* Build time: 2024-08-17 11:42:24 *
|
|
6
|
+
* Build mode: production *
|
|
7
|
+
* Minified: No *
|
|
8
|
+
* ***********************************
|
|
9
|
+
*/
|
|
10
|
+
import { createElementBlock, defineComponent, onMounted, onUnmounted, openBlock, ref, watch } from "vue";
|
|
11
|
+
import { createLogViewer } from "@composy/log-viewer-core";
|
|
12
|
+
//#region src/components/LogViewer.vue?vue&type=script&setup=true&lang.ts
|
|
13
|
+
var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
14
|
+
__name: "LogViewer",
|
|
15
|
+
props: {
|
|
16
|
+
data: {
|
|
17
|
+
type: Array,
|
|
18
|
+
required: false,
|
|
19
|
+
default: () => []
|
|
20
|
+
},
|
|
21
|
+
filter: {
|
|
22
|
+
type: Object,
|
|
23
|
+
required: false
|
|
24
|
+
},
|
|
25
|
+
theme: {
|
|
26
|
+
type: String,
|
|
27
|
+
required: false,
|
|
28
|
+
default: "light"
|
|
29
|
+
},
|
|
30
|
+
pageSize: {
|
|
31
|
+
type: Number,
|
|
32
|
+
required: false,
|
|
33
|
+
default: 20
|
|
34
|
+
},
|
|
35
|
+
showFilter: {
|
|
36
|
+
type: Boolean,
|
|
37
|
+
required: false,
|
|
38
|
+
default: true
|
|
39
|
+
},
|
|
40
|
+
showDiff: {
|
|
41
|
+
type: Boolean,
|
|
42
|
+
required: false,
|
|
43
|
+
default: true
|
|
44
|
+
},
|
|
45
|
+
showAnomalyBadge: {
|
|
46
|
+
type: Boolean,
|
|
47
|
+
required: false,
|
|
48
|
+
default: true
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
emits: [
|
|
52
|
+
"entry-click",
|
|
53
|
+
"entry-expand",
|
|
54
|
+
"entry-collapse",
|
|
55
|
+
"filter-change",
|
|
56
|
+
"theme-change",
|
|
57
|
+
"page-change"
|
|
58
|
+
],
|
|
59
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
60
|
+
const props = __props;
|
|
61
|
+
const emit = __emit;
|
|
62
|
+
const containerRef = ref(null);
|
|
63
|
+
let instance = null;
|
|
64
|
+
onMounted(() => {
|
|
65
|
+
if (!containerRef.value) return;
|
|
66
|
+
instance = createLogViewer({
|
|
67
|
+
container: containerRef.value,
|
|
68
|
+
data: props.data,
|
|
69
|
+
filter: props.filter,
|
|
70
|
+
theme: props.theme,
|
|
71
|
+
pageSize: props.pageSize,
|
|
72
|
+
showFilter: props.showFilter,
|
|
73
|
+
showDiff: props.showDiff,
|
|
74
|
+
showAnomalyBadge: props.showAnomalyBadge
|
|
75
|
+
});
|
|
76
|
+
instance.on("entry:click", (entry) => emit("entry-click", entry));
|
|
77
|
+
instance.on("entry:expand", (entry) => emit("entry-expand", entry));
|
|
78
|
+
instance.on("entry:collapse", (entry) => emit("entry-collapse", entry));
|
|
79
|
+
instance.on("filter:change", (filter) => emit("filter-change", filter));
|
|
80
|
+
instance.on("theme:change", (theme) => emit("theme-change", theme));
|
|
81
|
+
instance.on("page:change", (page) => emit("page-change", page));
|
|
82
|
+
});
|
|
83
|
+
watch(() => props.data, (newData) => {
|
|
84
|
+
instance?.setData(newData);
|
|
85
|
+
}, { deep: true });
|
|
86
|
+
watch(() => props.filter, (newFilter) => {
|
|
87
|
+
if (newFilter) instance?.setFilter(newFilter);
|
|
88
|
+
}, { deep: true });
|
|
89
|
+
watch(() => props.theme, (newTheme) => {
|
|
90
|
+
instance?.setTheme(newTheme);
|
|
91
|
+
});
|
|
92
|
+
onUnmounted(() => {
|
|
93
|
+
instance?.destroy();
|
|
94
|
+
instance = null;
|
|
95
|
+
});
|
|
96
|
+
__expose({ getInstance: () => instance });
|
|
97
|
+
return (_ctx, _cache) => {
|
|
98
|
+
return openBlock(), createElementBlock("div", {
|
|
99
|
+
ref_key: "containerRef",
|
|
100
|
+
ref: containerRef,
|
|
101
|
+
class: "lv-vue-root"
|
|
102
|
+
}, null, 512);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
//#endregion
|
|
107
|
+
export { LogViewer_vue_vue_type_script_setup_true_lang_default as default };
|
|
108
|
+
/*! End of @composy/log-viewer-vue | Powered by @composy/builder */
|
|
109
|
+
//# sourceMappingURL=LogViewer.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogViewer.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/LogViewer.vue"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EAiBd,MAAM,OAAO;EASb,MAAM,eAAe,IAAwB,IAAI;EACjD,IAAI,WAAqC;EAEzC,gBAAgB;GACd,IAAI,CAAC,aAAa,OAAO;GAEzB,WAAW,gBAAgB;IACzB,WAAW,aAAa;IACxB,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,kBAAkB,MAAM;GAC1B,CAAC;GAED,SAAS,GAAG,gBAAgB,UAAoB,KAAK,eAAe,KAAK,CAAC;GAC1E,SAAS,GAAG,iBAAiB,UAAoB,KAAK,gBAAgB,KAAK,CAAC;GAC5E,SAAS,GAAG,mBAAmB,UAAoB,KAAK,kBAAkB,KAAK,CAAC;GAChF,SAAS,GAAG,kBAAkB,WAAyB,KAAK,iBAAiB,MAAM,CAAC;GACpF,SAAS,GAAG,iBAAiB,UAAqB,KAAK,gBAAgB,KAAK,CAAC;GAC7E,SAAS,GAAG,gBAAgB,SAAiB,KAAK,eAAe,IAAI,CAAC;EACxE,CAAC;EAED,YAAY,MAAM,OAAO,YAAY;GACnC,UAAU,QAAQ,OAAO;EAC3B,GAAG,EAAE,MAAM,KAAK,CAAC;EAEjB,YAAY,MAAM,SAAS,cAAc;GACvC,IAAI,WAAW,UAAU,UAAU,SAAS;EAC9C,GAAG,EAAE,MAAM,KAAK,CAAC;EAEjB,YAAY,MAAM,QAAQ,aAAa;GACrC,UAAU,SAAS,QAAQ;EAC7B,CAAC;EAED,kBAAkB;GAChB,UAAU,QAAQ;GAClB,WAAW;EACb,CAAC;EAED,SAAa,EACX,mBAAmB,SACrB,CAAC;;uBApFC,mBAAkD,OAAA;aAAzC;IAAJ,KAAI;IAAe,OAAM"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type LogViewer, type LogViewerConfig, type LogEntry, type FilterConfig, type ThemeMode, type PaginationConfig } from '@composy/log-viewer-core';
|
|
2
|
+
/**
|
|
3
|
+
* useLogViewer - use Log Viewer function
|
|
4
|
+
* @returns 返回值说明
|
|
5
|
+
*/
|
|
6
|
+
export declare function useLogViewer(): {
|
|
7
|
+
instance: import("vue").Ref<{
|
|
8
|
+
getData: () => LogEntry[];
|
|
9
|
+
setData: (entries: LogEntry[]) => void;
|
|
10
|
+
appendData: (entries: LogEntry[]) => void;
|
|
11
|
+
getFilter: () => FilterConfig;
|
|
12
|
+
setFilter: (filter: FilterConfig) => void;
|
|
13
|
+
resetFilter: () => void;
|
|
14
|
+
getTheme: () => ThemeMode;
|
|
15
|
+
setTheme: (theme: ThemeMode) => void;
|
|
16
|
+
expandEntry: (id: string) => void;
|
|
17
|
+
collapseEntry: (id: string) => void;
|
|
18
|
+
collapseAll: () => void;
|
|
19
|
+
goToPage: (page: number) => void;
|
|
20
|
+
getPagination: () => PaginationConfig;
|
|
21
|
+
on: (event: string, callback: (...args: unknown[]) => void) => () => void;
|
|
22
|
+
refresh: () => void;
|
|
23
|
+
destroy: () => void;
|
|
24
|
+
}, LogViewer | {
|
|
25
|
+
getData: () => LogEntry[];
|
|
26
|
+
setData: (entries: LogEntry[]) => void;
|
|
27
|
+
appendData: (entries: LogEntry[]) => void;
|
|
28
|
+
getFilter: () => FilterConfig;
|
|
29
|
+
setFilter: (filter: FilterConfig) => void;
|
|
30
|
+
resetFilter: () => void;
|
|
31
|
+
getTheme: () => ThemeMode;
|
|
32
|
+
setTheme: (theme: ThemeMode) => void;
|
|
33
|
+
expandEntry: (id: string) => void;
|
|
34
|
+
collapseEntry: (id: string) => void;
|
|
35
|
+
collapseAll: () => void;
|
|
36
|
+
goToPage: (page: number) => void;
|
|
37
|
+
getPagination: () => PaginationConfig;
|
|
38
|
+
on: (event: string, callback: (...args: unknown[]) => void) => () => void;
|
|
39
|
+
refresh: () => void;
|
|
40
|
+
destroy: () => void;
|
|
41
|
+
}>;
|
|
42
|
+
data: import("vue").Ref<{
|
|
43
|
+
id: string;
|
|
44
|
+
timestamp: string | number | Date;
|
|
45
|
+
user: string;
|
|
46
|
+
userId?: string;
|
|
47
|
+
action: import("@composy/log-viewer-core").ActionType;
|
|
48
|
+
module: string;
|
|
49
|
+
detail?: string;
|
|
50
|
+
ip?: string;
|
|
51
|
+
changes?: {
|
|
52
|
+
field: string;
|
|
53
|
+
label?: string;
|
|
54
|
+
oldValue: unknown;
|
|
55
|
+
newValue: unknown;
|
|
56
|
+
}[];
|
|
57
|
+
metadata?: Record<string, unknown>;
|
|
58
|
+
anomaly?: import("@composy/log-viewer-core").AnomalyType;
|
|
59
|
+
}[], LogEntry[] | {
|
|
60
|
+
id: string;
|
|
61
|
+
timestamp: string | number | Date;
|
|
62
|
+
user: string;
|
|
63
|
+
userId?: string;
|
|
64
|
+
action: import("@composy/log-viewer-core").ActionType;
|
|
65
|
+
module: string;
|
|
66
|
+
detail?: string;
|
|
67
|
+
ip?: string;
|
|
68
|
+
changes?: {
|
|
69
|
+
field: string;
|
|
70
|
+
label?: string;
|
|
71
|
+
oldValue: unknown;
|
|
72
|
+
newValue: unknown;
|
|
73
|
+
}[];
|
|
74
|
+
metadata?: Record<string, unknown>;
|
|
75
|
+
anomaly?: import("@composy/log-viewer-core").AnomalyType;
|
|
76
|
+
}[]>;
|
|
77
|
+
filter: import("vue").Ref<{
|
|
78
|
+
user?: string;
|
|
79
|
+
action?: import("@composy/log-viewer-core").ActionType | import("@composy/log-viewer-core").ActionType[];
|
|
80
|
+
module?: string;
|
|
81
|
+
ip?: string;
|
|
82
|
+
timeRange?: [Date | string | number, Date | string | number];
|
|
83
|
+
keyword?: string;
|
|
84
|
+
}, FilterConfig | {
|
|
85
|
+
user?: string;
|
|
86
|
+
action?: import("@composy/log-viewer-core").ActionType | import("@composy/log-viewer-core").ActionType[];
|
|
87
|
+
module?: string;
|
|
88
|
+
ip?: string;
|
|
89
|
+
timeRange?: [Date | string | number, Date | string | number];
|
|
90
|
+
keyword?: string;
|
|
91
|
+
}>;
|
|
92
|
+
theme: import("vue").Ref<ThemeMode, ThemeMode>;
|
|
93
|
+
pagination: import("vue").Ref<{
|
|
94
|
+
page: number;
|
|
95
|
+
pageSize: number;
|
|
96
|
+
total?: number;
|
|
97
|
+
}, PaginationConfig | {
|
|
98
|
+
page: number;
|
|
99
|
+
pageSize: number;
|
|
100
|
+
total?: number;
|
|
101
|
+
}>;
|
|
102
|
+
create: (container: HTMLElement | string, config?: Partial<LogViewerConfig>) => void;
|
|
103
|
+
setData: (entries: LogEntry[]) => void;
|
|
104
|
+
appendData: (entries: LogEntry[]) => void;
|
|
105
|
+
setFilter: (f: FilterConfig) => void;
|
|
106
|
+
resetFilter: () => void;
|
|
107
|
+
setTheme: (t: ThemeMode) => void;
|
|
108
|
+
expandEntry: (id: string) => void;
|
|
109
|
+
collapseEntry: (id: string) => void;
|
|
110
|
+
collapseAll: () => void;
|
|
111
|
+
goToPage: (page: number) => void;
|
|
112
|
+
refresh: () => void;
|
|
113
|
+
destroy: () => void;
|
|
114
|
+
on: (event: string, callback: (...args: unknown[]) => void) => () => void;
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=useLogViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogViewer.d.ts","sourceRoot":"","sources":["../../src/composables/useLogViewer.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,wBAAgB,YAAY;;;;;;;;;;;;;;;uCAyBV,GAAG;;;;;;;;;;;;;;;;;uCAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBQ,WAAW,GAAG,MAAM,WAAW,OAAO,CAAC,eAAe,CAAC;uBA+BxD,QAAQ,EAAE;0BAKP,QAAQ,EAAE;mBAKjB,YAAY;;kBAUb,SAAS;sBAKL,MAAM;wBAIJ,MAAM;;qBAQT,MAAM;;;gBAaX,MAAM,YAAY,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAG,MAAM,IAAI;EA4B/E"}
|