@nebulars/sseengine 1.3.63 → 1.3.65

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nebulars/sseengine",
3
3
  "description": "An engine for sse",
4
- "version": "1.3.63",
4
+ "version": "1.3.65",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
7
7
  "dev": "forage serve --name sseengine",
@@ -67,7 +67,7 @@
67
67
  </template>
68
68
 
69
69
  <!-- Feedback -->
70
- <fqa-feedback :id="item.id" v-model:feedback="item.feedback" :visible="!sseengine.produce" />
70
+ <sse-feedback :id="item.id" v-model:feedback="item.feedback" :visible="!sseengine.produce" />
71
71
 
72
72
  <!-- Next -->
73
73
  <sse-recursion v-if="item.children.length" :source="item.children" :active="active" />
@@ -50,13 +50,8 @@ export default {
50
50
 
51
51
  // All
52
52
  if (checked) {
53
- // Get Snaps
54
- const snaps = $('[data-checked]')
55
- .map((_, e) => $(e).data())
56
- .get();
57
-
58
53
  // Checked All
59
- await this.$store.dispatch('sseengine/SNAP_ALL', snaps);
54
+ await this.$store.dispatch('sseengine/SNAP_ALL');
60
55
  }
61
56
 
62
57
  // Empty
@@ -0,0 +1,168 @@
1
+ <style lang="less" scoped>
2
+ .fqa-feedback {
3
+ height: calc(@gap + @unit);
4
+ line-height: calc(@gap + @unit);
5
+
6
+ &-space {
7
+ cursor: pointer;
8
+ transition: all @fast;
9
+
10
+ &:hover {
11
+ color: @color-primary;
12
+ }
13
+ }
14
+ }
15
+ </style>
16
+
17
+ <template>
18
+ <a-space :size="24" class="fqa-feedback" :class="{ notouch: sseengine.mode === 'snap' }">
19
+ <template v-if="visible">
20
+ <a-space class="fqa-feedback-space" :size="4" @click="copy">
21
+ <fqa-icon icon="CopyOutlined" :size="18" cursor="pointer" />
22
+ <span>复制</span>
23
+ </a-space>
24
+ <a-space class="fqa-feedback-space" :size="4" @click="share">
25
+ <fqa-icon icon="ShareAltOutlined" :size="18" cursor="pointer" />
26
+ <span>分享</span>
27
+ </a-space>
28
+ <a-space class="fqa-feedback-space" :size="4" :data-download="id">
29
+ <a-dropdown :getPopupContainer="e => e.closest('[data-download]')">
30
+ <div>
31
+ <fqa-icon icon="DownloadOutlined" :size="18" cursor="pointer" />
32
+ <span>下载</span>
33
+ </div>
34
+ <template #overlay>
35
+ <a-menu>
36
+ <a-menu-item>
37
+ <a-space :size="4" @click="e => download(e, 'word')">
38
+ <fqa-icon icon="FileWordOutlined" />
39
+ <span>Word</span>
40
+ </a-space>
41
+ </a-menu-item>
42
+ <a-menu-item>
43
+ <a-space :size="4" @click="e => download(e, 'pdf')">
44
+ <fqa-icon icon="FilePdfOutlined" />
45
+ <span>PDF</span>
46
+ </a-space>
47
+ </a-menu-item>
48
+ <a-menu-item>
49
+ <a-space :size="4" @click="e => download(e, 'markdown')">
50
+ <fqa-icon icon="FileMarkdownOutlined" />
51
+ <span>Markdown</span>
52
+ </a-space>
53
+ </a-menu-item>
54
+ </a-menu>
55
+ </template>
56
+ </a-dropdown>
57
+ </a-space>
58
+ <a-space class="fqa-feedback-space" :size="4" @click="feed(1)">
59
+ <fqa-icon :icon="feedback === 1 ? 'LikeFilled' : 'LikeOutlined'" :size="18" cursor="pointer" />
60
+ <span>赞</span>
61
+ </a-space>
62
+ <a-space class="fqa-feedback-space" :size="4" @click="feed(2)">
63
+ <fqa-icon :icon="feedback === 2 ? 'DislikeFilled' : 'DislikeOutlined'" :size="18" cursor="pointer" />
64
+ <span>踩</span>
65
+ </a-space>
66
+ </template>
67
+
68
+ <template v-else>
69
+ <div> </div>
70
+ </template>
71
+ </a-space>
72
+ </template>
73
+
74
+ <script>
75
+ export default {
76
+ props: {
77
+ id: {
78
+ type: [String],
79
+ default: '',
80
+ },
81
+
82
+ feedback: {
83
+ type: [Number],
84
+ default: 0,
85
+ },
86
+
87
+ visible: {
88
+ type: [Boolean],
89
+ default: false,
90
+ },
91
+ },
92
+
93
+ data() {
94
+ return {};
95
+ },
96
+
97
+ methods: {
98
+ // @param event
99
+ async caption({ target }) {
100
+ return this.$util.closest(target, '[query-id]', true).querySelector('.fqa-query-content').innerHTML;
101
+ },
102
+
103
+ // @param event
104
+ async context({ target }) {
105
+ return this.$util.closest(target, '[answer-id]', true).querySelector('[data-html]').dataset;
106
+ },
107
+
108
+ // @param event
109
+ async snapers({ target }) {
110
+ return this.$util.within(this.$util.closest(target, '[query-id]', true), 'data-checked', 'query-id');
111
+ },
112
+
113
+ async copy(e) {
114
+ // Get Markdown
115
+ const { html } = await this.context(e);
116
+
117
+ // Add to Copy
118
+ await this.$util.copy(html);
119
+
120
+ // Toast
121
+ await this.$util.toast.success('已复制到剪贴板');
122
+ },
123
+
124
+ async share(e) {
125
+ // Mode Change
126
+ await this.$store.dispatch('sseengine/SNAP_MODE');
127
+
128
+ // Get Group
129
+ const group = await this.$store.dispatch('sseengine/SNAP_GROUP', await this.snapers(e));
130
+
131
+ // Get Snaps
132
+ const snaps = await this.$store.dispatch('sseengine/SNAP_ALL', group);
133
+ },
134
+
135
+ async download(e, export_type) {
136
+ // Get Title
137
+ const title = await this.caption(e);
138
+
139
+ // Get Markdown
140
+ const { html: content } = await this.context(e);
141
+
142
+ // Trigger Download
143
+ const link = await this.$store.dispatch('sseengine/ANS_DOWNLOAD', { title, content, export_type });
144
+
145
+ // Download
146
+ this.$util.download(link, '_blank');
147
+ },
148
+
149
+ async feed(feedback = 0) {
150
+ if (this.feedback === feedback) {
151
+ feedback = 0;
152
+ }
153
+
154
+ // Get ID from Scope
155
+ const { id } = this;
156
+
157
+ // Feedback
158
+ const { status } = await this.$store.dispatch('chat/FEEDBACK', { feedback, id });
159
+
160
+ // Success
161
+ if (status === 'success') {
162
+ // Update
163
+ this.$emit('update:feedback', feedback);
164
+ }
165
+ },
166
+ },
167
+ };
168
+ </script>
@@ -4,5 +4,10 @@ export default ({ http }) => {
4
4
  const { data } = await http.api.sseUpdateFeedback({ feedback, answer_id });
5
5
  return data;
6
6
  },
7
+
8
+ async ANS_DOWNLOAD({}, { title, content, export_type }) {
9
+ const { data } = await http.api.shareExportContent({ title, content, export_type });
10
+ return data;
11
+ },
7
12
  };
8
13
  };
package/src/store/snap.js CHANGED
@@ -1,4 +1,4 @@
1
- export default ({ http, link }) => {
1
+ export default ({ $, http, link }) => {
2
2
  return {
3
3
  async SNAP_MODE({}, mode = 'snap') {
4
4
  return { mode };
@@ -39,10 +39,20 @@ export default ({ http, link }) => {
39
39
  return { choosen };
40
40
  },
41
41
 
42
- async SNAP_ALL({ dispatch }, group = []) {
42
+ async SNAP_ALL({ dispatch }, group) {
43
+ // Group Reset
44
+ group = group || (await dispatch('SNAP_GROUP'));
45
+
46
+ // Group Loop
43
47
  group.forEach(async item => await dispatch('SNAP_ADD', item));
44
48
  },
45
49
 
50
+ async SNAP_GROUP({}, target = $('[data-checked]')) {
51
+ return $(target)
52
+ .map((_, e) => $(e).data())
53
+ .get();
54
+ },
55
+
46
56
  async SNAP_CLEAN({ state }) {
47
57
  // Set Empty Choosen
48
58
  const choosen = [];
package/src/store/tub.js CHANGED
@@ -1,4 +1,4 @@
1
- export default ({ http, closest, copy, toimg, download, excel, toast, $ }) => {
1
+ export default ({ http, closest, copy, toimg, download, excel, time, toast, blob, $ }) => {
2
2
  return {
3
3
  async TUB_FULLSCREEN({ state }, { table }) {
4
4
  // Set Cloner
@@ -30,7 +30,23 @@ export default ({ http, closest, copy, toimg, download, excel, toast, $ }) => {
30
30
  const snap = await dispatch('SNAP_CREATE', table);
31
31
 
32
32
  // Set Snapshot
33
- const snapshot = true;
33
+ const snapshot = false;
34
+
35
+ // Set Image
36
+ const image = blob(snap);
37
+
38
+ // Copy
39
+ // copy(image);
40
+
41
+ // Copy Image
42
+ await navigator.clipboard.write([
43
+ new ClipboardItem({
44
+ [image.type]: image,
45
+ }),
46
+ ]);
47
+
48
+ // Toast
49
+ toast.success('图片已复制');
34
50
 
35
51
  // Update
36
52
  return {
@@ -62,11 +78,19 @@ export default ({ http, closest, copy, toimg, download, excel, toast, $ }) => {
62
78
 
63
79
  // Get ID
64
80
  // const query = closest(table, '[query-id]', true).getAttribute('query-id');
65
- const answer = closest(table, '[answer-id]', true).getAttribute('answer-id');
81
+ // const answer = closest(table, '[answer-id]', true).getAttribute('answer-id');
82
+
83
+ // Get Query
84
+ const query = closest(table, '[query-id]', true);
85
+
86
+ // Get Title from Query
87
+ const title = $(query).find('.fqa-query-content').html();
88
+
89
+ // Get Time
90
+ const fmt = time.Format(new Date(), 'YYYY-MM-DD');
66
91
 
67
92
  // Write Excel
68
- // excel.writeFile(book, `${answer}.xlsx`);
69
- excel.writeFile(book, `${state.info.title}.xlsx`);
93
+ excel.writeFile(book, `${title}_${fmt}.xlsx`);
70
94
  },
71
95
 
72
96
  async TSV_CREATE({}, { markdown, sup }) {