clickgo 3.0.4-dev5 → 3.0.7-dev8

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/dist/lib/form.ts CHANGED
@@ -36,6 +36,7 @@ const info: {
36
36
  'yes': string;
37
37
  'no': string;
38
38
  'cancel': string;
39
+ 'search': string;
39
40
  }>;
40
41
  } = {
41
42
  'lastId': 0,
@@ -46,25 +47,29 @@ const info: {
46
47
  'ok': '好',
47
48
  'yes': '是',
48
49
  'no': '否',
49
- 'cancel': '取消'
50
+ 'cancel': '取消',
51
+ 'search': '搜索'
50
52
  },
51
53
  'tc': {
52
54
  'ok': '好',
53
55
  'yes': '是',
54
56
  'no': '否',
55
- 'cancel': '取消'
57
+ 'cancel': '取消',
58
+ 'search': '檢索'
56
59
  },
57
60
  'en': {
58
61
  'ok': 'OK',
59
62
  'yes': 'Yes',
60
63
  'no': 'No',
61
- 'cancel': 'Cancel'
64
+ 'cancel': 'Cancel',
65
+ 'search': 'Search'
62
66
  },
63
67
  'ja': {
64
68
  'ok': '好',
65
69
  'yes': 'はい',
66
70
  'no': 'いいえ',
67
- 'cancel': 'キャンセル'
71
+ 'cancel': 'キャンセル',
72
+ 'search': '検索'
68
73
  }
69
74
  }
70
75
  };
@@ -84,6 +89,7 @@ const popInfo: {
84
89
  };
85
90
 
86
91
  export let simpleSystemTaskRoot: types.IVue;
92
+ export let launcherRoot: types.IVue;
87
93
  const elements: {
88
94
  'wrap': HTMLDivElement;
89
95
  'list': HTMLDivElement;
@@ -95,6 +101,7 @@ const elements: {
95
101
  'dragIcon'?: HTMLElement;
96
102
  'system': HTMLElement;
97
103
  'simpleSystemtask': HTMLDivElement;
104
+ 'launcher': HTMLDivElement;
98
105
  'init': () => void;
99
106
  } = {
100
107
  'wrap': document.createElement('div'),
@@ -107,22 +114,17 @@ const elements: {
107
114
  'dragIcon': undefined,
108
115
  'system': document.createElement('div'),
109
116
  'simpleSystemtask': document.createElement('div'),
117
+ 'launcher': document.createElement('div'),
110
118
  'init': function() {
111
119
  /** --- clickgo 所有的 div wrap --- */
112
120
  this.wrap.id = 'cg-wrap';
113
121
  document.getElementsByTagName('body')[0].appendChild(this.wrap);
114
122
  if (clickgo.getNative() && (clickgo.getPlatform() === 'win32')) {
115
123
  this.wrap.addEventListener('mouseenter', function() {
116
- native.send('cg-mouse-ignore', JSON.stringify({
117
- 'token': native.getToken(),
118
- 'param': false
119
- }));
124
+ native.invoke('cg-mouse-ignore', native.getToken(), false);
120
125
  });
121
126
  this.wrap.addEventListener('mouseleave', function() {
122
- native.send('cg-mouse-ignore', JSON.stringify({
123
- 'token': native.getToken(),
124
- 'param': true
125
- }));
127
+ native.invoke('cg-mouse-ignore', native.getToken(), true);
126
128
  });
127
129
  }
128
130
 
@@ -242,6 +244,192 @@ const elements: {
242
244
  }
243
245
  });
244
246
  simpletaskApp.mount('#cg-simpletask');
247
+
248
+ // --- cg-launcher ---
249
+ this.launcher.id = 'cg-launcher';
250
+ this.launcher.addEventListener('contextmenu', function(e): void {
251
+ e.preventDefault();
252
+ });
253
+ this.wrap.appendChild(this.launcher);
254
+ this.launcher.addEventListener('touchmove', function(e): void {
255
+ // --- 防止拖动时整个网页跟着动 ---
256
+ e.preventDefault();
257
+ }, {
258
+ 'passive': false
259
+ });
260
+ // --- Vue 挂载在这里 ---
261
+ const waiting = function(): void {
262
+ // --- 必须在这里执行,要不然 computed 无法更新,因为 core 还没加载进来 ---
263
+ if (!core.config) {
264
+ setTimeout(function() {
265
+ waiting();
266
+ }, 2000);
267
+ return;
268
+ }
269
+ const launcherApp = clickgo.vue.createApp({
270
+ 'template': `<div class="cg-launcher-search">` +
271
+ `<input v-if="folderName === ''" class="cg-launcher-sinput" :placeholder="search" v-model="name">` +
272
+ `<input v-else class="cg-launcher-foldername" :value="folderName" @change="folderNameChange">` +
273
+ `</div>` +
274
+ `<div class="cg-launcher-list" @mousedown="mousedown" @click="listClick" :class="[folderName === '' ? '' : 'cg-folder-open']">` +
275
+ `<div v-for="item of list" class="cg-launcher-item">` +
276
+ `<div class="cg-launcher-inner">` +
277
+ `<div v-if="!item.list || item.list.length === 0" class="cg-launcher-icon" :style="{'background-image': 'url(' + item.icon + ')'}" @click="iconClick($event, item)"></div>` +
278
+ `<div v-else class="cg-launcher-folder" @click="openFolder($event, item)">` +
279
+ `<div>` +
280
+ `<div v-for="sub of item.list" class="cg-launcher-item">` +
281
+ `<div class="cg-launcher-inner">` +
282
+ `<div class="cg-launcher-icon" :style="{'background-image': 'url(' + sub.icon + ')'}" @click="subIconClick($event, sub)"></div>` +
283
+ `<div class="cg-launcher-name">{{sub.name}}</div>` +
284
+ `</div>` +
285
+ `<div class="cg-launcher-space"></div>` +
286
+ `</div>` +
287
+ `</div>` +
288
+ `</div>` +
289
+ `<div class="cg-launcher-name">{{item.name}}</div>` +
290
+ `</div>` +
291
+ `<div class="cg-launcher-space"></div>` +
292
+ `</div>` +
293
+ `</div>`,
294
+ 'data': function() {
295
+ return {
296
+ 'name': '',
297
+ 'folderName': ''
298
+ };
299
+ },
300
+ 'computed': {
301
+ 'search': function() {
302
+ return info.locale[core.config.locale]?.search ?? info.locale['en'].search;
303
+ },
304
+ 'list': function(this: types.IVue) {
305
+ if (this.name === '') {
306
+ return core.config['launcher.list'];
307
+ }
308
+ const list = [];
309
+ for (const item of core.config['launcher.list']) {
310
+ if (item.list && item.list.length > 0) {
311
+ for (const sub of item.list) {
312
+ if (sub.name.toLowerCase().includes(this.name.toLowerCase())) {
313
+ list.push(sub);
314
+ }
315
+ }
316
+ }
317
+ else {
318
+ if (item.name.toLowerCase().includes(this.name.toLowerCase())) {
319
+ list.push(item);
320
+ }
321
+ }
322
+ }
323
+ return list;
324
+ }
325
+ },
326
+ 'methods': {
327
+ mousedown: function(this: types.IVue, e: MouseEvent): void {
328
+ this.md = e.pageX + e.pageY;
329
+ },
330
+ listClick: function(this: types.IVue, e: MouseEvent) {
331
+ if (this.md !== e.pageX + e.pageY) {
332
+ return;
333
+ }
334
+ if (e.currentTarget !== e.target) {
335
+ return;
336
+ }
337
+ if (this.folderName === '') {
338
+ hideLauncher();
339
+ }
340
+ else {
341
+ this.closeFolder();
342
+ }
343
+ },
344
+ iconClick: async function(
345
+ this: types.IVue,
346
+ e: MouseEvent,
347
+ item: types.IConfigLauncherItem
348
+ ): Promise<void> {
349
+ if (this.md !== e.pageX + e.pageY) {
350
+ return;
351
+ }
352
+ hideLauncher();
353
+ await clickgo.task.run(item.path!, {
354
+ 'icon': item.icon
355
+ });
356
+ },
357
+ subIconClick: async function(
358
+ this: types.IVue,
359
+ e: MouseEvent,
360
+ item: types.IConfigLauncherItem
361
+ ): Promise<void> {
362
+ if (this.md !== e.pageX + e.pageY) {
363
+ return;
364
+ }
365
+ hideLauncher();
366
+ await clickgo.task.run(item.path!, {
367
+ 'icon': item.icon
368
+ });
369
+ },
370
+ closeFolder: function(this: types.IVue): void {
371
+ // --- 关闭文件夹 ---
372
+ this.folderName = '';
373
+ const el = this.folderEl as HTMLDivElement;
374
+ const rect = (el.parentNode as HTMLDivElement).getBoundingClientRect();
375
+ el.classList.remove('cg-show');
376
+ el.style.left = (rect.left + 30).toString() + 'px';
377
+ el.style.top = rect.top.toString() + 'px';
378
+ el.style.width = '';
379
+ el.style.height = '';
380
+ setTimeout(() => {
381
+ el.style.position = '';
382
+ el.style.left = '';
383
+ el.style.top = '';
384
+ }, 150);
385
+ },
386
+ openFolder: function(this: types.IVue, e: MouseEvent, item: types.IConfigLauncherItem): void {
387
+ if (this.md !== e.pageX + e.pageY) {
388
+ return;
389
+ }
390
+ if ((e.currentTarget as HTMLElement).childNodes[0] !== e.target) {
391
+ return;
392
+ }
393
+ if (this.folderName !== '') {
394
+ this.closeFolder();
395
+ return;
396
+ }
397
+ this.folderName = item.name;
398
+ this.folderItem = item;
399
+ const el = (e.currentTarget as HTMLDivElement).childNodes.item(0) as HTMLDivElement;
400
+ this.folderEl = el;
401
+ const searchEl = document.getElementsByClassName('cg-launcher-search')[0] as HTMLDivElement;
402
+ const rect = el.getBoundingClientRect();
403
+ el.style.left = rect.left.toString() + 'px';
404
+ el.style.top = rect.top.toString() + 'px';
405
+ el.style.position = 'fixed';
406
+ requestAnimationFrame(() => {
407
+ el.classList.add('cg-show');
408
+ el.style.left = '50px';
409
+ el.style.top = searchEl.offsetHeight.toString() + 'px';
410
+ el.style.width = 'calc(100% - 100px)';
411
+ el.style.height = 'calc(100% - 50px - ' + searchEl.offsetHeight.toString() + 'px)';
412
+ });
413
+ },
414
+ folderNameChange: function(this: types.IVue, e: InputEvent): void {
415
+ const input = e.target as HTMLInputElement;
416
+ const val = input.value.trim();
417
+ if (val === '') {
418
+ input.value = this.folderName;
419
+ return;
420
+ }
421
+ this.folderName = val;
422
+ // --- 触发 folder name change 事件 ---
423
+ core.trigger('launcherFolderNameChanged', this.folderItem.id ?? '', val);
424
+ }
425
+ },
426
+ 'mounted': function(this: types.IVue): void {
427
+ launcherRoot = this;
428
+ }
429
+ });
430
+ launcherApp.mount('#cg-launcher');
431
+ };
432
+ waiting();
245
433
  }
246
434
  };
247
435
  elements.init();
@@ -1000,7 +1188,7 @@ export function showPop(el: HTMLElement, pop: HTMLElement | undefined, direction
1000
1188
  top = bcr.top - 2;
1001
1189
  }
1002
1190
  // --- 检查水平是否出框 ---
1003
- if (width + left > document.body.clientWidth) {
1191
+ if (width + left > window.innerWidth) {
1004
1192
  if (direction === 'v') {
1005
1193
  // --- 垂直弹出 ---
1006
1194
  left = bcr.left + bcr.width - width;
@@ -1011,7 +1199,7 @@ export function showPop(el: HTMLElement, pop: HTMLElement | undefined, direction
1011
1199
  }
1012
1200
  }
1013
1201
  // --- 检测垂直是否出框 ---
1014
- if (height + top > document.body.clientHeight) {
1202
+ if (height + top > window.innerHeight) {
1015
1203
  if (direction === 'v') {
1016
1204
  top = bcr.top - height;
1017
1205
  }
@@ -1038,11 +1226,11 @@ export function showPop(el: HTMLElement, pop: HTMLElement | undefined, direction
1038
1226
  left = x + 5;
1039
1227
  top = y + 7;
1040
1228
  // --- 水平 ---
1041
- if (width + left > document.body.clientWidth) {
1229
+ if (width + left > window.innerWidth) {
1042
1230
  left = x - width - 5;
1043
1231
  }
1044
1232
  // --- 垂直 ---
1045
- if (height + top > document.body.clientHeight) {
1233
+ if (height + top > window.innerHeight) {
1046
1234
  top = y - height - 5;
1047
1235
  }
1048
1236
  }
@@ -1620,6 +1808,12 @@ export async function create(opt: string | types.IFormCreateOptions): Promise<nu
1620
1808
  },
1621
1809
  hide: function(fid?: number): void {
1622
1810
  clickgo.form.hide(fid ?? formId, taskId);
1811
+ },
1812
+ showLauncher: function(): void {
1813
+ clickgo.form.showLauncher();
1814
+ },
1815
+ hideLauncher: function(): void {
1816
+ clickgo.form.hideLauncher();
1623
1817
  }
1624
1818
  },
1625
1819
  'fs': {
@@ -1739,36 +1933,8 @@ export async function create(opt: string | types.IFormCreateOptions): Promise<nu
1739
1933
  }
1740
1934
  },
1741
1935
  'native': {
1742
- getListeners: function(): Array<{ 'id': number; 'name': string; 'once': boolean; 'taskId'?: number; }> {
1743
- return clickgo.native.getListeners();
1744
- },
1745
- send: function(
1746
- name: string,
1747
- param?: string,
1748
- handler?: (param?: string) => void | Promise<void>
1749
- ): number {
1750
- return clickgo.native.send(name, param, handler, taskId);
1751
- },
1752
- on: function(
1753
- name: string,
1754
- handler: (param?: string) => void | Promise<void>,
1755
- id?: number,
1756
- once: boolean = false
1757
- ): void {
1758
- clickgo.native.on(name, handler, id, once, taskId);
1759
- },
1760
- once: function(
1761
- name: string,
1762
- handler: (param?: string) => void | Promise<void>,
1763
- id?: number
1764
- ): void {
1765
- clickgo.native.once(name, handler, id, taskId);
1766
- },
1767
- off: function(name: string, handler: (param?: string) => void | Promise<void>): void {
1768
- clickgo.native.off(name, handler, taskId);
1769
- },
1770
- clearListener: function(): void {
1771
- clickgo.native.clearListener(taskId);
1936
+ invoke: function(name: string, ...param: any[]): any {
1937
+ return clickgo.native.invoke(name, ...param);
1772
1938
  },
1773
1939
  max: function(): void {
1774
1940
  clickgo.native.max();
@@ -2509,6 +2675,30 @@ export function hide(formId?: number, taskId?: number): void {
2509
2675
  form.vroot.$refs.form.$data.showData = false;
2510
2676
  }
2511
2677
 
2678
+ /**
2679
+ * --- 显示 launcher 界面 ---
2680
+ */
2681
+ export function showLauncher(): void {
2682
+ elements.launcher.style.display = 'flex';
2683
+ requestAnimationFrame(function() {
2684
+ elements.launcher.classList.add('cg-show');
2685
+ });
2686
+ }
2687
+
2688
+ /**
2689
+ * --- 隐藏 launcher 界面 ---
2690
+ */
2691
+ export function hideLauncher(): void {
2692
+ elements.launcher.classList.remove('cg-show');
2693
+ setTimeout(function() {
2694
+ if (launcherRoot.folderName !== '') {
2695
+ launcherRoot.closeFolder();
2696
+ }
2697
+ launcherRoot.name = '';
2698
+ elements.launcher.style.display = 'none';
2699
+ }, 300);
2700
+ }
2701
+
2512
2702
  // --- 绑定 resize 事件 ---
2513
2703
  window.addEventListener('resize', function(): void {
2514
2704
  // --- 触发 screenResize 事件 ---
package/dist/lib/fs.js CHANGED
@@ -27,7 +27,7 @@ function getContent(path, options) {
27
27
  const encoding = options.encoding;
28
28
  const start = options.start;
29
29
  const end = options.end;
30
- if (path.startsWith('/clickgo/') || path.startsWith('http:') || path.startsWith('https:')) {
30
+ if (path.startsWith('/clickgo/') || path.startsWith('http:') || path.startsWith('https:') || path.startsWith('file:')) {
31
31
  let ourl = '';
32
32
  if (path.startsWith('/clickgo/')) {
33
33
  if (!clickgoFiles.includes(fpath)) {
package/dist/lib/fs.ts CHANGED
@@ -51,7 +51,7 @@ export async function getContent(path: string, options?: BufferEncoding | {
51
51
  const encoding = options.encoding;
52
52
  const start = options.start;
53
53
  const end = options.end;
54
- if (path.startsWith('/clickgo/') || path.startsWith('http:') || path.startsWith('https:')) {
54
+ if (path.startsWith('/clickgo/') || path.startsWith('http:') || path.startsWith('https:') || path.startsWith('file:')) {
55
55
  let ourl: string = '';
56
56
  if (path.startsWith('/clickgo/')) {
57
57
  if (!clickgoFiles.includes(fpath)) {
@@ -1,172 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cgInnerReceive = exports.cgInnerGetSends = exports.size = exports.restore = exports.min = exports.max = exports.clearListener = exports.off = exports.once = exports.on = exports.send = exports.getListeners = exports.getToken = void 0;
3
+ exports.size = exports.restore = exports.min = exports.max = exports.invoke = exports.getToken = void 0;
4
4
  const clickgo = require("../clickgo");
5
- let sendId = 0;
6
- let sendList = [];
7
- const listeners = {};
8
5
  const token = (Math.random() * 100000000000000 * (100 + Math.round(Math.random() * (999 - 100)))).toString(32);
9
6
  function getToken() {
10
7
  return token;
11
8
  }
12
9
  exports.getToken = getToken;
13
- function getListeners() {
14
- const list = [];
15
- for (const name in listeners) {
16
- for (const item of listeners[name]) {
17
- list.push({
18
- 'id': item.id,
19
- 'name': name,
20
- 'once': item.once,
21
- 'taskId': item.taskId
22
- });
23
- }
24
- }
25
- return list;
26
- }
27
- exports.getListeners = getListeners;
28
- function send(name, param, handler, taskId) {
29
- if (!clickgo.getNative()) {
30
- return 0;
31
- }
32
- const id = ++sendId;
33
- sendList.push({
34
- 'id': id,
35
- 'name': name,
36
- 'param': param
37
- });
38
- if (handler) {
39
- on(name, handler, id, true, taskId);
40
- }
41
- return id;
42
- }
43
- exports.send = send;
44
- function on(name, handler, id, once = false, taskId) {
10
+ function invoke(name, ...param) {
45
11
  if (!clickgo.getNative()) {
46
12
  return;
47
13
  }
48
- if (!listeners[name]) {
49
- listeners[name] = [];
50
- }
51
- listeners[name].push({
52
- 'id': id !== null && id !== void 0 ? id : 0,
53
- 'once': once,
54
- 'taskId': taskId,
55
- 'handler': handler
56
- });
57
- }
58
- exports.on = on;
59
- function once(name, handler, id, taskId) {
60
- on(name, handler, id, true, taskId);
14
+ return window.clickgoNative.invoke(name, ...param);
61
15
  }
62
- exports.once = once;
63
- function off(name, handler, taskId) {
64
- if (!listeners[name]) {
65
- return;
66
- }
67
- for (let i = 0; i < listeners[name].length; ++i) {
68
- if (listeners[name][i].handler !== handler) {
69
- continue;
70
- }
71
- if (taskId && (listeners[name][i].taskId !== taskId)) {
72
- continue;
73
- }
74
- listeners[name].splice(i, 1);
75
- if (listeners[name].length === 0) {
76
- delete listeners[name];
77
- break;
78
- }
79
- --i;
80
- }
81
- }
82
- exports.off = off;
83
- function clearListener(taskId) {
84
- if (!taskId) {
85
- return;
86
- }
87
- for (const name in listeners) {
88
- for (let i = 0; i < listeners[name].length; ++i) {
89
- if (listeners[name][i].taskId !== taskId) {
90
- continue;
91
- }
92
- listeners[name].splice(i, 1);
93
- if (listeners[name].length === 0) {
94
- delete listeners[name];
95
- break;
96
- }
97
- }
98
- }
99
- }
100
- exports.clearListener = clearListener;
16
+ exports.invoke = invoke;
101
17
  function max() {
102
- send('cg-set-state', JSON.stringify({
103
- 'token': token,
104
- 'state': 'max'
105
- }));
18
+ invoke('cg-set-state', token, 'max');
106
19
  }
107
20
  exports.max = max;
108
21
  function min() {
109
- send('cg-set-state', JSON.stringify({
110
- 'token': token,
111
- 'state': 'min'
112
- }));
22
+ invoke('cg-set-state', token, 'min');
113
23
  }
114
24
  exports.min = min;
115
25
  function restore() {
116
- send('cg-set-state', JSON.stringify({
117
- 'token': token,
118
- 'state': 'restore'
119
- }));
26
+ invoke('cg-set-state', token, 'restore');
120
27
  }
121
28
  exports.restore = restore;
122
29
  function size(width, height) {
123
- send('cg-set-size', JSON.stringify({
124
- 'token': token,
125
- 'width': width,
126
- 'height': height
127
- }));
30
+ invoke('cg-set-size', token, width, height);
128
31
  }
129
32
  exports.size = size;
130
- function cgInnerGetSends() {
131
- const json = JSON.stringify(sendList);
132
- sendList = [];
133
- return json;
134
- }
135
- exports.cgInnerGetSends = cgInnerGetSends;
136
- function cgInnerReceive(id, name, result) {
137
- if (!listeners[name]) {
138
- return;
139
- }
140
- for (let i = 0; i < listeners[name].length; ++i) {
141
- const item = listeners[name][i];
142
- if (item.id > 0) {
143
- if (item.id !== id) {
144
- continue;
145
- }
146
- const r = item.handler(result);
147
- if (r instanceof Promise) {
148
- r.catch(function (e) {
149
- console.log(e);
150
- });
151
- }
152
- }
153
- else {
154
- const r = item.handler(result);
155
- if (r instanceof Promise) {
156
- r.catch(function (e) {
157
- console.log(e);
158
- });
159
- }
160
- }
161
- if (item.once) {
162
- listeners[name].splice(i, 1);
163
- --i;
164
- }
165
- }
166
- }
167
- exports.cgInnerReceive = cgInnerReceive;
168
- window.clickGoNative = {
169
- isReady: true,
170
- cgInnerGetSends: cgInnerGetSends,
171
- cgInnerReceive: cgInnerReceive
172
- };