@yimou6/common-ui 1.13.11 → 1.13.13
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/cdn/index.cdn.js +14 -14
- package/cdn/index.cdn.js.map +1 -1
- package/cdn/index.cdn.mjs +14 -14
- package/cdn/index.cdn.mjs.map +1 -1
- package/cdn/index.css +1 -1
- package/es/components/monitor-playback/index.d.ts +208 -0
- package/es/components/monitor-playback/src/monitor-playback.vue.d.ts +208 -0
- package/es/components/monitor-playback/src/monitor-playback.vue2.mjs +55 -10
- package/es/components/monitor-playback/src/monitor-playback.vue2.mjs.map +1 -1
- package/es/components/page-header/src/page-header.vue2.mjs +3 -2
- package/es/components/page-header/src/page-header.vue2.mjs.map +1 -1
- package/lib/components/monitor-playback/index.d.ts +208 -0
- package/lib/components/monitor-playback/src/monitor-playback.vue.d.ts +208 -0
- package/lib/components/monitor-playback/src/monitor-playback.vue2.js +52 -7
- package/lib/components/monitor-playback/src/monitor-playback.vue2.js.map +1 -1
- package/lib/components/page-header/src/page-header.vue2.js +3 -2
- package/lib/components/page-header/src/page-header.vue2.js.map +1 -1
- package/package.json +1 -1
- package/theme-default/i-monitor-playback.css +1 -1
- package/theme-default/index.css +1 -1
|
@@ -426,6 +426,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
426
426
|
retryCount: number;
|
|
427
427
|
MAX_RETRY: number;
|
|
428
428
|
currentUrl: import("vue").Ref<string, string>;
|
|
429
|
+
starttimeDefault: import("vue").ComputedRef<string>;
|
|
430
|
+
datetimeValue: import("vue").Ref<string, string>;
|
|
431
|
+
onDatetimeChange: (val: string) => void;
|
|
429
432
|
playStartTimeMs: number;
|
|
430
433
|
lastPtsMs: number;
|
|
431
434
|
playTimerId: number | null;
|
|
@@ -440,6 +443,211 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
440
443
|
destroyPlayer: () => Promise<void>;
|
|
441
444
|
onTimelineSeek: (sec: number) => void;
|
|
442
445
|
startPlayTimer: () => void;
|
|
446
|
+
IDatePicker: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
447
|
+
modelValue: {
|
|
448
|
+
type: import("vue").PropType<string | string[]>;
|
|
449
|
+
default: null;
|
|
450
|
+
};
|
|
451
|
+
placeholder: {
|
|
452
|
+
type: StringConstructor;
|
|
453
|
+
default: string;
|
|
454
|
+
};
|
|
455
|
+
startPlaceholder: {
|
|
456
|
+
type: StringConstructor;
|
|
457
|
+
default: string;
|
|
458
|
+
};
|
|
459
|
+
endPlaceholder: {
|
|
460
|
+
type: StringConstructor;
|
|
461
|
+
default: string;
|
|
462
|
+
};
|
|
463
|
+
disabled: {
|
|
464
|
+
type: BooleanConstructor;
|
|
465
|
+
default: boolean;
|
|
466
|
+
};
|
|
467
|
+
clearable: {
|
|
468
|
+
type: BooleanConstructor;
|
|
469
|
+
default: boolean;
|
|
470
|
+
};
|
|
471
|
+
size: {
|
|
472
|
+
type: StringConstructor;
|
|
473
|
+
};
|
|
474
|
+
type: {
|
|
475
|
+
type: StringConstructor;
|
|
476
|
+
default: string;
|
|
477
|
+
};
|
|
478
|
+
format: {
|
|
479
|
+
type: StringConstructor;
|
|
480
|
+
default: null;
|
|
481
|
+
};
|
|
482
|
+
valueFormat: {
|
|
483
|
+
type: StringConstructor;
|
|
484
|
+
default: null;
|
|
485
|
+
};
|
|
486
|
+
shortcuts: {
|
|
487
|
+
type: import("vue").PropType<import("../../date-picker/src/date-picker").Shortcuts[]>;
|
|
488
|
+
default: () => never[];
|
|
489
|
+
};
|
|
490
|
+
disabledDate: {
|
|
491
|
+
type: FunctionConstructor;
|
|
492
|
+
default: () => boolean;
|
|
493
|
+
};
|
|
494
|
+
rangeSeparator: {
|
|
495
|
+
type: StringConstructor;
|
|
496
|
+
default: string;
|
|
497
|
+
};
|
|
498
|
+
}>, {
|
|
499
|
+
MonthPicker: any;
|
|
500
|
+
QuarterPicker: any;
|
|
501
|
+
RangePicker: any;
|
|
502
|
+
WeekPicker: any;
|
|
503
|
+
YearPicker: any;
|
|
504
|
+
props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
|
|
505
|
+
modelValue: {
|
|
506
|
+
type: import("vue").PropType<string | string[]>;
|
|
507
|
+
default: null;
|
|
508
|
+
};
|
|
509
|
+
placeholder: {
|
|
510
|
+
type: StringConstructor;
|
|
511
|
+
default: string;
|
|
512
|
+
};
|
|
513
|
+
startPlaceholder: {
|
|
514
|
+
type: StringConstructor;
|
|
515
|
+
default: string;
|
|
516
|
+
};
|
|
517
|
+
endPlaceholder: {
|
|
518
|
+
type: StringConstructor;
|
|
519
|
+
default: string;
|
|
520
|
+
};
|
|
521
|
+
disabled: {
|
|
522
|
+
type: BooleanConstructor;
|
|
523
|
+
default: boolean;
|
|
524
|
+
};
|
|
525
|
+
clearable: {
|
|
526
|
+
type: BooleanConstructor;
|
|
527
|
+
default: boolean;
|
|
528
|
+
};
|
|
529
|
+
size: {
|
|
530
|
+
type: StringConstructor;
|
|
531
|
+
};
|
|
532
|
+
type: {
|
|
533
|
+
type: StringConstructor;
|
|
534
|
+
default: string;
|
|
535
|
+
};
|
|
536
|
+
format: {
|
|
537
|
+
type: StringConstructor;
|
|
538
|
+
default: null;
|
|
539
|
+
};
|
|
540
|
+
valueFormat: {
|
|
541
|
+
type: StringConstructor;
|
|
542
|
+
default: null;
|
|
543
|
+
};
|
|
544
|
+
shortcuts: {
|
|
545
|
+
type: import("vue").PropType<import("../../date-picker/src/date-picker").Shortcuts[]>;
|
|
546
|
+
default: () => never[];
|
|
547
|
+
};
|
|
548
|
+
disabledDate: {
|
|
549
|
+
type: FunctionConstructor;
|
|
550
|
+
default: () => boolean;
|
|
551
|
+
};
|
|
552
|
+
rangeSeparator: {
|
|
553
|
+
type: StringConstructor;
|
|
554
|
+
default: string;
|
|
555
|
+
};
|
|
556
|
+
}>> & Readonly<{
|
|
557
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
558
|
+
onChange?: ((...args: any[]) => any) | undefined;
|
|
559
|
+
onClear?: ((...args: any[]) => any) | undefined;
|
|
560
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
561
|
+
}> & {}>;
|
|
562
|
+
inputValue: import("vue").Ref<string | string[], string | string[]>;
|
|
563
|
+
emit: (event: "clear" | "update:modelValue" | "change" | "select", ...args: any[]) => void;
|
|
564
|
+
onChange: (value: any) => void;
|
|
565
|
+
onSelect: (value: any) => void;
|
|
566
|
+
realShortcuts: import("vue").ComputedRef<{
|
|
567
|
+
label: string | undefined;
|
|
568
|
+
value: any;
|
|
569
|
+
}[]>;
|
|
570
|
+
defaultProps: import("vue").ComputedRef<{
|
|
571
|
+
format: string;
|
|
572
|
+
valueFormat: string;
|
|
573
|
+
shortcuts: {
|
|
574
|
+
label: string | undefined;
|
|
575
|
+
value: any;
|
|
576
|
+
}[];
|
|
577
|
+
}>;
|
|
578
|
+
realPlaceholder: import("vue").ComputedRef<string | string[]>;
|
|
579
|
+
readonly DatePicker: any;
|
|
580
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("clear" | "update:modelValue" | "change" | "select")[], "clear" | "update:modelValue" | "change" | "select", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
581
|
+
modelValue: {
|
|
582
|
+
type: import("vue").PropType<string | string[]>;
|
|
583
|
+
default: null;
|
|
584
|
+
};
|
|
585
|
+
placeholder: {
|
|
586
|
+
type: StringConstructor;
|
|
587
|
+
default: string;
|
|
588
|
+
};
|
|
589
|
+
startPlaceholder: {
|
|
590
|
+
type: StringConstructor;
|
|
591
|
+
default: string;
|
|
592
|
+
};
|
|
593
|
+
endPlaceholder: {
|
|
594
|
+
type: StringConstructor;
|
|
595
|
+
default: string;
|
|
596
|
+
};
|
|
597
|
+
disabled: {
|
|
598
|
+
type: BooleanConstructor;
|
|
599
|
+
default: boolean;
|
|
600
|
+
};
|
|
601
|
+
clearable: {
|
|
602
|
+
type: BooleanConstructor;
|
|
603
|
+
default: boolean;
|
|
604
|
+
};
|
|
605
|
+
size: {
|
|
606
|
+
type: StringConstructor;
|
|
607
|
+
};
|
|
608
|
+
type: {
|
|
609
|
+
type: StringConstructor;
|
|
610
|
+
default: string;
|
|
611
|
+
};
|
|
612
|
+
format: {
|
|
613
|
+
type: StringConstructor;
|
|
614
|
+
default: null;
|
|
615
|
+
};
|
|
616
|
+
valueFormat: {
|
|
617
|
+
type: StringConstructor;
|
|
618
|
+
default: null;
|
|
619
|
+
};
|
|
620
|
+
shortcuts: {
|
|
621
|
+
type: import("vue").PropType<import("../../date-picker/src/date-picker").Shortcuts[]>;
|
|
622
|
+
default: () => never[];
|
|
623
|
+
};
|
|
624
|
+
disabledDate: {
|
|
625
|
+
type: FunctionConstructor;
|
|
626
|
+
default: () => boolean;
|
|
627
|
+
};
|
|
628
|
+
rangeSeparator: {
|
|
629
|
+
type: StringConstructor;
|
|
630
|
+
default: string;
|
|
631
|
+
};
|
|
632
|
+
}>> & Readonly<{
|
|
633
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
634
|
+
onChange?: ((...args: any[]) => any) | undefined;
|
|
635
|
+
onClear?: ((...args: any[]) => any) | undefined;
|
|
636
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
637
|
+
}>, {
|
|
638
|
+
modelValue: string | string[];
|
|
639
|
+
format: string;
|
|
640
|
+
type: string;
|
|
641
|
+
disabled: boolean;
|
|
642
|
+
placeholder: string;
|
|
643
|
+
startPlaceholder: string;
|
|
644
|
+
endPlaceholder: string;
|
|
645
|
+
clearable: boolean;
|
|
646
|
+
valueFormat: string;
|
|
647
|
+
shortcuts: import("../../date-picker/src/date-picker").Shortcuts[];
|
|
648
|
+
disabledDate: Function;
|
|
649
|
+
rangeSeparator: string;
|
|
650
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
443
651
|
ITimelineRuler: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
444
652
|
startTime: {
|
|
445
653
|
type: DateConstructor;
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import { defineComponent, ref, onMounted, onBeforeUnmount, openBlock, createElementBlock, createCommentVNode, createElementVNode, withDirectives, vShow, toDisplayString
|
|
1
|
+
import { defineComponent, ref, computed, onMounted, onBeforeUnmount, openBlock, createElementBlock, createCommentVNode, createElementVNode, createVNode, withDirectives, vShow, toDisplayString } from 'vue';
|
|
2
|
+
import '../../date-picker/src/date-picker.vue.mjs';
|
|
2
3
|
import '../timeline-ruler/src/timeline-ruler.vue.mjs';
|
|
3
4
|
import { MonitorPlaybackProps } from './monitor-playback.mjs';
|
|
4
|
-
import _sfc_main$1 from '
|
|
5
|
+
import _sfc_main$1 from '../../date-picker/src/date-picker.vue2.mjs';
|
|
6
|
+
import _sfc_main$2 from '../timeline-ruler/src/timeline-ruler.vue2.mjs';
|
|
5
7
|
|
|
6
8
|
var __defProp = Object.defineProperty;
|
|
7
9
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
10
|
const _hoisted_1 = { class: "replay-page" };
|
|
9
|
-
const _hoisted_2 = { class: "
|
|
10
|
-
const _hoisted_3 = {
|
|
11
|
+
const _hoisted_2 = { class: "replay-toolbar" };
|
|
12
|
+
const _hoisted_3 = { class: "player-wrap" };
|
|
13
|
+
const _hoisted_4 = {
|
|
11
14
|
key: 0,
|
|
12
15
|
class: "player-error"
|
|
13
16
|
};
|
|
14
|
-
const
|
|
17
|
+
const _hoisted_5 = { class: "player-error__text" };
|
|
15
18
|
const MAX_RETRY = 3;
|
|
16
19
|
var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
17
20
|
...{
|
|
@@ -32,6 +35,31 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
32
35
|
const currentUrl = ref(
|
|
33
36
|
props.url || "ws://cms.abaixun.com/websocket/0402b0580060f0df/0000000001.flv?starttime=20260502T150217&duration=3600&uuid=s1vwaoh0rse31rpgars33u1d68384buc"
|
|
34
37
|
);
|
|
38
|
+
const starttimeDefault = computed(() => {
|
|
39
|
+
const m = currentUrl.value.match(/starttime=(\d{8}T\d{6})/i);
|
|
40
|
+
if (m) {
|
|
41
|
+
const raw = m[1];
|
|
42
|
+
const y = raw.slice(0, 4);
|
|
43
|
+
const mo = raw.slice(4, 6);
|
|
44
|
+
const d = raw.slice(6, 8);
|
|
45
|
+
const h = raw.slice(9, 11);
|
|
46
|
+
const mi = raw.slice(11, 13);
|
|
47
|
+
const s = raw.slice(13, 15);
|
|
48
|
+
return `${y}-${mo}-${d} ${h}:${mi}:${s}`;
|
|
49
|
+
}
|
|
50
|
+
return "";
|
|
51
|
+
});
|
|
52
|
+
const datetimeValue = ref(starttimeDefault.value);
|
|
53
|
+
function onDatetimeChange(val) {
|
|
54
|
+
if (!val) return;
|
|
55
|
+
const ts = val.replace(/[- :]/g, "").replace(/(\d{8})(\d{6})/, "$1T$2");
|
|
56
|
+
currentUrl.value = currentUrl.value.replace(
|
|
57
|
+
/starttime=\d{8}T\d{6}/i,
|
|
58
|
+
`starttime=${ts}`
|
|
59
|
+
);
|
|
60
|
+
commitWithTime(Math.floor(new Date(val.replace(" ", "T")).getTime() / 1e3));
|
|
61
|
+
}
|
|
62
|
+
__name(onDatetimeChange, "onDatetimeChange");
|
|
35
63
|
let playStartTimeMs = 0;
|
|
36
64
|
let lastPtsMs = 0;
|
|
37
65
|
let playTimerId = null;
|
|
@@ -218,8 +246,25 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
218
246
|
});
|
|
219
247
|
return (_ctx, _cache) => {
|
|
220
248
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
221
|
-
createCommentVNode(" \
|
|
249
|
+
createCommentVNode(" \u65E5\u671F\u65F6\u95F4\u9009\u62E9\u5668 "),
|
|
222
250
|
createElementVNode("div", _hoisted_2, [
|
|
251
|
+
_cache[1] || (_cache[1] = createElementVNode(
|
|
252
|
+
"span",
|
|
253
|
+
{ class: "replay-toolbar__label" },
|
|
254
|
+
"\u56DE\u653E\u5F00\u59CB\u65F6\u95F4",
|
|
255
|
+
-1
|
|
256
|
+
/* CACHED */
|
|
257
|
+
)),
|
|
258
|
+
createVNode(_sfc_main$1, {
|
|
259
|
+
modelValue: datetimeValue.value,
|
|
260
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => datetimeValue.value = $event),
|
|
261
|
+
type: "datetime",
|
|
262
|
+
"value-format": "YYYY-MM-DD HH:mm:ss",
|
|
263
|
+
onChange: onDatetimeChange
|
|
264
|
+
}, null, 8, ["modelValue"])
|
|
265
|
+
]),
|
|
266
|
+
createCommentVNode(" \u64AD\u653E\u5668 "),
|
|
267
|
+
createElementVNode("div", _hoisted_3, [
|
|
223
268
|
withDirectives(createElementVNode(
|
|
224
269
|
"div",
|
|
225
270
|
{
|
|
@@ -233,8 +278,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
233
278
|
), [
|
|
234
279
|
[vShow, !errorMsg.value]
|
|
235
280
|
]),
|
|
236
|
-
errorMsg.value ? (openBlock(), createElementBlock("div",
|
|
237
|
-
_cache[
|
|
281
|
+
errorMsg.value ? (openBlock(), createElementBlock("div", _hoisted_4, [
|
|
282
|
+
_cache[2] || (_cache[2] = createElementVNode(
|
|
238
283
|
"div",
|
|
239
284
|
{ class: "player-error__icon" },
|
|
240
285
|
"\u26A0",
|
|
@@ -243,7 +288,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
243
288
|
)),
|
|
244
289
|
createElementVNode(
|
|
245
290
|
"div",
|
|
246
|
-
|
|
291
|
+
_hoisted_5,
|
|
247
292
|
toDisplayString(errorMsg.value),
|
|
248
293
|
1
|
|
249
294
|
/* TEXT */
|
|
@@ -252,7 +297,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
252
297
|
]),
|
|
253
298
|
createCommentVNode(" \u523B\u5EA6\u5C3A\u65F6\u95F4\u8F74 "),
|
|
254
299
|
createVNode(
|
|
255
|
-
_sfc_main$
|
|
300
|
+
_sfc_main$2,
|
|
256
301
|
{
|
|
257
302
|
ref_key: "timelineRef",
|
|
258
303
|
ref: timelineRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor-playback.vue2.mjs","sources":["../../../../../../../packages/components/monitor-playback/src/monitor-playback.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref } from \"vue\";\nimport ITimelineRuler from \"../timeline-ruler/src/timeline-ruler.vue\";\nimport { MonitorPlaybackProps } from \"./monitor-playback\";\n\ndefineOptions({\n name: \"IMonitorPlayback\",\n});\n\n// ==================== Props / State ====================\nconst props = defineProps(MonitorPlaybackProps);\n\n// ==================== DOM Refs ====================\nconst playerContainerRef = ref<HTMLDivElement | null>(null);\nconst timelineRef = ref<InstanceType<typeof ITimelineRuler> | null>(null);\n\n// ==================== UI State ====================\nconst kbpsInfo = ref(\"-- KB/s\");\nconst overlayTimeText = ref(\"2026-05-02 15:02:17\");\nconst errorMsg = ref(\"\");\n\n// ==================== Player State ====================\nlet jessibuca: any = null;\nlet isDestroying = false;\nlet retryCount = 0;\nconst MAX_RETRY = 3;\nconst currentUrl = ref(\n props.url ||\n \"ws://cms.abaixun.com/websocket/0402b0580060f0df/0000000001.flv?starttime=20260502T150217&duration=3600&uuid=s1vwaoh0rse31rpgars33u1d68384buc\",\n);\n\n// 记录播放起始时间,用于结合 timeUpdate 计算当前播放进度\nlet playStartTimeMs = 0;\nlet lastPtsMs = 0;\n\n// Timer ref\nlet playTimerId: ReturnType<typeof setInterval> | null = null;\n\n// ==================== Utils ====================\nfunction pad(n: number) {\n return String(n).padStart(2, \"0\");\n}\n\nfunction syncStartTimeToUrl(unixSec: number) {\n const d = new Date(unixSec * 1000);\n const val = `${\n pad(d.getFullYear()) + pad(d.getMonth() + 1) + pad(d.getDate())\n }T${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n currentUrl.value = currentUrl.value.replace(\n /starttime=\\d{8}T\\d{6}/i,\n `starttime=${val}`,\n );\n}\n\nfunction commitWithTime(sec: number) {\n syncStartTimeToUrl(sec);\n playStream(currentUrl.value);\n}\n\nfunction fmtTF(s: number) {\n const d = new Date(s * 1000);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction fmtD(s: number) {\n const d = new Date(s * 1000);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n// ==================== Player Functions ====================\nfunction parseStartTime(url: string): Date | number | null {\n const m = url.match(/starttime=(\\d{8}T\\d{6})/i);\n if (m)\n return new Date(\n m[1].replace(\n /^(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})/,\n \"$1-$2-$3T$4:$5:$6\",\n ),\n );\n const dm = url.match(/duration=(\\d+)/i);\n if (dm) return parseInt(dm[1]);\n return null;\n}\n\nasync function playStream(url: string) {\n if (!url) return;\n\n // 如果正在销毁,延迟等待后再执行\n if (isDestroying) {\n await new Promise<void>((r) => setTimeout(r, 600));\n return playStream(url);\n }\n\n await destroyPlayer();\n errorMsg.value = \"\";\n\n const st = parseStartTime(url);\n let dur = 3600;\n const dm = url.match(/duration=(\\d+)/i);\n if (dm) dur = parseInt(dm[1]);\n\n // 记录播放起始时间\n if (st instanceof Date) {\n playStartTimeMs = st.getTime();\n }\n\n if (st && timelineRef.value) {\n timelineRef.value.initRuler(st as Date, dur);\n }\n\n // 创建 Jessibuca 实例\n createJessibuca(url);\n}\n\nfunction createJessibuca(url: string) {\n const win = window as any;\n if (!win.Jessibuca) {\n errorMsg.value = \"Jessibuca 播放器未加载\";\n return;\n }\n\n jessibuca = new win.Jessibuca({\n container: playerContainerRef.value!,\n decoder: \"./plugins/jessibuca/decoder.js\",\n videoBuffer: 0.2,\n isResize: false,\n isFullResize: false,\n hasAudio: true,\n debug: props.debug,\n supportDblclickFullscreen: true,\n showBandwidth: true,\n operateBtns: {\n fullscreen: true,\n screenshot: true,\n play: true,\n audio: true,\n record: true,\n },\n // 优先使用 WASM 软解,支持 H.265\n useMSE: false,\n useWCS: false,\n autoWasm: true,\n isNotMute: false,\n timeout: 10,\n heartTimeout: 10,\n loadingTimeout: 10,\n heartTimeoutReplay: true,\n heartTimeoutReplayTimes: MAX_RETRY,\n loadingTimeoutReplay: true,\n loadingTimeoutReplayTimes: MAX_RETRY,\n });\n\n // ---- 事件监听 ----\n jessibuca.on(\"play\", () => {\n retryCount = 0;\n });\n\n jessibuca.on(\"timeUpdate\", (ts: number) => {\n // ts 是当前帧的 pts(毫秒)\n lastPtsMs = ts;\n });\n\n jessibuca.on(\"kBps\", (kbps: number) => {\n kbpsInfo.value = `${Math.round(kbps)}KB/s`;\n });\n\n jessibuca.on(\"videoInfo\", (info: any) => {\n if (props.debug) {\n console.log(\"[Jessibuca] videoInfo:\", info);\n }\n });\n\n jessibuca.on(\"error\", (err: any) => {\n console.error(\"[Jessibuca] error:\", err);\n const errCode = err?.code || \"\";\n const errMsg = String(err?.message || err || \"\");\n if (\n errCode === \"mediaSourceH265NotSupport\" ||\n errCode === \"webcodecsH265NotSupport\" ||\n errMsg.includes(\"H265\") ||\n errMsg.includes(\"h265\") ||\n errMsg.includes(\"HEVC\")\n ) {\n errorMsg.value =\n \"当前浏览器不支持 H.265/HEVC 编码播放,请使用支持 HEVC 硬解的浏览器\";\n destroyPlayer();\n }\n });\n\n jessibuca.on(\"timeout\", () => {\n if (retryCount < MAX_RETRY) {\n retryCount++;\n console.warn(`[Jessibuca] 超时,第 ${retryCount}/${MAX_RETRY} 次重试...`);\n // Jessibuca 内置重连,此处仅记录\n }\n });\n\n jessibuca.on(\"streamEnd\", () => {\n if (props.debug) {\n console.log(\"[Jessibuca] streamEnd: 流结束\");\n }\n });\n\n // 开始播放\n jessibuca.play(url);\n}\n\nasync function destroyPlayer() {\n if (!jessibuca) return;\n isDestroying = true;\n try {\n await jessibuca.destroy();\n } catch (_e) {}\n jessibuca = null;\n\n // destroy 完成后再清理容器内残留 DOM,避免 removeChild 冲突\n const container = playerContainerRef.value;\n if (container) {\n container.innerHTML = \"\";\n }\n\n // 等待 WebGL/Worker 资源释放\n await new Promise<void>((r) => setTimeout(r, 200));\n isDestroying = false;\n}\n\n/** 时间轴 seek 跳转 */\nfunction onTimelineSeek(sec: number) {\n commitWithTime(sec);\n}\n\n// ==================== Lifecycle ====================\nonMounted(() => {\n const win = window as any;\n if (!win.Jessibuca) {\n errorMsg.value =\n \"Jessibuca 播放器未加载,请检查 HTML 是否引入了 jessibuca.js\";\n return;\n }\n playStream(currentUrl.value);\n startPlayTimer();\n});\n\n/** 定时同步播放进度到时间轴 */\nfunction startPlayTimer() {\n playTimerId = setInterval(() => {\n if (!jessibuca || !timelineRef.value) return;\n\n // 使用 playStartTimeMs + lastPtsMs 计算当前播放时间\n // 对于回放流,pts 通常是从0开始的偏移量\n if (playStartTimeMs > 0 && lastPtsMs >= 0) {\n const timeMs = playStartTimeMs + lastPtsMs;\n timelineRef.value.updateRulerTime(timeMs);\n timelineRef.value.autoFollow();\n\n // 更新叠加时间\n overlayTimeText.value = `${fmtD(timeMs / 1000)} ${fmtTF(timeMs / 1000)}`;\n }\n }, 250);\n}\n\nonBeforeUnmount(() => {\n if (playTimerId) clearInterval(playTimerId);\n destroyPlayer();\n});\n</script>\n\n<template>\n <div class=\"replay-page\">\n <!-- 播放器 -->\n <div class=\"player-wrap\">\n <div\n v-show=\"!errorMsg\"\n ref=\"playerContainerRef\"\n class=\"jessibuca-container\"\n />\n <div v-if=\"errorMsg\" class=\"player-error\">\n <div class=\"player-error__icon\">⚠</div>\n <div class=\"player-error__text\">{{ errorMsg }}</div>\n </div>\n </div>\n\n <!-- 刻度尺时间轴 -->\n <ITimelineRuler ref=\"timelineRef\" @seek=\"onTimelineSeek\" />\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_createCommentVNode","_createElementVNode","_toDisplayString","_createVNode","ITimelineRuler"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"monitor-playback.vue2.mjs","sources":["../../../../../../../packages/components/monitor-playback/src/monitor-playback.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from \"vue\";\nimport IDatePicker from \"../../date-picker/src/date-picker.vue\";\nimport ITimelineRuler from \"../timeline-ruler/src/timeline-ruler.vue\";\nimport { MonitorPlaybackProps } from \"./monitor-playback\";\n\ndefineOptions({\n name: \"IMonitorPlayback\",\n});\n\n// ==================== Props / State ====================\nconst props = defineProps(MonitorPlaybackProps);\n\n// ==================== DOM Refs ====================\nconst playerContainerRef = ref<HTMLDivElement | null>(null);\nconst timelineRef = ref<InstanceType<typeof ITimelineRuler> | null>(null);\n\n// ==================== UI State ====================\nconst kbpsInfo = ref(\"-- KB/s\");\nconst overlayTimeText = ref(\"2026-05-02 15:02:17\");\nconst errorMsg = ref(\"\");\n\n// ==================== Player State ====================\nlet jessibuca: any = null;\nlet isDestroying = false;\nlet retryCount = 0;\nconst MAX_RETRY = 3;\nconst currentUrl = ref(\n props.url ||\n \"ws://cms.abaixun.com/websocket/0402b0580060f0df/0000000001.flv?starttime=20260502T150217&duration=3600&uuid=s1vwaoh0rse31rpgars33u1d68384buc\",\n);\n\n// 日期时间选择器 - 从 currentUrl 的 starttime 解析初始值\nconst starttimeDefault = computed(() => {\n const m = currentUrl.value.match(/starttime=(\\d{8}T\\d{6})/i);\n if (m) {\n const raw = m[1]; // 20260502T150217\n const y = raw.slice(0, 4);\n const mo = raw.slice(4, 6);\n const d = raw.slice(6, 8);\n const h = raw.slice(9, 11);\n const mi = raw.slice(11, 13);\n const s = raw.slice(13, 15);\n return `${y}-${mo}-${d} ${h}:${mi}:${s}`; // 2026-05-02 15:02:17\n }\n return \"\";\n});\nconst datetimeValue = ref(starttimeDefault.value);\n\n// 日期时间变更 → 更新 URL 并重新播放\nfunction onDatetimeChange(val: string) {\n if (!val) return;\n // \"2026-05-02 15:02:17\" → \"20260502T150217\"\n const ts = val.replace(/[- :]/g, \"\").replace(/(\\d{8})(\\d{6})/, \"$1T$2\");\n currentUrl.value = currentUrl.value.replace(\n /starttime=\\d{8}T\\d{6}/i,\n `starttime=${ts}`,\n );\n commitWithTime(Math.floor(new Date(val.replace(\" \", \"T\")).getTime() / 1000));\n}\n\n// 记录播放起始时间,用于结合 timeUpdate 计算当前播放进度\nlet playStartTimeMs = 0;\nlet lastPtsMs = 0;\n\n// Timer ref\nlet playTimerId: ReturnType<typeof setInterval> | null = null;\n\n// ==================== Utils ====================\nfunction pad(n: number) {\n return String(n).padStart(2, \"0\");\n}\n\nfunction syncStartTimeToUrl(unixSec: number) {\n const d = new Date(unixSec * 1000);\n const val = `${\n pad(d.getFullYear()) + pad(d.getMonth() + 1) + pad(d.getDate())\n }T${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n currentUrl.value = currentUrl.value.replace(\n /starttime=\\d{8}T\\d{6}/i,\n `starttime=${val}`,\n );\n}\n\nfunction commitWithTime(sec: number) {\n syncStartTimeToUrl(sec);\n playStream(currentUrl.value);\n}\n\nfunction fmtTF(s: number) {\n const d = new Date(s * 1000);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction fmtD(s: number) {\n const d = new Date(s * 1000);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n// ==================== Player Functions ====================\nfunction parseStartTime(url: string): Date | number | null {\n const m = url.match(/starttime=(\\d{8}T\\d{6})/i);\n if (m)\n return new Date(\n m[1].replace(\n /^(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})/,\n \"$1-$2-$3T$4:$5:$6\",\n ),\n );\n const dm = url.match(/duration=(\\d+)/i);\n if (dm) return parseInt(dm[1]);\n return null;\n}\n\nasync function playStream(url: string) {\n if (!url) return;\n\n // 如果正在销毁,延迟等待后再执行\n if (isDestroying) {\n await new Promise<void>((r) => setTimeout(r, 600));\n return playStream(url);\n }\n\n await destroyPlayer();\n errorMsg.value = \"\";\n\n const st = parseStartTime(url);\n let dur = 3600;\n const dm = url.match(/duration=(\\d+)/i);\n if (dm) dur = parseInt(dm[1]);\n\n // 记录播放起始时间\n if (st instanceof Date) {\n playStartTimeMs = st.getTime();\n }\n\n if (st && timelineRef.value) {\n timelineRef.value.initRuler(st as Date, dur);\n }\n\n // 创建 Jessibuca 实例\n createJessibuca(url);\n}\n\nfunction createJessibuca(url: string) {\n const win = window as any;\n if (!win.Jessibuca) {\n errorMsg.value = \"Jessibuca 播放器未加载\";\n return;\n }\n\n jessibuca = new win.Jessibuca({\n container: playerContainerRef.value!,\n decoder: \"./plugins/jessibuca/decoder.js\",\n videoBuffer: 0.2,\n isResize: false,\n isFullResize: false,\n hasAudio: true,\n debug: props.debug,\n supportDblclickFullscreen: true,\n showBandwidth: true,\n operateBtns: {\n fullscreen: true,\n screenshot: true,\n play: true,\n audio: true,\n record: true,\n },\n // 优先使用 WASM 软解,支持 H.265\n useMSE: false,\n useWCS: false,\n autoWasm: true,\n isNotMute: false,\n timeout: 10,\n heartTimeout: 10,\n loadingTimeout: 10,\n heartTimeoutReplay: true,\n heartTimeoutReplayTimes: MAX_RETRY,\n loadingTimeoutReplay: true,\n loadingTimeoutReplayTimes: MAX_RETRY,\n });\n\n // ---- 事件监听 ----\n jessibuca.on(\"play\", () => {\n retryCount = 0;\n });\n\n jessibuca.on(\"timeUpdate\", (ts: number) => {\n // ts 是当前帧的 pts(毫秒)\n lastPtsMs = ts;\n });\n\n jessibuca.on(\"kBps\", (kbps: number) => {\n kbpsInfo.value = `${Math.round(kbps)}KB/s`;\n });\n\n jessibuca.on(\"videoInfo\", (info: any) => {\n if (props.debug) {\n console.log(\"[Jessibuca] videoInfo:\", info);\n }\n });\n\n jessibuca.on(\"error\", (err: any) => {\n console.error(\"[Jessibuca] error:\", err);\n const errCode = err?.code || \"\";\n const errMsg = String(err?.message || err || \"\");\n if (\n errCode === \"mediaSourceH265NotSupport\" ||\n errCode === \"webcodecsH265NotSupport\" ||\n errMsg.includes(\"H265\") ||\n errMsg.includes(\"h265\") ||\n errMsg.includes(\"HEVC\")\n ) {\n errorMsg.value =\n \"当前浏览器不支持 H.265/HEVC 编码播放,请使用支持 HEVC 硬解的浏览器\";\n destroyPlayer();\n }\n });\n\n jessibuca.on(\"timeout\", () => {\n if (retryCount < MAX_RETRY) {\n retryCount++;\n console.warn(`[Jessibuca] 超时,第 ${retryCount}/${MAX_RETRY} 次重试...`);\n // Jessibuca 内置重连,此处仅记录\n }\n });\n\n jessibuca.on(\"streamEnd\", () => {\n if (props.debug) {\n console.log(\"[Jessibuca] streamEnd: 流结束\");\n }\n });\n\n // 开始播放\n jessibuca.play(url);\n}\n\nasync function destroyPlayer() {\n if (!jessibuca) return;\n isDestroying = true;\n try {\n await jessibuca.destroy();\n } catch (_e) {}\n jessibuca = null;\n\n // destroy 完成后再清理容器内残留 DOM,避免 removeChild 冲突\n const container = playerContainerRef.value;\n if (container) {\n container.innerHTML = \"\";\n }\n\n // 等待 WebGL/Worker 资源释放\n await new Promise<void>((r) => setTimeout(r, 200));\n isDestroying = false;\n}\n\n/** 时间轴 seek 跳转 */\nfunction onTimelineSeek(sec: number) {\n commitWithTime(sec);\n}\n\n// ==================== Lifecycle ====================\nonMounted(() => {\n const win = window as any;\n if (!win.Jessibuca) {\n errorMsg.value =\n \"Jessibuca 播放器未加载,请检查 HTML 是否引入了 jessibuca.js\";\n return;\n }\n playStream(currentUrl.value);\n startPlayTimer();\n});\n\n/** 定时同步播放进度到时间轴 */\nfunction startPlayTimer() {\n playTimerId = setInterval(() => {\n if (!jessibuca || !timelineRef.value) return;\n\n // 使用 playStartTimeMs + lastPtsMs 计算当前播放时间\n // 对于回放流,pts 通常是从0开始的偏移量\n if (playStartTimeMs > 0 && lastPtsMs >= 0) {\n const timeMs = playStartTimeMs + lastPtsMs;\n timelineRef.value.updateRulerTime(timeMs);\n timelineRef.value.autoFollow();\n\n // 更新叠加时间\n overlayTimeText.value = `${fmtD(timeMs / 1000)} ${fmtTF(timeMs / 1000)}`;\n }\n }, 250);\n}\n\nonBeforeUnmount(() => {\n if (playTimerId) clearInterval(playTimerId);\n destroyPlayer();\n});\n</script>\n\n<template>\n <div class=\"replay-page\">\n <!-- 日期时间选择器 -->\n <div class=\"replay-toolbar\">\n <span class=\"replay-toolbar__label\">回放开始时间</span>\n <IDatePicker\n v-model=\"datetimeValue\"\n type=\"datetime\"\n value-format=\"YYYY-MM-DD HH:mm:ss\"\n @change=\"onDatetimeChange\"\n />\n </div>\n\n <!-- 播放器 -->\n <div class=\"player-wrap\">\n <div\n v-show=\"!errorMsg\"\n ref=\"playerContainerRef\"\n class=\"jessibuca-container\"\n />\n <div v-if=\"errorMsg\" class=\"player-error\">\n <div class=\"player-error__icon\">⚠</div>\n <div class=\"player-error__text\">{{ errorMsg }}</div>\n </div>\n </div>\n\n <!-- 刻度尺时间轴 -->\n <ITimelineRuler ref=\"timelineRef\" @seek=\"onTimelineSeek\" />\n </div>\n</template>\n\n<style scoped></style>\n"],"names":["_openBlock","_createElementBlock","_createCommentVNode","_createElementVNode","_createVNode","IDatePicker","_toDisplayString","ITimelineRuler"],"mappings":"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"}
|
|
@@ -16,10 +16,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
16
16
|
const menuStore = inject(MENU_STORE);
|
|
17
17
|
const headerText = ref("");
|
|
18
18
|
function setHeaderText() {
|
|
19
|
-
var _a, _b, _c;
|
|
19
|
+
var _a, _b, _c, _d;
|
|
20
20
|
if (props.title) return props.title;
|
|
21
21
|
if (props.action) return ((_b = (_a = props.action) == null ? void 0 : _a.getCurrentMenu()) == null ? void 0 : _b.label) || "";
|
|
22
|
-
if (menuStore)
|
|
22
|
+
if (menuStore)
|
|
23
|
+
return ((_c = menuStore.getCurrentMenu()) == null ? void 0 : _c.label) || ((_d = menuStore.getCurrentMenu()) == null ? void 0 : _d.menuName) || "";
|
|
23
24
|
return "";
|
|
24
25
|
}
|
|
25
26
|
__name(setHeaderText, "setHeaderText");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-header.vue2.mjs","sources":["../../../../../../../packages/components/page-header/src/page-header.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { inject, ref, watchEffect } from \"vue\";\nimport { MENU_STORE } from \"../../../utils\";\nimport { PageHeaderProps } from \"./page-header\";\n\ndefineOptions({\n name: \"IPageHeader\",\n});\n\nconst props = defineProps(PageHeaderProps);\nconst menuStore = inject(MENU_STORE);\nconst headerText = ref(\"\");\n\nfunction setHeaderText() {\n if (props.title) return props.title;\n if (props.action) return props.action?.getCurrentMenu()?.label || \"\";\n if (menuStore)
|
|
1
|
+
{"version":3,"file":"page-header.vue2.mjs","sources":["../../../../../../../packages/components/page-header/src/page-header.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { inject, ref, watchEffect } from \"vue\";\nimport { MENU_STORE } from \"../../../utils\";\nimport { PageHeaderProps } from \"./page-header\";\n\ndefineOptions({\n name: \"IPageHeader\",\n});\n\nconst props = defineProps(PageHeaderProps);\nconst menuStore = inject(MENU_STORE);\nconst headerText = ref(\"\");\n\nfunction setHeaderText() {\n if (props.title) return props.title;\n if (props.action) return props.action?.getCurrentMenu()?.label || \"\";\n if (menuStore)\n return (\n menuStore.getCurrentMenu()?.label ||\n menuStore.getCurrentMenu()?.menuName ||\n \"\"\n );\n return \"\";\n}\nwatchEffect(() => {\n headerText.value = setHeaderText();\n});\n</script>\n\n<template>\n <div\n class=\"t-page-header\"\n :class=\"{\n 't-page-header__underline': underline,\n 't-page-header__between': slotFlex === 'between',\n 't-page-header__start': slotFlex === 'start',\n }\"\n >\n <div :class=\"{ 't-page-name': headerText }\">{{ headerText }}</div>\n <slot name=\"default\" />\n </div>\n</template>\n"],"names":["_createElementBlock","underline","slotFlex","_createElementVNode","_renderSlot"],"mappings":";;;;;;;;;;;;;;AASA,IAAA,MAAM,KAAQ,GAAA,OAAA;AACd,IAAM,MAAA,SAAA,GAAY,OAAO,UAAU,CAAA;AACnC,IAAM,MAAA,UAAA,GAAa,IAAI,EAAE,CAAA;AAEzB,IAAA,SAAS,aAAgB,GAAA;;AACvB,MAAI,IAAA,KAAA,CAAM,KAAO,EAAA,OAAO,KAAM,CAAA,KAAA;AAC9B,MAAI,IAAA,KAAA,CAAM,QAAe,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,WAAN,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,cAAA,EAAA,KAAd,mBAAgC,KAAS,KAAA,EAAA;AAClE,MAAI,IAAA,SAAA;AACF,QACE,OAAA,CAAA,CAAA,EAAA,GAAA,SAAA,CAAU,gBAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA4B,YAC5B,EAAU,GAAA,SAAA,CAAA,cAAA,EAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA4B,QAC5B,CAAA,IAAA,EAAA;AAEJ,MAAO,OAAA,EAAA;AAAA;AATA,IAAA,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAWT,IAAA,WAAA,CAAY,MAAM;AAChB,MAAA,UAAA,CAAW,QAAQ,aAAc,EAAA;AAAA,KAClC,CAAA;;wBAIC,EAAAA,kBAAA;AAAA,QAUM,KAAA;AAAA,QAAA;AAAA,UATJ,KAAA,kBAAM,eAAe,EAAA;AAAA,wCACuBC,IAAS,CAAA,SAAA;AAAA,sCAAkCC,KAAQ,QAAA,KAAA,SAAA;AAAA,oCAA8CA,KAAQ,QAAA,KAAA;AAAA;;;UAMrJC,kBAAA;AAAA,YAAkE,KAAA;AAAA,YAAA;AAAA,cAA5D,qCAAwB,EAAA,UAAA,CAAU,OAAA;AAAA;4BAAO,WAAU,KAAA,CAAA;AAAA,YAAA;AAAA;AAAA,WAAA;AAAA,UACzDC,UAAA,CAAuB,IAAA,CAAA,MAAA,EAAA,SAAA;AAAA;;;;;;;;;;"}
|
|
@@ -426,6 +426,9 @@ export declare const IMonitorPlayback: import("../../types").SFCWithInstall<impo
|
|
|
426
426
|
retryCount: number;
|
|
427
427
|
MAX_RETRY: number;
|
|
428
428
|
currentUrl: import("vue").Ref<string, string>;
|
|
429
|
+
starttimeDefault: import("vue").ComputedRef<string>;
|
|
430
|
+
datetimeValue: import("vue").Ref<string, string>;
|
|
431
|
+
onDatetimeChange: (val: string) => void;
|
|
429
432
|
playStartTimeMs: number;
|
|
430
433
|
lastPtsMs: number;
|
|
431
434
|
playTimerId: number | null;
|
|
@@ -440,6 +443,211 @@ export declare const IMonitorPlayback: import("../../types").SFCWithInstall<impo
|
|
|
440
443
|
destroyPlayer: () => Promise<void>;
|
|
441
444
|
onTimelineSeek: (sec: number) => void;
|
|
442
445
|
startPlayTimer: () => void;
|
|
446
|
+
IDatePicker: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
447
|
+
modelValue: {
|
|
448
|
+
type: import("vue").PropType<string | string[]>;
|
|
449
|
+
default: null;
|
|
450
|
+
};
|
|
451
|
+
placeholder: {
|
|
452
|
+
type: StringConstructor;
|
|
453
|
+
default: string;
|
|
454
|
+
};
|
|
455
|
+
startPlaceholder: {
|
|
456
|
+
type: StringConstructor;
|
|
457
|
+
default: string;
|
|
458
|
+
};
|
|
459
|
+
endPlaceholder: {
|
|
460
|
+
type: StringConstructor;
|
|
461
|
+
default: string;
|
|
462
|
+
};
|
|
463
|
+
disabled: {
|
|
464
|
+
type: BooleanConstructor;
|
|
465
|
+
default: boolean;
|
|
466
|
+
};
|
|
467
|
+
clearable: {
|
|
468
|
+
type: BooleanConstructor;
|
|
469
|
+
default: boolean;
|
|
470
|
+
};
|
|
471
|
+
size: {
|
|
472
|
+
type: StringConstructor;
|
|
473
|
+
};
|
|
474
|
+
type: {
|
|
475
|
+
type: StringConstructor;
|
|
476
|
+
default: string;
|
|
477
|
+
};
|
|
478
|
+
format: {
|
|
479
|
+
type: StringConstructor;
|
|
480
|
+
default: null;
|
|
481
|
+
};
|
|
482
|
+
valueFormat: {
|
|
483
|
+
type: StringConstructor;
|
|
484
|
+
default: null;
|
|
485
|
+
};
|
|
486
|
+
shortcuts: {
|
|
487
|
+
type: import("vue").PropType<import("../date-picker/src/date-picker").Shortcuts[]>;
|
|
488
|
+
default: () => never[];
|
|
489
|
+
};
|
|
490
|
+
disabledDate: {
|
|
491
|
+
type: FunctionConstructor;
|
|
492
|
+
default: () => boolean;
|
|
493
|
+
};
|
|
494
|
+
rangeSeparator: {
|
|
495
|
+
type: StringConstructor;
|
|
496
|
+
default: string;
|
|
497
|
+
};
|
|
498
|
+
}>, {
|
|
499
|
+
MonthPicker: any;
|
|
500
|
+
QuarterPicker: any;
|
|
501
|
+
RangePicker: any;
|
|
502
|
+
WeekPicker: any;
|
|
503
|
+
YearPicker: any;
|
|
504
|
+
props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
|
|
505
|
+
modelValue: {
|
|
506
|
+
type: import("vue").PropType<string | string[]>;
|
|
507
|
+
default: null;
|
|
508
|
+
};
|
|
509
|
+
placeholder: {
|
|
510
|
+
type: StringConstructor;
|
|
511
|
+
default: string;
|
|
512
|
+
};
|
|
513
|
+
startPlaceholder: {
|
|
514
|
+
type: StringConstructor;
|
|
515
|
+
default: string;
|
|
516
|
+
};
|
|
517
|
+
endPlaceholder: {
|
|
518
|
+
type: StringConstructor;
|
|
519
|
+
default: string;
|
|
520
|
+
};
|
|
521
|
+
disabled: {
|
|
522
|
+
type: BooleanConstructor;
|
|
523
|
+
default: boolean;
|
|
524
|
+
};
|
|
525
|
+
clearable: {
|
|
526
|
+
type: BooleanConstructor;
|
|
527
|
+
default: boolean;
|
|
528
|
+
};
|
|
529
|
+
size: {
|
|
530
|
+
type: StringConstructor;
|
|
531
|
+
};
|
|
532
|
+
type: {
|
|
533
|
+
type: StringConstructor;
|
|
534
|
+
default: string;
|
|
535
|
+
};
|
|
536
|
+
format: {
|
|
537
|
+
type: StringConstructor;
|
|
538
|
+
default: null;
|
|
539
|
+
};
|
|
540
|
+
valueFormat: {
|
|
541
|
+
type: StringConstructor;
|
|
542
|
+
default: null;
|
|
543
|
+
};
|
|
544
|
+
shortcuts: {
|
|
545
|
+
type: import("vue").PropType<import("../date-picker/src/date-picker").Shortcuts[]>;
|
|
546
|
+
default: () => never[];
|
|
547
|
+
};
|
|
548
|
+
disabledDate: {
|
|
549
|
+
type: FunctionConstructor;
|
|
550
|
+
default: () => boolean;
|
|
551
|
+
};
|
|
552
|
+
rangeSeparator: {
|
|
553
|
+
type: StringConstructor;
|
|
554
|
+
default: string;
|
|
555
|
+
};
|
|
556
|
+
}>> & Readonly<{
|
|
557
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
558
|
+
onChange?: ((...args: any[]) => any) | undefined;
|
|
559
|
+
onClear?: ((...args: any[]) => any) | undefined;
|
|
560
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
561
|
+
}> & {}>;
|
|
562
|
+
inputValue: import("vue").Ref<string | string[], string | string[]>;
|
|
563
|
+
emit: (event: "clear" | "update:modelValue" | "change" | "select", ...args: any[]) => void;
|
|
564
|
+
onChange: (value: any) => void;
|
|
565
|
+
onSelect: (value: any) => void;
|
|
566
|
+
realShortcuts: import("vue").ComputedRef<{
|
|
567
|
+
label: string | undefined;
|
|
568
|
+
value: any;
|
|
569
|
+
}[]>;
|
|
570
|
+
defaultProps: import("vue").ComputedRef<{
|
|
571
|
+
format: string;
|
|
572
|
+
valueFormat: string;
|
|
573
|
+
shortcuts: {
|
|
574
|
+
label: string | undefined;
|
|
575
|
+
value: any;
|
|
576
|
+
}[];
|
|
577
|
+
}>;
|
|
578
|
+
realPlaceholder: import("vue").ComputedRef<string | string[]>;
|
|
579
|
+
readonly DatePicker: any;
|
|
580
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("clear" | "update:modelValue" | "change" | "select")[], "clear" | "update:modelValue" | "change" | "select", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
581
|
+
modelValue: {
|
|
582
|
+
type: import("vue").PropType<string | string[]>;
|
|
583
|
+
default: null;
|
|
584
|
+
};
|
|
585
|
+
placeholder: {
|
|
586
|
+
type: StringConstructor;
|
|
587
|
+
default: string;
|
|
588
|
+
};
|
|
589
|
+
startPlaceholder: {
|
|
590
|
+
type: StringConstructor;
|
|
591
|
+
default: string;
|
|
592
|
+
};
|
|
593
|
+
endPlaceholder: {
|
|
594
|
+
type: StringConstructor;
|
|
595
|
+
default: string;
|
|
596
|
+
};
|
|
597
|
+
disabled: {
|
|
598
|
+
type: BooleanConstructor;
|
|
599
|
+
default: boolean;
|
|
600
|
+
};
|
|
601
|
+
clearable: {
|
|
602
|
+
type: BooleanConstructor;
|
|
603
|
+
default: boolean;
|
|
604
|
+
};
|
|
605
|
+
size: {
|
|
606
|
+
type: StringConstructor;
|
|
607
|
+
};
|
|
608
|
+
type: {
|
|
609
|
+
type: StringConstructor;
|
|
610
|
+
default: string;
|
|
611
|
+
};
|
|
612
|
+
format: {
|
|
613
|
+
type: StringConstructor;
|
|
614
|
+
default: null;
|
|
615
|
+
};
|
|
616
|
+
valueFormat: {
|
|
617
|
+
type: StringConstructor;
|
|
618
|
+
default: null;
|
|
619
|
+
};
|
|
620
|
+
shortcuts: {
|
|
621
|
+
type: import("vue").PropType<import("../date-picker/src/date-picker").Shortcuts[]>;
|
|
622
|
+
default: () => never[];
|
|
623
|
+
};
|
|
624
|
+
disabledDate: {
|
|
625
|
+
type: FunctionConstructor;
|
|
626
|
+
default: () => boolean;
|
|
627
|
+
};
|
|
628
|
+
rangeSeparator: {
|
|
629
|
+
type: StringConstructor;
|
|
630
|
+
default: string;
|
|
631
|
+
};
|
|
632
|
+
}>> & Readonly<{
|
|
633
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
634
|
+
onChange?: ((...args: any[]) => any) | undefined;
|
|
635
|
+
onClear?: ((...args: any[]) => any) | undefined;
|
|
636
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
637
|
+
}>, {
|
|
638
|
+
modelValue: string | string[];
|
|
639
|
+
format: string;
|
|
640
|
+
type: string;
|
|
641
|
+
disabled: boolean;
|
|
642
|
+
placeholder: string;
|
|
643
|
+
startPlaceholder: string;
|
|
644
|
+
endPlaceholder: string;
|
|
645
|
+
clearable: boolean;
|
|
646
|
+
valueFormat: string;
|
|
647
|
+
shortcuts: import("../date-picker/src/date-picker").Shortcuts[];
|
|
648
|
+
disabledDate: Function;
|
|
649
|
+
rangeSeparator: string;
|
|
650
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
443
651
|
ITimelineRuler: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
444
652
|
startTime: {
|
|
445
653
|
type: DateConstructor;
|