ts-glitter 21.3.7 → 21.3.9

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.
Files changed (135) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-line.js +12 -1
  4. package/lowcode/backend-manager/bg-line.ts +16 -1
  5. package/lowcode/backend-manager/bg-notify.js +13 -2
  6. package/lowcode/backend-manager/bg-notify.ts +17 -2
  7. package/lowcode/backend-manager/bg-product.js +81 -30
  8. package/lowcode/backend-manager/bg-product.ts +95 -34
  9. package/lowcode/backend-manager/bg-recommend.js +109 -141
  10. package/lowcode/backend-manager/bg-recommend.ts +122 -144
  11. package/lowcode/backend-manager/bg-sns.js +14 -4
  12. package/lowcode/backend-manager/bg-sns.ts +18 -4
  13. package/lowcode/backend-manager/bg-widget.js +176 -12
  14. package/lowcode/backend-manager/bg-widget.ts +198 -13
  15. package/lowcode/cms-plugin/POS-setting.js +2 -2
  16. package/lowcode/cms-plugin/POS-setting.ts +2 -2
  17. package/lowcode/cms-plugin/auto-fcm-advertise.js +13 -2
  18. package/lowcode/cms-plugin/auto-fcm-advertise.ts +16 -2
  19. package/lowcode/cms-plugin/auto-fcm-history.js +13 -2
  20. package/lowcode/cms-plugin/auto-fcm-history.ts +16 -2
  21. package/lowcode/cms-plugin/model/order.d.ts +1 -0
  22. package/lowcode/cms-plugin/module/order-excel.js +18 -2
  23. package/lowcode/cms-plugin/module/order-excel.ts +20 -9
  24. package/lowcode/cms-plugin/module/product-setting.js +2 -1
  25. package/lowcode/cms-plugin/module/product-setting.ts +2 -1
  26. package/lowcode/cms-plugin/module/user-excel.js +1 -1
  27. package/lowcode/cms-plugin/module/user-excel.ts +2 -2
  28. package/lowcode/cms-plugin/pos-pages/payment-page.js +4 -3
  29. package/lowcode/cms-plugin/pos-pages/payment-page.ts +12 -6
  30. package/lowcode/cms-plugin/pos-pages/products-page.js +9 -5
  31. package/lowcode/cms-plugin/pos-pages/products-page.ts +11 -5
  32. package/lowcode/cms-plugin/shopping-allowance-manager.js +3 -2
  33. package/lowcode/cms-plugin/shopping-allowance-manager.ts +3 -2
  34. package/lowcode/cms-plugin/shopping-discount-setting.js +2 -0
  35. package/lowcode/cms-plugin/shopping-discount-setting.ts +2 -0
  36. package/lowcode/cms-plugin/shopping-invoice-manager.js +7 -4
  37. package/lowcode/cms-plugin/shopping-invoice-manager.ts +12 -11
  38. package/lowcode/cms-plugin/shopping-order-manager.js +21 -4
  39. package/lowcode/cms-plugin/shopping-order-manager.ts +30 -11
  40. package/lowcode/cms-plugin/shopping-product-setting.js +45 -41
  41. package/lowcode/cms-plugin/shopping-product-setting.ts +55 -48
  42. package/lowcode/cms-plugin/shopping-rebate.js +52 -46
  43. package/lowcode/cms-plugin/shopping-rebate.ts +402 -396
  44. package/lowcode/cms-plugin/shopping-setting-advance.js +6 -6
  45. package/lowcode/cms-plugin/shopping-setting-advance.ts +7 -7
  46. package/lowcode/cms-plugin/shopping-setting-basic.js +44 -0
  47. package/lowcode/cms-plugin/shopping-setting-basic.ts +63 -1
  48. package/lowcode/cms-plugin/shopping-setting-stock-log.js +57 -0
  49. package/lowcode/cms-plugin/shopping-setting-stock-log.ts +101 -0
  50. package/lowcode/cms-plugin/user-list.js +10 -9
  51. package/lowcode/cms-plugin/user-list.ts +11 -8
  52. package/lowcode/css/editor.css +1 -1
  53. package/lowcode/form-view/editor/image-selector.js +83 -82
  54. package/lowcode/form-view/editor/image-selector.ts +115 -107
  55. package/lowcode/glitter-base/route/user.js +27 -34
  56. package/lowcode/glitter-base/route/user.ts +31 -40
  57. package/lowcode/glitterBundle/dialog/ShareDialog.js +1 -0
  58. package/lowcode/glitterBundle/dialog/ShareDialog.ts +2 -0
  59. package/lowcode/glitterBundle/dialog/dialog.js +2 -2
  60. package/lowcode/glitterBundle/dialog/dialog.ts +2 -2
  61. package/lowcode/glitterBundle/plugins/editor-elem.js +5 -11
  62. package/lowcode/glitterBundle/plugins/editor-elem.ts +11 -11
  63. package/lowcode/modules/image-library.js +836 -486
  64. package/lowcode/modules/image-library.ts +1760 -1418
  65. package/lowcode/modules/tool.js +10 -9
  66. package/lowcode/modules/tool.ts +11 -10
  67. package/lowcode/public-models/product.ts +13 -0
  68. package/nxv0ptv53w.json +1 -0
  69. package/package.json +1 -1
  70. package/src/api-public/controllers/shop.js +2 -2
  71. package/src/api-public/controllers/shop.js.map +1 -1
  72. package/src/api-public/controllers/shop.ts +5 -2
  73. package/src/api-public/controllers/stock.js +1 -1
  74. package/src/api-public/controllers/stock.js.map +1 -1
  75. package/src/api-public/controllers/stock.ts +93 -81
  76. package/src/api-public/models/glitter-finance.js +2 -1
  77. package/src/api-public/models/glitter-finance.js.map +1 -1
  78. package/src/api-public/services/checkout-event.js +1 -0
  79. package/src/api-public/services/checkout-event.js.map +1 -1
  80. package/src/api-public/services/checkout-event.ts +2 -2
  81. package/src/api-public/services/data-analyze.d.ts +1 -1
  82. package/src/api-public/services/diff-record.d.ts +25 -0
  83. package/src/api-public/services/diff-record.js +158 -0
  84. package/src/api-public/services/diff-record.js.map +1 -0
  85. package/src/api-public/services/diff-record.ts +217 -0
  86. package/src/api-public/services/ezpay/tool.d.ts +1 -0
  87. package/src/api-public/services/financial-serviceV2.js +7 -17
  88. package/src/api-public/services/financial-serviceV2.js.map +1 -1
  89. package/src/api-public/services/public-table-check.js +25 -7
  90. package/src/api-public/services/public-table-check.js.map +1 -1
  91. package/src/api-public/services/public-table-check.ts +53 -31
  92. package/src/api-public/services/shopping.d.ts +2 -12
  93. package/src/api-public/services/shopping.js +16 -7
  94. package/src/api-public/services/shopping.js.map +1 -1
  95. package/src/api-public/services/shopping.ts +33 -7
  96. package/src/api-public/services/stock.d.ts +1 -1
  97. package/src/api-public/services/stock.js +19 -17
  98. package/src/api-public/services/stock.js.map +1 -1
  99. package/src/api-public/services/stock.ts +711 -696
  100. package/src/api-public/services/user.d.ts +1 -1
  101. package/src/api-public/services/user.js +18 -8
  102. package/src/api-public/services/user.js.map +1 -1
  103. package/src/api-public/services/user.ts +34 -27
  104. package/src/app-project/serverless/src/index.js +7 -17
  105. package/src/app-project/serverless/src/index.js.map +1 -1
  106. package/src/app-project/serverless/src/modules/CryptoJS.js +7 -17
  107. package/src/app-project/serverless/src/modules/CryptoJS.js.map +1 -1
  108. package/src/app-project/serverless/src/modules/database.d.ts +1 -1
  109. package/src/app-project/serverless/src/modules/redis.d.ts +1 -1
  110. package/src/app-project/serverless/src/modules/ssh.js +7 -17
  111. package/src/app-project/serverless/src/modules/ssh.js.map +1 -1
  112. package/src/firebase/message.js +2 -1
  113. package/src/firebase/message.js.map +1 -1
  114. package/src/helper/app_creater.js +2 -1
  115. package/src/helper/app_creater.js.map +1 -1
  116. package/src/helper/glitter-util.d.ts +1 -0
  117. package/src/index.js +17 -7
  118. package/src/index.js.map +5 -1
  119. package/src/lambda/interface.js +2 -2
  120. package/src/lambda/interface.js.map +1 -1
  121. package/src/modules/CryptoJS.js +7 -17
  122. package/src/modules/CryptoJS.js.map +1 -1
  123. package/src/modules/database.d.ts +1 -1
  124. package/src/modules/ssh.js +7 -17
  125. package/src/modules/ssh.js.map +1 -1
  126. package/src/modules/tool.d.ts +5 -0
  127. package/src/modules/tool.js +19 -0
  128. package/src/modules/tool.js.map +1 -1
  129. package/src/modules/tool.ts +27 -0
  130. package/src/run.js +2 -1
  131. package/src/run.js.map +1 -1
  132. package/src/services/saas-table-check.js +2 -2
  133. package/src/services/saas-table-check.js.map +1 -1
  134. package/src/services/ses.js +2 -1
  135. package/src/services/ses.js.map +1 -1
@@ -1,1483 +1,1825 @@
1
- import {GVC} from '../glitterBundle/GVController.js';
2
- import {ApiUser} from '../glitter-base/route/user.js';
3
- import {ShareDialog} from '../glitterBundle/dialog/ShareDialog.js';
4
- import {BgWidget} from '../backend-manager/bg-widget.js';
5
- import {EditorElem} from '../glitterBundle/plugins/editor-elem.js';
6
- import {FilterOptions} from '../cms-plugin/filter-options.js';
7
- import {Tool} from './tool.js';
1
+ import { GVC } from '../glitterBundle/GVController.js';
2
+ import { ApiUser } from '../glitter-base/route/user.js';
3
+ import { ShareDialog } from '../glitterBundle/dialog/ShareDialog.js';
4
+ import { BgWidget } from '../backend-manager/bg-widget.js';
5
+ import { EditorElem } from '../glitterBundle/plugins/editor-elem.js';
6
+ import { FilterOptions } from '../cms-plugin/filter-options.js';
7
+ import { Tool } from './tool.js';
8
8
 
9
9
  export type FileItem = {
10
- title: string;
11
- data: any;
12
- items?: FileItem[];
13
- type: 'file' | 'folder';
14
- tag: string[];
15
- id: string;
10
+ selected?: boolean;
11
+ title: string;
12
+ data: any;
13
+ items?: FileItem[];
14
+ type: 'file' | 'folder';
15
+ tag: string[];
16
+ id: string;
16
17
  };
17
18
 
18
19
  const html = String.raw;
20
+ const css = String.raw;
19
21
 
20
22
  export class imageLibrary {
21
- public static fileSystem(cf: {
22
- getSelect: (id: FileItem[]) => void;
23
- gvc: GVC;
24
- key: string;
25
- title: string;
26
- mul?: boolean;
27
- tag: string;
28
- plus: (gvc: GVC, callback: (file: FileItem[]) => void, fileType?: string) => void;
29
- edit: (file: FileItem, callback: (file?: FileItem) => void) => void;
30
- cancelEvent?: () => void;
31
- edit_only?:boolean
32
- }) {
33
- const gvc = cf.gvc;
34
- const vm: {
35
- id: string;
36
- link: FileItem[];
37
- loading: boolean;
38
- selected: boolean;
39
- query: string;
40
- orderString: string;
41
- type: string;
42
- tag?: string;
43
- } = {
44
- id: cf.gvc.glitter.getUUID(),
45
- link: [],
46
- selected: false,
47
- loading: true,
48
- query: '',
49
- orderString: 'created_time_desc',
50
- type: 'file',
51
- };
52
- if (cf.key == 'folderEdit') {
53
- vm.tag = cf.tag;
54
- vm.type = 'folderEdit';
55
- }
23
+ public static fileSystem(cf: {
24
+ getSelect: (id: FileItem[]) => void;
25
+ gvc: GVC;
26
+ key: string;
27
+ title: string;
28
+ mul?: boolean;
29
+ tag: string;
30
+ plus: (gvc: GVC, callback: (file: FileItem[]) => void, fileType?: string) => void;
31
+ edit: (
32
+ file: FileItem,
33
+ callback: (file?: FileItem) => void,
34
+ obj?: {
35
+ deleteStyle?: number | 0;
36
+ tag: string | '';
37
+ }
38
+ ) => void;
39
+ cancelEvent?: () => void;
40
+ edit_only?: boolean;
41
+ }) {
42
+ const gvc = cf.gvc;
43
+ const vm: {
44
+ id: string;
45
+ footer_id: string
46
+ link: FileItem[];
47
+ loading: boolean;
48
+ selected: boolean;
49
+ query: string;
50
+ orderString: string;
51
+ type: string;
52
+ tag?: string;
53
+ newFolder: FileItem;
54
+ } = {
55
+ id: cf.gvc.glitter.getUUID(),
56
+ footer_id: gvc.glitter.getUUID(),
57
+ link: [],
58
+ selected: false,
59
+ loading: true,
60
+ query: '',
61
+ orderString: 'created_time_desc',
62
+ type: 'file',
63
+ newFolder: {
64
+ selected: false,
65
+ title: '',
66
+ data: [],
67
+ items: [],
68
+ type: 'folder',
69
+ tag: [],
70
+ id: gvc.glitter.getUUID(),
71
+ },
72
+ };
73
+ const ids = {
74
+ classPrefix: 'image-library-dialog',
75
+ };
56
76
 
57
- function getSelectCount(dd: any) {
58
- let count = 0;
59
- if (dd.selected) {
60
- count++;
61
- }
62
- return dd.items.filter((d: any) => {
63
- return d.selected;
64
- }).length;
65
- }
77
+ gvc.addStyle(css`
78
+ .${ids.classPrefix} {
79
+ }
80
+ `);
66
81
 
67
- function getPublicConfig(callback: () => void) {
68
- ApiUser.getPublicConfig('image-manager', 'manager').then((data: any) => {
69
- if (data.response.value) {
70
- vm.link = data.response.value;
82
+ if (cf.key == 'folderEdit') {
83
+ vm.tag = cf.tag;
84
+ vm.type = 'folderEdit';
85
+ }
86
+ //修改最上面的視窗名稱和最下方的取消按鍵
71
87
 
72
- function loop(array: FileItem[]) {
73
- array.map((dd) => {
74
- if (dd.type === 'folder') {
75
- loop(dd.items ?? []);
76
- }
77
- });
78
- }
88
+ //修改彈出式窗的名字
89
+ function changeWindowsName(name: string) {
90
+ let titleContent = window?.parent?.document?.querySelector('.dialog-title div');
79
91
 
80
- loop(vm.link);
81
- vm.loading = false;
82
- callback();
83
- } else {
84
- vm.loading = false;
85
- callback();
86
- }
87
- });
88
- }
92
+ if (titleContent) {
93
+ titleContent.textContent = name;
94
+ }
95
+ }
89
96
 
90
- const dialog = new ShareDialog(cf.gvc.glitter);
97
+ function changeCancelBTNName(name: string) {
98
+ let backBTN = window?.parent?.document?.querySelector('.btn-snow span');
91
99
 
92
- function clearNoNeedData(items: FileItem[]) {
93
- items.map((dd) => {
94
- if ((dd as any).selected) {
95
- (dd as any).selected = undefined;
96
- }
97
- clearNoNeedData(dd.items || []);
100
+ if (backBTN) {
101
+ backBTN.textContent = name;
102
+ }
103
+ }
104
+
105
+ function gClass(className: string) {
106
+ return ids.classPrefix + '-' + className;
107
+ }
108
+
109
+ function getSelectCount(dd: any) {
110
+ let count = 0;
111
+ if (dd.selected) {
112
+ count++;
113
+ }
114
+ return dd.items.filter((d: any) => {
115
+ return d.selected;
116
+ }).length;
117
+ }
118
+
119
+ function getPublicConfig(callback: () => void) {
120
+ ApiUser.getPublicConfig('image-manager', 'manager').then((data: any) => {
121
+ if (data.response.value) {
122
+ vm.link = data.response.value;
123
+
124
+ function loop(array: FileItem[]) {
125
+ array.map(dd => {
126
+ if (dd.type === 'folder') {
127
+ loop(dd.items ?? []);
128
+ }
98
129
  });
130
+ }
131
+
132
+ loop(vm.link);
133
+ vm.loading = false;
134
+ callback();
135
+ } else {
136
+ vm.loading = false;
137
+ callback();
99
138
  }
139
+ });
140
+ }
100
141
 
101
- function save(finish: () => void) {
102
- clearNoNeedData(vm.link);
103
- dialog.dataLoading({visible: true});
104
- ApiUser.setPublicConfig({
105
- key: 'image-manager',
106
- value: vm.link,
107
- user_id: 'manager',
108
- }).then((data) => {
109
- dialog.dataLoading({visible: false});
110
- dialog.successMessage({text: '儲存成功'});
111
- finish();
112
- });
142
+ const dialog = new ShareDialog(cf.gvc.glitter);
143
+
144
+ function clearNoNeedData(items: FileItem[]) {
145
+ items.map(dd => {
146
+ if ((dd as any).selected) {
147
+ (dd as any).selected = undefined;
113
148
  }
149
+ clearNoNeedData(dd.items || []);
150
+ });
151
+ }
152
+
153
+ function save(finish: () => void) {
154
+ clearNoNeedData(vm.link);
155
+ dialog.dataLoading({ visible: true });
156
+ ApiUser.setPublicConfig({
157
+ key: 'image-manager',
158
+ value: vm.link,
159
+ user_id: 'manager',
160
+ }).then(data => {
161
+ dialog.dataLoading({ visible: false });
162
+ dialog.successMessage({ text: '儲存成功' });
163
+ finish();
164
+ });
165
+ }
166
+
167
+ function closeFolderView(returnPage: 'folder' | 'file' = 'folder') {
168
+ changeWindowsName('圖片庫');
169
+ changeCancelBTNName('取消');
170
+ }
114
171
 
115
- const isSafari = (() => {
116
- const userAgent = navigator.userAgent.toLowerCase();
117
- return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('edg');
118
- })();
172
+ const isSafari = (() => {
173
+ const userAgent = navigator.userAgent.toLowerCase();
174
+ return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('edg');
175
+ })();
119
176
 
120
- return BgWidget.imageLibraryDialog({
121
- gvc: gvc,
122
- title: cf.title,
123
- innerHTML: (gvc: GVC) => {
124
- const that = this;
125
-
126
- function renderItems(
127
- array: FileItem[],
128
- opt?: {
129
- onlyRead?: boolean;
177
+ return BgWidget.imageLibraryDialog({
178
+ gvc: gvc,
179
+ title: cf.title,
180
+ innerHTML: (gvc: GVC) => {
181
+ const that = this;
182
+
183
+ function renderItems(
184
+ array: FileItem[],
185
+ opt?: {
186
+ onlyRead?: boolean;
187
+ }
188
+ ): string {
189
+ const id = gvc.glitter.getUUID();
190
+ return gvc.bindView(() => {
191
+ return {
192
+ bind: id,
193
+ view: () => {
194
+ try {
195
+ let editArray: boolean[] = [];
196
+ let sortArray = array.map(dd => {
197
+ return dd;
198
+ });
199
+
200
+ switch (vm.orderString) {
201
+ case 'created_time_desc': {
202
+ sortArray.reverse();
203
+ break;
130
204
  }
131
- ): string {
132
- const id = gvc.glitter.getUUID();
133
- return gvc.bindView(() => {
134
- return {
135
- bind: id,
136
- view: () => {
137
- try {
138
- let editArray: boolean[] = [];
139
- let sortArray = array.map((dd) => {
140
- return dd;
141
- });
142
- switch (vm.orderString) {
143
- case 'created_time_desc': {
144
- sortArray.reverse();
145
- break;
146
- }
147
- case 'created_time_asc': {
148
- break;
149
- }
150
- case 'name_AtoZ': {
151
- sortArray.sort((a, b) => {
152
- return a.title.localeCompare(b.title);
153
- });
154
- break;
155
- }
156
- case 'name_ZtoA': {
157
- sortArray.sort((b, a) => {
158
- return a.title.localeCompare(b.title);
159
- });
160
- break;
161
- }
162
- default:
163
- break;
164
- }
165
- return sortArray
166
- .map((dd, index) => {
167
- const passType = ['file', 'folderView', 'folderEdit', 'folderADD'];
168
- const noImageURL = 'https://d3jnmi1tfjgtti.cloudfront.net/file/234285319/1722936949034-default_image.jpg';
169
- const originImageURL = passType.includes(vm.type) ? dd.data : vm.link.find((data) => data?.tag?.includes(dd.title))?.data;
170
- const originImageSplit = (originImageURL || '').split('/');
171
- const imageBoxClass = Tool.randomString(5);
172
-
173
- dd.title = dd.title || originImageSplit.pop() || '圖片尚未命名';
174
- if (editArray.length < index + 1) {
175
- editArray.push(false);
176
- }
205
+ case 'created_time_asc': {
206
+ break;
207
+ }
208
+ case 'name_AtoZ': {
209
+ sortArray.sort((a, b) => {
210
+ return a.title.localeCompare(b.title);
211
+ });
212
+ break;
213
+ }
214
+ case 'name_ZtoA': {
215
+ sortArray.sort((b, a) => {
216
+ return a.title.localeCompare(b.title);
217
+ });
218
+ break;
219
+ }
220
+ default:
221
+ break;
222
+ }
223
+ return sortArray
224
+ .map((fileItem, index) => {
225
+ const passType = ['file', 'folderView', 'folderEdit', 'folderADD'];
226
+ const noImageURL =
227
+ 'https://d3jnmi1tfjgtti.cloudfront.net/file/234285319/1722936949034-default_image.jpg';
228
+ const originImageURL = passType.includes(vm.type)
229
+ ? fileItem.data
230
+ : vm.link.find(data => data?.tag?.includes(fileItem.title))?.data;
231
+ const originImageSplit = (originImageURL || '').split('/');
232
+ const imageBoxClass = Tool.randomString(5);
177
233
 
178
- if (!dd.title.toLowerCase().includes(vm.query.toLowerCase())) {
179
- return;
180
- }
234
+ fileItem.title = fileItem.title || originImageSplit.pop() || '圖片尚未命名';
235
+ if (editArray.length < index + 1) {
236
+ editArray.push(false);
237
+ }
181
238
 
182
- let viewID = gvc.glitter.getUUID();
183
- return gvc.bindView({
184
- bind: viewID,
185
- view: () => {
186
- try {
187
- const imageUrl = originImageURL ?? noImageURL;
188
-
189
- function itemClick() {
190
- if (vm.type == 'folder') {
191
- //編輯資料夾內容
192
- vm.tag = dd.title;
193
- that.selectImageLibrary(
194
- gvc,
195
- (selectData) => {
196
- vm.link = selectData;
197
- gvc.notifyDataChange(vm.id);
198
- },
199
- `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
200
- {
201
- key: 'folderEdit',
202
- mul: true,
203
- tag: dd.title,
204
- }
205
- );
206
- } else {
207
- cf.edit(dd, (replace) => {
208
- if (!replace) {
209
- let selectData = vm.link.findIndex((data) => {
210
- return data.id == dd.id;
211
- });
212
- vm.link.splice(selectData, 1);
213
- save(() => {
214
- gvc.notifyDataChange(vm.id);
215
- });
216
- } else {
217
- let replaceIndex = vm.link.findIndex((data) => data.id == replace.id);
218
- vm.link[replaceIndex] = replace;
219
- save(() => {
220
- gvc.notifyDataChange(vm.id);
221
- });
222
- }
223
- });
224
- }
225
- }
226
-
227
- return html`
228
- <div
229
- class=""
230
- style="padding: 10px 12px;position: relative;${(dd as any).selected
231
- ? `border-radius: 10px;border: 2px solid #393939;background: #F7F7F7;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);`
232
- : editArray[index]
233
- ? `border-radius: 10px;border: 1px solid #DDD;background: #F7F7F7;`
234
- : ``}"
235
- onclick="${gvc.event((e, event) => {
236
- let defaultSelect = (dd as any).selected;
237
- if (vm.type == 'folder') {
238
- array = [];
239
- vm.type = 'folderView';
240
- vm.tag = dd.title;
241
- gvc.notifyDataChange(vm.id);
242
- return;
243
- }
244
- if (opt?.onlyRead) {
245
- return;
246
- }
247
- if (!cf.mul) {
248
- array.forEach((data) => {
249
- (data as any).selected = false;
250
- });
251
- }
252
- (dd as any).selected = !defaultSelect;
253
- gvc.notifyDataChange(vm.id);
254
- event.stopPropagation();
255
- })}"
256
- ${!gvc.glitter.isTouchDevice()
257
- ? `
258
- onmouseenter="${gvc.event(() => {
259
- if (opt?.onlyRead || cf.key == 'album') {
260
- return;
261
- }
262
- if (!editArray[index]) {
263
- editArray[index] = true;
264
- gvc.notifyDataChange(viewID);
265
- }
266
- })}"
267
- onmouseleave="${gvc.event((e, event) => {
268
- if (opt?.onlyRead) return;
269
- if (isSafari) {
270
- const target = event.relatedTarget as HTMLElement;
271
- const imageBoxClassList = [imageBoxClass];
272
- const targetClassList = Array.from(target.classList);
273
- const isOutBorder =
274
- imageBoxClassList.every((cls) => targetClassList.includes(cls)) &&
275
- targetClassList.every((cls) => imageBoxClassList.includes(cls));
276
- const isTitle = targetClassList.includes(`${imageBoxClass}-title`);
277
- const isInside = targetClassList.length === 0;
278
- const isOutOfViewContainer = target.dataset.viewContainer === 'true';
279
- const isUL = target.tagName === 'UL';
280
-
281
- if ((isOutBorder || isTitle || isInside) && !(isOutOfViewContainer || isUL)) {
282
- return;
283
- }
284
- }
285
- editArray[index] = false;
286
- gvc.notifyDataChange(viewID);
287
- })}"
288
- `
289
- : ``}
290
- >
291
- <div
292
- class="${editArray[index] && !(dd as any).selected ? `d-flex` : `d-none`} align-items-center justify-content-center"
293
- style="height:24px;width:24px;border-radius: 3px;background: rgba(0, 0, 0, 0.80);position: absolute;right: 8.15px;top: 8px;"
294
- onclick="${gvc.event((e, event) => {
295
- event.stopPropagation();
296
- itemClick();
297
- })}"
298
- >
299
- <svg xmlns="http://www.w3.org/2000/svg" width="12"
300
- height="12" viewBox="0 0 12 12" fill="none">
301
- <g clip-path="url(#clip0_13619_1920)">
302
- <path
303
- d="M0.852963 8.45864L0.3139 10.2891L0.0232751 11.2782C-0.0353187 11.4774 0.0185876 11.6907 0.1639 11.836C0.309213 11.9813 0.522494 12.0352 0.719369 11.979L1.71078 11.686L3.54124 11.1469C3.78499 11.0766 4.01234 10.9594 4.21156 10.8071L4.21859 10.8118L4.23031 10.793C4.26312 10.7672 4.29359 10.7415 4.32406 10.7157C4.35687 10.6875 4.38734 10.6571 4.41781 10.6266L11.5475 3.49927C12.0608 2.98599 12.1241 2.19614 11.7397 1.61255C11.6858 1.53052 11.6202 1.45083 11.5475 1.37817L10.6241 0.452393C10.0381 -0.133545 9.0889 -0.133545 8.50296 0.452393L1.37328 7.58208C1.31468 7.64067 1.25843 7.70395 1.20687 7.76958L1.18812 7.7813L1.19281 7.78833C1.04046 7.98755 0.925619 8.21489 0.852963 8.45864ZM8.9764 4.47661L4.6264 8.82661L3.4639 8.53599L3.17327 7.37349L7.52328 3.02349L8.9764 4.47661ZM2.27328 8.41177L2.45374 9.13833C2.50296 9.33989 2.66234 9.49692 2.8639 9.54849L3.59046 9.72895L3.41703 9.99145C3.35609 10.0243 3.29281 10.0524 3.22718 10.0711L2.67874 10.2329L1.39203 10.6079L1.76937 9.32349L1.93109 8.77505C1.94984 8.70942 1.97796 8.6438 2.01078 8.5852L2.27328 8.41177ZM7.38968 5.12583C7.53499 4.98052 7.53499 4.74145 7.38968 4.59614C7.24437 4.45083 7.00531 4.45083 6.85999 4.59614L4.60999 6.84614C4.46468 6.99146 4.46468 7.23052 4.60999 7.37583C4.75531 7.52114 4.99437 7.52114 5.13968 7.37583L7.38968 5.12583Z"
304
- fill="white"
305
- />
306
- </g>
307
- <defs>
308
- <clipPath id="clip0_13619_1920">
309
- <rect width="12" height="12"
310
- fill="white"/>
311
- </clipPath>
312
- </defs>
313
- </svg>
314
- </div>
315
- <div
316
- class="position-absolute ${(dd as any).selected ? `d-blok` : `d-none`} "
317
- style="transform: translate(-50%,-50%);left: 50%;top:50%;"
318
- >
319
- ${BgWidget.darkButton(
320
- '編輯圖片',
321
- gvc.event(() => {
322
- itemClick();
323
- })
324
- )}
325
- </div>
326
- <div
327
- class="${(dd as any).selected ? `d-flex` : `d-none`} "
328
- style="height:24px;width:24px;border-radius: 3px;position: absolute;right: 8.15px;top: 8px;"
329
- >
330
- <i class="fa-solid fa-square-check "
331
- style="color: #393939;font-size: 24px;"></i>
332
- </div>
333
-
334
- <div
335
- style="width:100%;padding-top: 100%;background:50%/contain url('${imageUrl}') no-repeat;border-radius: 5px;border: 0.938px solid #DDD;background: ;"
336
- ></div>
337
- <div
338
- class="w-100 text-center font-size: 16px;font-style: normal;font-weight: 400;text-overflow: ellipsis;"
339
- style="overflow:hidden;white-space: nowrap;text-overflow: ellipsis;"
340
- contenteditable="true"
341
- onchange="${gvc.event((e: any) => {
342
- })}"
343
- >
344
- ${dd.title}
345
- </div>
346
- </div>
347
- `;
348
- } catch (e) {
349
- console.error(e);
350
- return ``;
351
- }
352
- },
353
- divCreate: {
354
- style: `${gvc.glitter.ut.frSize(
355
- {
356
- sm: `width:15%;`,
357
- },
358
- `width:49%;`
359
- )}cursor:pointer;`,
360
- },
361
- });
362
- })
363
- .join('');
364
- } catch (e) {
365
- console.error(`error=>`, e);
366
- return ``;
239
+ if (!fileItem.title.toLowerCase().includes(vm.query.toLowerCase())) {
240
+ return;
241
+ }
242
+
243
+ let viewID = gvc.glitter.getUUID();
244
+ return gvc.bindView({
245
+ bind: viewID,
246
+ view: () => {
247
+ try {
248
+ const imageUrl = originImageURL ?? noImageURL;
249
+
250
+ function itemClick() {
251
+ if (vm.type == 'folder') {
252
+ console.log("vm.link --" , vm.link);
253
+ //編輯資料夾內容
254
+ vm.type = 'folderEdit';
255
+ that.selectImageLibrary(
256
+ gvc,
257
+ selectData => {
258
+ vm.link = selectData;
259
+ gvc.notifyDataChange(vm.id);
260
+ },
261
+ `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
262
+ {
263
+ key: 'folderEdit',
264
+ mul: true,
265
+ tag: fileItem.title,
266
+ }
267
+ );
268
+ } else if (vm.type == 'folderView') {
269
+ function updateLinkList(replaceId: string, newItem?: FileItem) {
270
+ const replaceItemIndex = vm.link.findIndex(i => i.id === replaceId);
271
+ console.log(replaceItemIndex);
272
+ if (replaceItemIndex < 0) return;
273
+ if (newItem) vm.link[replaceItemIndex] = newItem;
274
+ else vm.link.splice(replaceItemIndex, 1);
275
+ save(() => gvc.notifyDataChange(vm.id));
367
276
  }
368
- },
369
- divCreate: {
370
- elem: 'ul',
371
- class: `w-100 my-2 flex-wrap `,
372
- style: `display:flex;gap:${gvc.glitter.ut.frSize(
373
- {
374
- sm: `17`,
375
- },
376
- `0`
377
- )}px;${document.body.clientWidth < 800 ? `justify-content: space-between;` : ``}`,
378
- },
379
- onCreate: () => {
380
- gvc.glitter.addMtScript(
381
- [
382
- {
383
- src: `https://raw.githack.com/SortableJS/Sortable/master/Sortable.js`,
384
- },
385
- ],
386
- () => {
387
- },
388
- () => {
389
- }
277
+
278
+ cf.edit(
279
+ fileItem,
280
+ (replace?: FileItem) => {
281
+ updateLinkList(replace?.id ?? fileItem.id, replace);
282
+ // save(() => gvc.notifyDataChange(vm.id));
283
+ },
284
+ {
285
+ deleteStyle: 1,
286
+ tag: vm.tag ?? '',
287
+ }
390
288
  );
391
- const interval = setInterval(() => {
392
- //@ts-ignore
393
- if (window.Sortable) {
394
- try {
395
- gvc.addStyle(`
396
- ul {
397
- list-style: none;
398
- padding: 0;
399
- }
400
- `);
401
-
402
- function swapArr(arr: any, index1: number, index2: number) {
403
- const data = arr[index1];
404
- arr.splice(index1, 1);
405
- arr.splice(index2, 0, data);
406
- }
289
+ } else {
290
+ cf.edit(fileItem, replace => {
291
+ if (!replace) {
292
+ let selectData = vm.link.findIndex(data => {
293
+ return data.id == fileItem.id;
294
+ });
295
+ vm.link.splice(selectData, 1);
296
+ save(() => {
297
+ gvc.notifyDataChange(vm.id);
298
+ });
299
+ } else {
300
+ let replaceIndex = vm.link.findIndex(data => data.id == replace.id);
301
+ vm.link[replaceIndex] = replace;
302
+ save(() => {
303
+ gvc.notifyDataChange(vm.id);
304
+ });
305
+ }
306
+ });
307
+ }
308
+ }
309
+
310
+ return html`
311
+ <div
312
+ style="padding: 10px 12px;position: relative;${(fileItem as any).selected
313
+ ? `border-radius: 10px;border: 2px solid #393939;background: #F7F7F7;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);`
314
+ : editArray[index]
315
+ ? `border-radius: 10px;border: 1px solid #DDD;background: #F7F7F7;`
316
+ : ``}"
317
+ onclick="${gvc.event((e, event) => {
318
+ let defaultSelect = (fileItem as any).selected;
319
+ if (vm.type == 'folder') {
320
+ array = [];
321
+ vm.type = 'folderView';
322
+ vm.tag = fileItem.title;
323
+
324
+ gvc.notifyDataChange(vm.id);
325
+ return;
326
+ }
327
+ if (opt?.onlyRead) {
328
+ return;
329
+ }
330
+ if (!cf.mul) {
331
+ array.forEach(data => {
332
+ (data as any).selected = false;
333
+ });
334
+ }
335
+ (fileItem as any).selected = !defaultSelect;
336
+ gvc.notifyDataChange(vm.id);
337
+ event.stopPropagation();
338
+ })}"
339
+ ${!gvc.glitter.isTouchDevice()
340
+ ? `onmouseenter="${gvc.event(() => {
341
+ if (opt?.onlyRead || cf.key == 'album') {
342
+ return;
343
+ }
344
+ if (!editArray[index]) {
345
+ editArray[index] = true;
346
+ gvc.notifyDataChange(viewID);
347
+ }
348
+ })}"onmouseleave="${gvc.event((e, event) => {
349
+ if (opt?.onlyRead) return;
350
+ if (isSafari) {
351
+ const target = event.relatedTarget as HTMLElement;
352
+ const imageBoxClassList = [imageBoxClass];
353
+ const targetClassList = Array.from(target.classList);
354
+ const isOutBorder =
355
+ imageBoxClassList.every(cls => targetClassList.includes(cls)) &&
356
+ targetClassList.every(cls => imageBoxClassList.includes(cls));
357
+ const isTitle = targetClassList.includes(`${imageBoxClass}-title`);
358
+ const isInside = targetClassList.length === 0;
359
+ const isOutOfViewContainer = target.dataset.viewContainer === 'true';
360
+ const isUL = target.tagName === 'UL';
407
361
 
408
- let startIndex = 0;
409
- //@ts-ignore
410
- Sortable.create(gvc.getBindViewElem(id).get(0), {
411
- group: id,
412
- animation: 100,
413
- handle: '.dragItem',
414
- onChange: function (evt: any) {
415
- },
416
- onEnd: (evt: any) => {
417
- swapArr(array, startIndex, evt.newIndex);
418
- gvc.notifyDataChange(id);
419
- },
420
- onStart: function (evt: any) {
421
- startIndex = evt.oldIndex;
422
- },
423
- });
424
- } catch (e) {
362
+ if ((isOutBorder || isTitle || isInside) && !(isOutOfViewContainer || isUL)) {
363
+ return;
425
364
  }
426
- clearInterval(interval);
427
- }
428
- }, 100);
365
+ }
366
+ editArray[index] = false;
367
+ gvc.notifyDataChange(viewID);
368
+ })}"
369
+ `
370
+ : ``}
371
+ >
372
+ <div
373
+ class="${editArray[index] && !(fileItem as any).selected
374
+ ? `d-flex`
375
+ : `d-none`} align-items-center justify-content-center"
376
+ style="height:24px;width:24px;border-radius: 3px;background: rgba(0, 0, 0, 0.80);position: absolute;right: 8.15px;top: 8px;"
377
+ onclick="${gvc.event((e, event) => {
378
+ event.stopPropagation();
379
+ itemClick();
380
+ })}"
381
+ >
382
+ <svg
383
+ xmlns="http://www.w3.org/2000/svg"
384
+ width="12"
385
+ height="12"
386
+ viewBox="0 0 12 12"
387
+ fill="none"
388
+ >
389
+ <g clip-path="url(#clip0_13619_1920)">
390
+ <path
391
+ d="M0.852963 8.45864L0.3139 10.2891L0.0232751 11.2782C-0.0353187 11.4774 0.0185876 11.6907 0.1639 11.836C0.309213 11.9813 0.522494 12.0352 0.719369 11.979L1.71078 11.686L3.54124 11.1469C3.78499 11.0766 4.01234 10.9594 4.21156 10.8071L4.21859 10.8118L4.23031 10.793C4.26312 10.7672 4.29359 10.7415 4.32406 10.7157C4.35687 10.6875 4.38734 10.6571 4.41781 10.6266L11.5475 3.49927C12.0608 2.98599 12.1241 2.19614 11.7397 1.61255C11.6858 1.53052 11.6202 1.45083 11.5475 1.37817L10.6241 0.452393C10.0381 -0.133545 9.0889 -0.133545 8.50296 0.452393L1.37328 7.58208C1.31468 7.64067 1.25843 7.70395 1.20687 7.76958L1.18812 7.7813L1.19281 7.78833C1.04046 7.98755 0.925619 8.21489 0.852963 8.45864ZM8.9764 4.47661L4.6264 8.82661L3.4639 8.53599L3.17327 7.37349L7.52328 3.02349L8.9764 4.47661ZM2.27328 8.41177L2.45374 9.13833C2.50296 9.33989 2.66234 9.49692 2.8639 9.54849L3.59046 9.72895L3.41703 9.99145C3.35609 10.0243 3.29281 10.0524 3.22718 10.0711L2.67874 10.2329L1.39203 10.6079L1.76937 9.32349L1.93109 8.77505C1.94984 8.70942 1.97796 8.6438 2.01078 8.5852L2.27328 8.41177ZM7.38968 5.12583C7.53499 4.98052 7.53499 4.74145 7.38968 4.59614C7.24437 4.45083 7.00531 4.45083 6.85999 4.59614L4.60999 6.84614C4.46468 6.99146 4.46468 7.23052 4.60999 7.37583C4.75531 7.52114 4.99437 7.52114 5.13968 7.37583L7.38968 5.12583Z"
392
+ fill="white"
393
+ />
394
+ </g>
395
+ <defs>
396
+ <clipPath id="clip0_13619_1920">
397
+ <rect width="12" height="12" fill="white" />
398
+ </clipPath>
399
+ </defs>
400
+ </svg>
401
+ </div>
402
+ <div
403
+ class="position-absolute ${(fileItem as any).selected ? `d-blok` : `d-none`} "
404
+ style="transform: translate(-50%,-50%);left: 50%;top:50%;"
405
+ >
406
+ ${BgWidget.darkButton(
407
+ '編輯圖片',
408
+ gvc.event(() => {
409
+ itemClick();
410
+ })
411
+ )}
412
+ </div>
413
+ <div
414
+ class="${(fileItem as any).selected ? `d-flex` : `d-none`} "
415
+ style="height:24px;width:24px;border-radius: 3px;position: absolute;right: 8.15px;top: 8px;"
416
+ >
417
+ <i class="fa-solid fa-square-check " style="color: #393939;font-size: 24px;"></i>
418
+ </div>
419
+ <div
420
+ style="width:100%;padding-top: 100%;background:50%/contain url('${imageUrl}') no-repeat;border-radius: 5px;border: 0.938px solid #DDD;background: ;"
421
+ ></div>
422
+ <div
423
+ class="w-100 text-center font-size: 16px;font-style: normal;font-weight: 400;text-overflow: ellipsis;"
424
+ style="overflow:hidden;white-space: nowrap;text-overflow: ellipsis;"
425
+ onchange="${gvc.event((e: any) => {})}"
426
+ >
427
+ ${fileItem.title}
428
+ </div>
429
+ </div>
430
+ `;
431
+ } catch (e) {
432
+ console.error(e);
433
+ return ``;
434
+ }
435
+ },
436
+ divCreate: {
437
+ style: `${gvc.glitter.ut.frSize(
438
+ {
439
+ sm: `width:15%;`,
429
440
  },
430
- };
431
- });
441
+ `width:49%;`
442
+ )}cursor:pointer;`,
443
+ },
444
+ });
445
+ })
446
+ .join('');
447
+ } catch (e) {
448
+ console.error(`error=>`, e);
449
+ return ``;
432
450
  }
451
+ },
452
+ divCreate: {
453
+ elem: 'ul',
454
+ class: `w-100 my-2 flex-wrap `,
455
+ style: `display:flex;gap:${gvc.glitter.ut.frSize(
456
+ {
457
+ sm: `17`,
458
+ },
459
+ `0`
460
+ )}px;${document.body.clientWidth < 800 ? `justify-content: space-between;` : ``}`,
461
+ },
462
+ onCreate: () => {
463
+ gvc.glitter.addMtScript(
464
+ [
465
+ {
466
+ src: `https://raw.githack.com/SortableJS/Sortable/master/Sortable.js`,
467
+ },
468
+ ],
469
+ () => {},
470
+ () => {}
471
+ );
472
+ const interval = setInterval(() => {
473
+ if ((window as any).Sortable) {
474
+ try {
475
+ gvc.addStyle(css`
476
+ ul {
477
+ list-style: none;
478
+ padding: 0;
479
+ }
480
+ `);
433
481
 
434
- getPublicConfig(() => {
435
- gvc.notifyDataChange(vm.id);
436
- });
437
- return gvc.bindView(() => {
438
- return {
439
- bind: vm.id,
440
- view: async () => {
441
- const dialog = new ShareDialog(cf.gvc.glitter);
442
-
443
- function pageBTN() {
444
- let key = [
445
- {
446
- key: 'file',
447
- value: '全部圖片',
448
- },
449
- {
450
- key: 'folder',
451
- value: '相簿',
452
- },
453
- ];
454
- return key
455
- .map((data) => {
456
- return html`
457
- <div
458
- style="color:${vm.type == data.key
459
- ? '#393939'
460
- : '#8D8D8D'};display: flex;padding:6px 18px;justify-content: center;align-items: center;border-radius: 10px;border: 2px solid ${vm.type == data.key
461
- ? '#393939'
462
- : '#8D8D8D'};background: #FFF;font-weight: ${vm.type == data.key ? '700' : '500'};cursor: pointer;"
463
- onclick="${gvc.event((e) => {
464
- vm.type = data.key;
465
- vm.query = '';
466
- gvc.notifyDataChange(vm.id);
467
- })}"
468
- >
469
- ${data.value}
470
- </div>
471
- `;
472
- })
473
- .join('');
474
- }
475
-
476
- // 空白夾新增的頁面
477
-
478
- if (vm.type == 'folderADD') {
479
- return html`
480
- <div class="d-flex flex-column"
481
- style="font-size: 16px;font-style: normal;font-weight: 400;gap:8px;">
482
- 相簿名稱
483
- <input
484
- class="w-100"
485
- value="${vm.tag ?? ''}"
486
- placeholder="請輸入相簿名稱"
487
- style="height: 40px;padding: 9px 18px;border-radius: 10px;border: 1px solid #DDD;"
488
- onchange="${gvc.event((e) => {
489
- vm.tag = e.value;
490
- })}"
491
- />
492
- </div>
493
- <div
494
- class="w-100 "
495
- style="margin-top:18px;padding: 39px 0;display: flex;justify-content: center;align-items: center;border-radius: 10px;border: 1px solid #DDD;background: #FFF;gap:14px;"
496
- >
497
- <div
498
- style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
499
- onclick="${gvc.event(() => {
500
- if (!vm.tag) {
501
- const dialog = new ShareDialog(cf.gvc.glitter);
502
- dialog.errorMessage({text: '請先輸入相簿名稱'});
503
- return;
504
- }
505
- this.selectImageLibrary(
506
- gvc,
507
- (selectData) => {
508
- const folder: FileItem = {
509
- title: vm.tag ?? 'folder',
510
- data: [],
511
- items: selectData,
512
- type: 'folder',
513
- tag: [],
514
- id: gvc.glitter.getUUID(),
515
- };
516
- selectData.map((data) => {
517
- let matchingElement = vm.link.find((item2) => item2.id === data.id);
518
- if (matchingElement) {
519
- if (!matchingElement.tag) {
520
- matchingElement.tag = [];
521
- }
522
-
523
- if (!matchingElement.tag.includes(vm.tag as string)) {
524
- matchingElement!.tag.push(vm.tag as string);
525
- }
526
- }
527
- (data as any).selected = false;
528
- });
529
- vm.link.push(folder);
530
- vm.type = 'folder';
531
- gvc.notifyDataChange(vm.id);
532
- save(() => {
533
- gvc.notifyDataChange(vm.id);
534
- });
535
- // postMD.content_array = id
536
- // obj.gvc.notifyDataChange(bi)
537
- // getPublicConfig(()=>{
538
- // gvc.notifyDataChange(vm.id);
539
- // });
540
- },
541
- `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
542
- {
543
- key: 'album',
544
- mul: true,
545
- }
546
- );
547
- })}"
548
- >
549
- 從圖庫中選擇
550
- </div>
551
- <div
552
- style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
553
- onclick="${gvc.event(() => {
554
- if (!vm.tag) {
555
- const dialog = new ShareDialog(cf.gvc.glitter);
556
- dialog.errorMessage({text: '請先輸入相簿名稱'});
557
- return;
558
- }
559
- cf.plus(
560
- gvc,
561
- (fileArray) => {
562
- const folder: FileItem = {
563
- title: vm.tag ?? 'folder',
564
- data: [],
565
- items: [],
566
- type: 'folder',
567
- tag: [],
568
- id: gvc.glitter.getUUID(),
569
- };
570
-
571
- fileArray.forEach((item) => {
572
- item.tag = [];
573
- item.tag.push(vm.tag as string);
574
- vm.link.push(item);
575
- });
576
-
577
- vm.link.push(folder);
578
- gvc.notifyDataChange(vm.id);
579
- },
580
- 'file'
581
- );
582
- })}"
583
- >
584
- 上傳新圖片
585
- </div>
586
- </div>
587
- <div class="">
588
- ${gvc.bindView({
589
- bind: `folderItemGroup`,
590
- view: () => {
591
- if (vm.tag) {
592
- let group = vm.link.filter((item2) => {
593
- return item2.tag && item2.tag.includes(vm.tag ?? '');
594
- });
595
- return renderItems(group, {onlyRead: true});
596
- }
597
- return ``;
598
- },
599
- divCreate: {},
600
- })}
601
- </div>
602
- `;
603
- }
604
- //資料夾的內容檢視
605
- if (vm.type == 'folderView') {
606
- return html`
607
- <div class="d-flex flex-column"
608
- style="font-size: 16px;font-style: normal;font-weight: 400;gap:8px;">
609
- <input
610
- class="w-100"
611
- value="${vm.tag ?? ''}"
612
- placeholder="請輸入相簿名稱"
613
- style="height: 40px;padding: 9px 18px;border-radius: 10px;border: 1px solid #DDD;"
614
- onchange="${gvc.event((e) => {
615
- vm.tag = e.value;
616
- })}"
617
- />
618
- </div>
619
- <div class="d-flex w-100" style="gap:14px;margin-top: 12px;">
620
- ${BgWidget.searchFilter(
621
- gvc.event((e) => {
622
- vm.query = e.value;
623
- gvc.notifyDataChange(vm.id);
624
- }),
625
- vm.query || '',
626
- '搜尋圖片'
627
- )}
628
- ${BgWidget.updownFilter({
629
- gvc,
630
- callback: (value: any) => {
631
- vm.orderString = value;
632
- gvc.notifyDataChange(vm.id);
633
- },
634
- default: vm.orderString || 'default',
635
- options: FilterOptions.imageLibraryOrderBy,
636
- })}
637
- </div>
638
- <div class="">
639
- ${gvc.bindView({
640
- bind: `folderItemGroup`,
641
- view: () => {
642
- if (vm.tag) {
643
- let group = vm.link.filter((item2) => {
644
- return item2.tag && item2.tag.includes(vm.tag ?? '');
645
- });
646
- return renderItems(group);
647
- }
648
- return ``;
649
- },
650
- divCreate: {},
651
- })}
652
- </div>
653
- `;
654
- }
655
- //資料夾的內容編輯
656
- if (vm.type == 'folderEdit') {
657
- return html`
658
- <div class="d-flex flex-column"
659
- style="font-size: 16px;font-style: normal;font-weight: 400;gap:8px;">
660
- 相簿名稱
661
- <input
662
- class="w-100"
663
- value="${vm.tag ?? ''}"
664
- placeholder="請輸入相簿名稱"
665
- style="height: 40px;padding: 9px 18px;border-radius: 10px;border: 1px solid #DDD;"
666
- onchange="${gvc.event((e) => {
667
- vm.tag = e.value;
668
- })}"
669
- />
670
- </div>
671
- <div class="d-flex w-100" style="gap:14px;margin-top: 12px;">
672
- ${BgWidget.searchFilter(
673
- gvc.event((e) => {
674
- vm.query = e.value;
675
- gvc.notifyDataChange(vm.id);
676
- }),
677
- vm.query || '',
678
- '搜尋圖片'
679
- )}
680
- ${BgWidget.updownFilter({
681
- gvc,
682
- callback: (value: any) => {
683
- vm.orderString = value;
684
- gvc.notifyDataChange(vm.id);
685
- },
686
- default: vm.orderString || 'default',
687
- options: FilterOptions.imageLibraryOrderBy,
688
- })}
689
- </div>
690
- <div class="d-flex w-100 justify-content-end" style="gap:12px;margin-top: 18px;">
691
- <div style="margin-right: auto; color: #393939; font-size: 14px; font-family: Noto Sans; font-weight: 700; word-wrap: break-word">
692
- 已選取${getSelectCount({
693
- items: vm.link,
694
- })}項
695
- </div>
696
- ${BgWidget.grayButton(
697
- '刪除',
698
- gvc.event(() => {
699
- let selectedData = vm.link.filter((item) => (item as any).selected);
700
- selectedData.forEach((item) => {
701
- (item as any).selected = false;
702
- item.tag = item.tag.filter((tag) => {
703
- return tag !== vm.tag;
704
- });
705
- });
706
-
707
- let folder = vm.link.find((dd) => {
708
- return dd.title == vm.tag && dd.type == 'folder';
709
- });
710
- gvc.notifyDataChange(vm.id);
711
- })
712
- )}
713
- ${BgWidget.grayButton(
714
- '新增圖片',
715
- gvc.event(() => {
716
- const thatGVC = gvc;
717
- gvc.glitter.innerDialog((gvc: GVC) => {
718
- return html`
719
- <div style="width: 445px;height: 255px;border-radius: 10px;background: #FFF;">
720
- <div class="d-flex"
721
- style="color:#393939;display: flex;padding: 12px 20px;align-items: center;gap: 10px;">
722
- 新增圖片
723
- <span
724
- class="d-flex align-items-center justify-content-center"
725
- style="margin-left: auto;cursor: pointer;"
726
- onclick="${gvc.event(() => {
727
- gvc.glitter.closeDiaLog('add');
728
- })}"
729
- >
730
- <svg xmlns="http://www.w3.org/2000/svg" width="14"
731
- height="14" viewBox="0 0 14 14" fill="none">
732
- <path d="M1 1L13 13" stroke="#393939"
733
- stroke-linecap="round"/>
734
- <path d="M13 1L1 13" stroke="#393939"
735
- stroke-linecap="round"/>
736
- </svg>
737
- </span>
738
- </div>
739
- <div class="d-flex justify-content-center"
740
- style="padding-top:61px;gap:14px;">
741
- <div
742
- style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
743
- onclick="${gvc.event(() => {
744
- this.selectImageLibrary(
745
- gvc,
746
- (selectData) => {
747
- selectData.map((data) => {
748
- let matchingElement = vm.link.find((item2) => item2.id === data.id);
749
- if (matchingElement) {
750
- if (!matchingElement.tag) {
751
- matchingElement.tag = [];
752
- }
753
-
754
- if (!matchingElement.tag.includes(vm.tag as string)) {
755
- matchingElement!.tag.push(vm.tag as string);
756
- }
757
- }
758
- (data as any).selected = false;
759
- });
760
-
761
- gvc.glitter.closeDiaLog('add');
762
- thatGVC.notifyDataChange(vm.id);
763
- },
764
- `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
765
- {
766
- key: 'album',
767
- mul: true,
768
- }
769
- );
770
- })}"
771
- >
772
- 從圖庫中選擇
773
- </div>
774
- <div
775
- style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
776
- onclick="${gvc.event(() => {
777
- cf.plus(
778
- gvc,
779
- (fileArray) => {
780
- fileArray.forEach((item) => {
781
- item.tag = [];
782
- item.tag.push(vm.tag as string);
783
- vm.link.push(item);
784
- });
785
- gvc.glitter.closeDiaLog('add');
786
- thatGVC.notifyDataChange(vm.id);
787
- },
788
- 'file'
789
- );
790
- })}"
791
- >
792
- 上傳新圖片
793
- </div>
794
- </div>
795
- </div>
796
- `;
797
- }, 'add');
798
- })
799
- )}
800
- </div>
801
- <div class="">
802
- ${gvc.bindView({
803
- bind: `folderItemGroup`,
804
- view: () => {
805
- if (vm.tag) {
806
- return renderItems(
807
- vm.link.filter((item2) => {
808
- return item2.tag && item2.tag.includes(vm.tag ?? '');
809
- })
810
- );
811
- }
812
- return ``;
813
- },
814
- divCreate: {},
815
- })}
816
- </div>
817
- `;
818
- }
819
-
820
- function drawSelectImg() {
821
- return html`
822
- <div style="">
823
- <div style="width: 100%; position: relative">
824
- <div
825
- style="width: 100%; left: 0; top: 0; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 20px; display: inline-flex"
826
- >
827
- <div class=" ${cf.key == 'album' ? `d-none` : `d-flex`}"
828
- style="gap:14px;">${pageBTN()}
829
- </div>
830
- <div class="d-flex w-100" style="gap:14px;">
831
- ${BgWidget.searchFilter(
832
- gvc.event((e) => {
833
- vm.query = e.value;
834
- gvc.notifyDataChange(vm.id);
835
- }),
836
- vm.query || '',
837
- cf.key == 'album-manager' || vm.type == 'file' ? `搜尋圖片` : `搜尋相簿`
838
- )}
839
- ${BgWidget.updownFilter({
840
- gvc,
841
- callback: (value: any) => {
842
- vm.orderString = value;
843
- gvc.notifyDataChange(vm.id);
844
- },
845
- default: vm.orderString || 'default',
846
- options: FilterOptions.imageLibraryOrderBy,
847
- })}
848
- </div>
849
- <div
850
- class="w-100 ${getSelectCount({
851
- items: vm.link,
852
- }) > 0 && vm.type == 'file'
853
- ? ``
854
- : `d-none`}"
855
- style="height: 40px; padding: 12px 18px;background: #F7F7F7; border-radius: 10px; justify-content: flex-end; align-items: center; gap: 8px; display: inline-flex"
856
- >
857
- <div style="flex: 1 1 0; color: #393939; font-size: 14px; font-family: Noto Sans; font-weight: 700; word-wrap: break-word">
858
- 已選取${getSelectCount({
859
- items: vm.link,
860
- })}項
861
- </div>
862
- </div>
863
- <div style="align-self: stretch; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 18px; display: flex">
864
- ${(() => {
865
- let viewData = vm.link.filter((data) => {
866
- return data.type == vm.type;
867
- });
868
-
869
- if (viewData.length == 0) {
870
- return html`
871
- <div class="w-100 h-100 d-flex flex-column align-items-center justify-content-center"
872
- style="padding-top: 106px;">
873
- ${vm.type == 'file'
874
- ? html`
875
- <svg xmlns="http://www.w3.org/2000/svg"
876
- width="80" height="80"
877
- viewBox="0 0 80 80" fill="none">
878
- <path
879
- d="M10 10C7.23438 10 5 12.2344 5 15V51.4688L15.5781 40.8906C18.0156 38.4531 21.9688 38.4531 24.4219 40.8906L35 51.4688L55.5781 30.8906C58.0156 28.4531 61.9688 28.4531 64.4219 30.8906L75 41.4688V15C75 12.2344 72.7656 10 70 10H10ZM5 58.5312V65C5 67.7656 7.23438 70 10 70H16.4688L31.4688 55L20.8906 44.4219C20.4062 43.9375 19.6094 43.9375 19.125 44.4219L5 58.5312ZM60.8906 34.4219C60.4063 33.9375 59.6094 33.9375 59.125 34.4219L23.5312 70H70C72.7656 70 75 67.7656 75 65V48.5312L60.8906 34.4219ZM0 15C0 9.48438 4.48438 5 10 5H70C75.5156 5 80 9.48438 80 15V65C80 70.5156 75.5156 75 70 75H10C4.48438 75 0 70.5156 0 65V15ZM25 22.5C25 21.837 24.7366 21.2011 24.2678 20.7322C23.7989 20.2634 23.163 20 22.5 20C21.837 20 21.2011 20.2634 20.7322 20.7322C20.2634 21.2011 20 21.837 20 22.5C20 23.163 20.2634 23.7989 20.7322 24.2678C21.2011 24.7366 21.837 25 22.5 25C23.163 25 23.7989 24.7366 24.2678 24.2678C24.7366 23.7989 25 23.163 25 22.5ZM15 22.5C15 20.5109 15.7902 18.6032 17.1967 17.1967C18.6032 15.7902 20.5109 15 22.5 15C24.4891 15 26.3968 15.7902 27.8033 17.1967C29.2098 18.6032 30 20.5109 30 22.5C30 24.4891 29.2098 26.3968 27.8033 27.8033C26.3968 29.2098 24.4891 30 22.5 30C20.5109 30 18.6032 29.2098 17.1967 27.8033C15.7902 26.3968 15 24.4891 15 22.5Z"
880
- fill="#393939"
881
- />
882
- </svg>`
883
- : html`
884
- <svg xmlns="http://www.w3.org/2000/svg"
885
- width="80" height="80"
886
- viewBox="0 0 80 80" fill="none">
887
- <path
888
- d="M10 10C7.23438 10 5 12.2344 5 15V65C5 67.7656 7.23438 70 10 70H70C72.7656 70 75 67.7656 75 65V25C75 22.2344 72.7656 20 70 20H45.6094C42.9531 20 40.4062 18.9531 38.5312 17.0781L32.9219 11.4688C31.9844 10.5312 30.7188 10 29.3906 10H10ZM0 15C0 9.48438 4.48438 5 10 5H29.3906C32.0469 5 34.5938 6.04688 36.4688 7.92188L42.0781 13.5312C43.0156 14.4688 44.2812 15 45.6094 15H70C75.5156 15 80 19.4844 80 25V65C80 70.5156 75.5156 75 70 75H10C4.48438 75 0 70.5156 0 65V15Z"
889
- fill="#393939"
890
- />
891
- </svg>`}
892
- <div style="color: #8D8D8D;font-size: 18px;font-weight: 400;margin-top: 12px;margin-bottom: 24px;">
893
- ${vm.type == 'file' ? `尚未上傳任何圖片` : `尚未建立任何相簿`}
894
- </div>
895
- <div
896
- style="color: #FFF;font-weight: 700;font-size: 16px;padding: 6px 18px;border-radius: 10px;background: #393939;cursor: pointer;"
897
- onclick="${gvc.event(() => {
898
- if (vm.type == 'file') {
899
- cf.plus(
900
- gvc,
901
- (file) => {
902
- vm.link.push(...file);
903
- save(() => {
904
- gvc.notifyDataChange(vm.id);
905
- });
906
- },
907
- 'file'
908
- );
909
- } else {
910
- vm.tag = '';
911
- vm.type = 'folderADD';
912
- gvc.notifyDataChange(vm.id);
913
- }
914
- })}"
915
- >
916
- ${vm.type == 'file' ? `上傳圖片` : `建立相簿`}
917
- </div>
918
- </div>
919
- `;
920
- }
921
- return html`
922
- <div
923
- class="w-100 ${cf.key == 'album' ? `d-none` : `d-flex`} align-items-center justify-content-center"
924
- style="padding: 39px 0;border-radius: 10px;border: 1px solid #DDD;background: #FFF;"
925
- >
926
- <div
927
- style="padding:6px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);font-size: 16px;font-weight: 400;cursor:pointer;"
928
- onclick="${gvc.event(() => {
929
- if (vm.type == 'file') {
930
- cf.plus(
931
- gvc,
932
- (file) => {
933
- vm.link.push(...file);
934
- save(() => {
935
- gvc.notifyDataChange(vm.id);
936
- });
937
- },
938
- 'file'
939
- );
940
- } else {
941
- vm.tag = '';
942
- vm.type = 'folderADD';
943
- gvc.notifyDataChange(vm.id);
944
- }
945
- })}"
946
- >
947
- ${vm.type == 'file' ? '上傳新照片' : '上傳相簿'}
948
- </div>
949
- </div>
950
- ${renderItems(viewData)}
951
- `;
952
- })()}
953
- </div>
954
- </div>
955
- </div>
956
- </div>
957
- `;
958
- }
482
+ function swapArr(arr: any, index1: number, index2: number) {
483
+ const data = arr[index1];
484
+ arr.splice(index1, 1);
485
+ arr.splice(index2, 0, data);
486
+ }
959
487
 
960
- if (vm.loading) {
961
- dialog.dataLoading({
962
- visible: true,
963
- });
964
- return ``;
965
- }
966
- dialog.dataLoading({
967
- visible: false,
968
- });
969
- return drawSelectImg();
488
+ let startIndex = 0;
489
+ (window as any).create(gvc.getBindViewElem(id).get(0), {
490
+ group: id,
491
+ animation: 100,
492
+ handle: '.dragItem',
493
+ onChange: function (evt: any) {},
494
+ onEnd: (evt: any) => {
495
+ swapArr(array, startIndex, evt.newIndex);
496
+ gvc.notifyDataChange(id);
970
497
  },
971
- divCreate: {
972
- style: ``,
498
+ onStart: function (evt: any) {
499
+ startIndex = evt.oldIndex;
973
500
  },
974
- };
975
- });
976
- },
977
- footer_html: (gvc: GVC) => {
978
- const dialog = new ShareDialog(cf.gvc.glitter);
501
+ });
502
+ } catch (e) {}
503
+ clearInterval(interval);
504
+ }
505
+ }, 100);
506
+ },
507
+ };
508
+ });
509
+ }
979
510
 
980
- function clearNoNeedData(items: FileItem[]) {
981
- items.map((dd) => {
982
- if ((dd as any).selected) {
983
- (dd as any).selected = undefined;
984
- }
985
- clearNoNeedData(dd.items || []);
986
- });
987
- }
511
+ getPublicConfig(() => {
512
+ gvc.notifyDataChange(vm.id);
513
+ });
988
514
 
989
- function save(finish: () => void, text?: string) {
990
- clearNoNeedData(vm.link);
991
- dialog.dataLoading({visible: true});
992
- ApiUser.setPublicConfig({
993
- key: 'image-manager',
994
- value: vm.link,
995
- user_id: 'manager',
996
- }).then((data) => {
997
- dialog.dataLoading({visible: false});
998
- dialog.successMessage({text: text ?? '儲存成功'});
999
- finish();
1000
- });
515
+ return gvc.bindView(() => {
516
+ return {
517
+ bind: vm.id,
518
+ view: async () => {
519
+ const dialog = new ShareDialog(cf.gvc.glitter);
520
+ gvc.notifyDataChange(vm.footer_id)
521
+ function drawBreadcrumb() {
522
+ return html`
523
+ <div class="d-flex" style="margin: 20px 0">
524
+ <div class="breadcrumb-item">
525
+ <div
526
+ class="cursor_pointer"
527
+ onclick="${gvc.event(() => {
528
+ closeFolderView();
529
+ vm.type = 'file';
530
+ gvc.notifyDataChange(vm.id);
531
+ })}"
532
+ >
533
+ 我的圖庫
534
+ </div>
535
+ </div>
536
+ <div class="breadcrumb-item">
537
+ <div
538
+ class="cursor_pointer"
539
+ onclick="${gvc.event(() => {
540
+ closeFolderView();
541
+ vm.type = 'folder';
542
+ gvc.notifyDataChange(vm.id);
543
+ })}"
544
+ >
545
+ 相簿
546
+ </div>
547
+ </div>
548
+ <div class="breadcrumb-item">
549
+ <div>${vm.tag}</div>
550
+ </div>
551
+ </div>
552
+ `;
553
+ }
554
+
555
+ function pageBTN() {
556
+ let key = [
557
+ {
558
+ key: 'file',
559
+ value: '全部圖片',
560
+ },
561
+ {
562
+ key: 'folder',
563
+ value: '相簿',
564
+ },
565
+ ];
566
+ return key
567
+ .map(data => {
568
+ return html`
569
+ <div
570
+ style="color:${vm.type == data.key
571
+ ? '#393939'
572
+ : '#8D8D8D'};display: flex;padding:6px 18px;justify-content: center;align-items: center;border-radius: 10px;border: 2px solid ${vm.type ==
573
+ data.key
574
+ ? '#393939'
575
+ : '#8D8D8D'};background: #FFF;font-weight: ${vm.type == data.key
576
+ ? '700'
577
+ : '500'};cursor: pointer;"
578
+ onclick="${gvc.event(e => {
579
+ vm.type = data.key;
580
+ vm.query = '';
581
+ gvc.notifyDataChange(vm.id);
582
+ })}"
583
+ >
584
+ ${data.value}
585
+ </div>
586
+ `;
587
+ })
588
+ .join('');
589
+ }
590
+ if (vm.type == 'folderViewToEdit'){
591
+ vm.type = 'folderView';
592
+ console.log("vm.link --" , vm.link);
593
+ await that.selectImageLibrary(
594
+ gvc,
595
+ selectData => {
596
+ vm.link = selectData;
597
+ gvc.notifyDataChange(vm.id);
598
+ },
599
+ `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
600
+ {
601
+ key: 'folderEdit',
602
+ mul: true,
603
+ tag: vm.tag,
604
+ }
605
+ );
606
+ }
607
+ // 空白資料夾新增的頁面
608
+ if (vm.type == 'folderADD') {
609
+ function pushFolder(folder: FileItem, imageArray: FileItem[]) {
610
+ console.log('folder -- ', folder);
611
+ console.log('imageArray -- ', imageArray);
612
+ imageArray.forEach(image => {
613
+ image.selected = false;
614
+ });
615
+ return folder.data.push(...imageArray);
1001
616
  }
1002
617
 
1003
- switch (cf.key) {
1004
- case 'folderEdit': {
1005
- return [
1006
- BgWidget.cancel(
1007
- gvc.event(() => {
1008
- if (cf.cancelEvent) {
1009
- cf.cancelEvent();
1010
- }
1011
- gvc.closeDialog();
1012
- })
1013
- ),
1014
- BgWidget.danger(
1015
- gvc.event(() => {
1016
- const dialog = new ShareDialog(gvc.glitter);
1017
- dialog.checkYesOrNot({
1018
- text: `刪除後使用此資源的內容將被取消關聯,是否確認刪除?`,
1019
- callback: (response) => {
1020
- if (response) {
1021
- let selectedData = vm.link.filter((item) => item?.tag && item?.tag?.includes(vm.tag ?? ''));
1022
- selectedData.forEach((item) => {
1023
- (item as any).selected = false;
1024
- item.tag = item.tag.filter((tag) => {
1025
- return tag !== vm.tag;
1026
- });
1027
- });
1028
-
1029
- let folder = vm.link.findIndex((dd) => {
1030
- return dd.title == vm.tag && dd.type == 'folder';
1031
- });
1032
- vm.link.splice(folder, 1);
1033
- cf.getSelect(vm.link);
1034
- save(() => {
1035
- gvc.closeDialog();
1036
- }, '刪除成功');
1037
-
1038
- // save(() => {
1039
- // gvc.notifyDataChange(vm.id);
1040
- // gvc.closeDialog();
1041
- // })
618
+ vm.newFolder = {
619
+ selected: false,
620
+ title: '',
621
+ data: [],
622
+ items: [],
623
+ type: 'folder',
624
+ tag: [],
625
+ id: gvc.glitter.getUUID(),
626
+ };
627
+ return html`
628
+ <div class="d-flex flex-column ${gClass('new-album-title-bar')}">
629
+ 相簿名稱
630
+ <input
631
+ class="w-100"
632
+ value="${vm.tag ?? ''}"
633
+ placeholder="請輸入相簿名稱"
634
+ onchange="${gvc.event(e => {
635
+ vm.tag = e.value;
636
+ })}"
637
+ />
638
+ </div>
639
+ <div class="w-100 ${gClass('new-album-add-block')}">
640
+ <div
641
+ class="btn1"
642
+ onclick="${gvc.event(() => {
643
+ this.selectImageLibrary(
644
+ gvc,
645
+ selectData => {
646
+ pushFolder(vm.newFolder, selectData);
647
+ gvc.notifyDataChange('folderItemGroup');
648
+ },
649
+ `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
650
+ {
651
+ key: 'album',
652
+ mul: true,
653
+ }
654
+ );
655
+ })}"
656
+ >
657
+ 從圖庫中選擇
658
+ </div>
659
+ <div
660
+ class="btn1"
661
+ onclick="${gvc.event(() => {
662
+ cf.plus(
663
+ gvc,
664
+ fileArray => {
665
+ pushFolder(vm.newFolder, fileArray);
666
+ save(() => {
667
+ gvc.notifyDataChange('folderItemGroup');
668
+ });
669
+ },
670
+ 'file'
671
+ );
672
+ })}"
673
+ >
674
+ 上傳新圖片
675
+ </div>
676
+ </div>
677
+ ${gvc.bindView({
678
+ bind: `folderItemGroup`,
679
+ view: () => {
680
+ return renderItems(vm.newFolder.data, { onlyRead: true });
681
+ },
682
+ divCreate: {},
683
+ })}
684
+ `;
685
+ }
686
+ //資料夾的內容檢視
687
+ if (vm.type == 'folderView') {
688
+ changeWindowsName(vm.tag ?? 'folder');
689
+ changeCancelBTNName('返回');
690
+ return html`
691
+ ${drawBreadcrumb()}
692
+ <div class="d-flex w-100" style="gap:14px;margin-top: 12px;">
693
+ ${BgWidget.searchFilter(
694
+ gvc.event(e => {
695
+ vm.query = e.value;
696
+ gvc.notifyDataChange(vm.id);
697
+ }),
698
+ vm.query || '',
699
+ '搜尋圖片'
700
+ )}
701
+ ${BgWidget.updownFilter({
702
+ gvc,
703
+ callback: (value: any) => {
704
+ vm.orderString = value;
705
+ gvc.notifyDataChange(vm.id);
706
+ },
707
+ default: vm.orderString || 'default',
708
+ options: FilterOptions.imageLibraryOrderBy,
709
+ })}
710
+ </div>
711
+ ${gvc.bindView({
712
+ bind: `folderItemGroup`,
713
+ view: () => {
714
+ if (vm.tag) {
715
+ let group = vm.link.filter(item2 => {
716
+ return item2.tag && item2.tag.includes(vm.tag ?? '');
717
+ });
718
+ return renderItems(group);
719
+ }
720
+ return ``;
721
+ },
722
+ divCreate: {},
723
+ })}
724
+ `;
725
+ }
726
+ //資料夾的內容編輯
727
+ if (vm.type == 'folderEdit') {
728
+ return html`
729
+ <div class="d-flex flex-column ${gClass('album-title')}" style="">
730
+ 相簿名稱
731
+ <input
732
+ class="w-100"
733
+ value="${vm.tag ?? ''}"
734
+ placeholder="請輸入相簿名稱"
735
+ style="height: 40px;padding: 9px 18px;border-radius: 10px;border: 1px solid #DDD;"
736
+ onchange="${gvc.event(e => {
737
+ vm.tag = e.value;
738
+ })}"
739
+ />
740
+ </div>
741
+ <div class="d-flex w-100" style="gap:14px;margin-top: 12px;">
742
+ ${BgWidget.searchFilter(
743
+ gvc.event(e => {
744
+ vm.query = e.value;
745
+ gvc.notifyDataChange(vm.id);
746
+ }),
747
+ vm.query || '',
748
+ '搜尋圖片'
749
+ )}
750
+ ${BgWidget.updownFilter({
751
+ gvc,
752
+ callback: (value: any) => {
753
+ vm.orderString = value;
754
+ gvc.notifyDataChange(vm.id);
755
+ },
756
+ default: vm.orderString || 'default',
757
+ options: FilterOptions.imageLibraryOrderBy,
758
+ })}
759
+ </div>
760
+ <div class="d-flex w-100 justify-content-end" style="gap:12px;margin-top: 18px;">
761
+ <div
762
+ style="margin-right: auto; color: #393939; font-size: 14px; font-family: Noto Sans; font-weight: 700; word-wrap: break-word"
763
+ >
764
+ 已選取${getSelectCount({
765
+ items: vm.link,
766
+ })}項
767
+ </div>
768
+ ${BgWidget.grayButton(
769
+ '刪除',
770
+ gvc.event(() => {
771
+ let selectedData = vm.link.filter(item => (item as any).selected);
772
+ selectedData.forEach(item => {
773
+ (item as any).selected = false;
774
+ item.tag = item.tag.filter(tag => {
775
+ return tag !== vm.tag;
776
+ });
777
+ });
778
+
779
+ let folder = vm.link.find(dd => {
780
+ return dd.title == vm.tag && dd.type == 'folder';
781
+ });
782
+ gvc.notifyDataChange(vm.id);
783
+ })
784
+ )}
785
+ ${BgWidget.grayButton(
786
+ '新增圖片',
787
+ gvc.event(() => {
788
+ const thatGVC = gvc;
789
+ gvc.glitter.innerDialog((gvc: GVC) => {
790
+ return html`
791
+ <div style="width: 445px;height: 255px;border-radius: 10px;background: #FFF;">
792
+ <div
793
+ class="d-flex"
794
+ style="color:#393939;display: flex;padding: 12px 20px;align-items: center;gap: 10px;"
795
+ >
796
+ 新增圖片
797
+ <span
798
+ class="d-flex align-items-center justify-content-center"
799
+ style="margin-left: auto;cursor: pointer;"
800
+ onclick="${gvc.event(() => {
801
+ gvc.glitter.closeDiaLog('add');
802
+ })}"
803
+ >
804
+ <svg
805
+ xmlns="http://www.w3.org/2000/svg"
806
+ width="14"
807
+ height="14"
808
+ viewBox="0 0 14 14"
809
+ fill="none"
810
+ >
811
+ <path d="M1 1L13 13" stroke="#393939" stroke-linecap="round" />
812
+ <path d="M13 1L1 13" stroke="#393939" stroke-linecap="round" />
813
+ </svg>
814
+ </span>
815
+ </div>
816
+ <div class="d-flex justify-content-center" style="padding-top:61px;gap:14px;">
817
+ <div
818
+ style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
819
+ onclick="${gvc.event(() => {
820
+ this.selectImageLibrary(
821
+ gvc,
822
+ selectData => {
823
+ selectData.map(data => {
824
+ let matchingElement = vm.link.find(item2 => item2.id === data.id);
825
+ if (matchingElement) {
826
+ if (!matchingElement.tag) {
827
+ matchingElement.tag = [];
1042
828
  }
1043
- },
1044
- });
1045
- }),
1046
- '刪除相簿'
1047
- ),
1048
- BgWidget.save(
1049
- gvc.event(() => {
1050
- cf.getSelect(vm.link);
1051
- save(() => {
1052
- gvc.closeDialog();
1053
- });
1054
- }),
1055
- '確定變更'
1056
- ),
1057
- ].join('');
1058
- }
1059
- default: {
1060
- let finishBTN = cf.key == 'album' ? '建立' : '完成';
1061
- return [
1062
- BgWidget.cancel(
1063
- gvc.event(() => {
1064
- if (cf.cancelEvent) {
1065
- cf.cancelEvent();
1066
- }
1067
- if (vm.type == 'folderView' || vm.type == 'folderADD') {
1068
- vm.type = 'folder';
1069
- gvc.notifyDataChange(vm.id);
1070
- } else {
1071
- gvc.closeDialog();
1072
- }
1073
- })
1074
- ),
1075
- BgWidget.save(
1076
- gvc.event(() => {
1077
- let select: FileItem[] = [];
1078
-
1079
- function loop(array: FileItem[]) {
1080
- array.map((dd) => {
1081
- if (dd.type === 'folder') {
1082
- loop(dd.items || []);
1083
- } else {
1084
- if ((dd as any).selected) {
1085
- select.push(dd);
1086
- }
829
+
830
+ if (!matchingElement.tag.includes(vm.tag as string)) {
831
+ matchingElement!.tag.push(vm.tag as string);
1087
832
  }
833
+ }
834
+ (data as any).selected = false;
1088
835
  });
1089
- }
1090
836
 
1091
- loop(vm.link);
1092
- if (cf.key == 'album') {
1093
- dialog.successMessage({
1094
- text: '相簿建立成功',
837
+ gvc.glitter.closeDiaLog('add');
838
+ thatGVC.notifyDataChange(vm.id);
839
+ },
840
+ `<div class="d-flex flex-column" style="border-radius: 10px 10px 0px 0px;background: #F2F2F2;">${vm.tag}</div>`,
841
+ {
842
+ key: 'album',
843
+ mul: true,
844
+ }
845
+ );
846
+ })}"
847
+ >
848
+ 從圖庫中選擇
849
+ </div>
850
+ <div
851
+ style="padding: 10px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);cursor: pointer;"
852
+ onclick="${gvc.event(() => {
853
+ cf.plus(
854
+ gvc,
855
+ fileArray => {
856
+ fileArray.forEach(item => {
857
+ item.tag = [];
858
+ item.tag.push(vm.tag as string);
859
+ vm.link.push(item);
1095
860
  });
1096
- }
1097
- if (cf.key == 'image-manager' || cf.key == 'folderEdit') {
1098
- if (select.length > 0 || cf.edit_only) {
1099
- save(() => {
1100
- cf.getSelect(select);
1101
- gvc.closeDialog();
1102
- });
1103
- } else {
1104
- const dialog = new ShareDialog(gvc.glitter);
1105
- dialog.errorMessage({text: '請選擇至少一張圖片'});
1106
- }
1107
- // save(() => {
1108
- // if (select.length > 0){
1109
- // cf.getSelect(select);
1110
- // gvc.closeDialog();
1111
- // }
1112
- // })
861
+ gvc.glitter.closeDiaLog('add');
862
+ thatGVC.notifyDataChange(vm.id);
863
+ },
864
+ 'file'
865
+ );
866
+ })}"
867
+ >
868
+ 上傳新圖片
869
+ </div>
870
+ </div>
871
+ </div>
872
+ `;
873
+ }, 'add');
874
+ })
875
+ )}
876
+ </div>
877
+ <div class="">
878
+ ${gvc.bindView({
879
+ bind: `folderItemGroup`,
880
+ view: () => {
881
+ if (vm.tag) {
882
+ return renderItems(
883
+ vm.link.filter(item2 => {
884
+ return item2.tag && item2.tag.includes(vm.tag ?? '');
885
+ })
886
+ );
887
+ }
888
+ return ``;
889
+ },
890
+ divCreate: {},
891
+ })}
892
+ </div>
893
+ `;
894
+ }
895
+
896
+ function drawSelectImg() {
897
+ const css = String.raw;
898
+ gvc.addStyle(css`
899
+ .fixed-top-section {
900
+ display: flex;
901
+ flex-direction: column;
902
+ height: auto; /* 設定一個固定的高度 (或用 auto 讓內容決定) */
903
+ flex-shrink: 0;
904
+ padding: 15px;
905
+ box-sizing: border-box; /* padding 不影響宣告的高度 */
906
+ width: 100%;
907
+ gap: 20px;
908
+ position: sticky;
909
+ background: #fff;
910
+ left: 0;
911
+ top: 0;
912
+ z-index: 2;
913
+ }
914
+
915
+ .scrollable-bottom-section {
916
+ flex-grow: 1; /* 重要:讓此區塊佔滿所有剩餘的垂直空間 */
917
+ overflow-y: auto; /* 關鍵:當內容垂直溢出時,只在此區塊顯示垂直滾動條 */
918
+ width: 100%;
919
+ padding: 15px;
920
+ box-sizing: border-box;
921
+ gap: 20px;
922
+ }
923
+
924
+ .${ids.classPrefix}-content {
925
+ left: 0;
926
+ top: 0;
927
+ position: relative;
928
+ }
929
+
930
+ .${ids.classPrefix}-select-bar {
931
+ height: 40px;
932
+ padding: 12px 18px;
933
+ background: #f7f7f7;
934
+ border-radius: 10px;
935
+ justify-content: flex-end;
936
+ align-items: center;
937
+ gap: 8px;
938
+ display: ${cf.mul ? `inline-flex` : `none`};
939
+ }
940
+
941
+ .${ids.classPrefix}-new-album-title-bar {
942
+ font-size: 16px;
943
+ font-style: normal;
944
+ font-weight: 400;
945
+ gap: 8px;
946
+ padding-top: 12px;
947
+ }
948
+
949
+ .${ids.classPrefix}-new-album-title-bar input {
950
+ height: 40px;
951
+ padding: 9px 18px;
952
+ border-radius: 10px;
953
+ border: 1px solid #ddd;
954
+ }
955
+
956
+ .${ids.classPrefix}-new-album-add-block {
957
+ margin-top: 18px;
958
+ padding: 39px 0;
959
+ display: flex;
960
+ justify-content: center;
961
+ align-items: center;
962
+ border-radius: 10px;
963
+ border: 1px solid #ddd;
964
+ background: #fff;
965
+ gap: 14px;
966
+ }
967
+
968
+ .${ids.classPrefix}-new-album-add-block .btn1 {
969
+ padding: 10px 18px;
970
+ border-radius: 10px;
971
+ border: 1px solid #ddd;
972
+ background: #fff;
973
+ box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
974
+ cursor: pointer;
975
+ }
976
+
977
+ .${ids.classPrefix}-album-title {
978
+ font-size: 16px;
979
+ font-style: normal;
980
+ font-weight: 400;
981
+ gap: 8px;
982
+ padding-top: 12px;
983
+ }
984
+
985
+ .${ids.classPrefix}-album-title input {
986
+ height: 40px;
987
+ padding: 9px 18px;
988
+ border-radius: 10px;
989
+ border: 1px solid #ddd;
990
+ }
991
+ `);
992
+ return html`
993
+ <div
994
+ class="w-100 d-inline-flex flex-column justify-content-start align-items-start ${gClass('content')}"
995
+ >
996
+ <div class="fixed-top-section">
997
+ <div class=" ${cf.key == 'album' ? `d-none` : `d-flex`}" style="gap:14px;">${pageBTN()}</div>
998
+ <div class="d-flex w-100" style="gap:14px;">
999
+ ${BgWidget.searchFilter(
1000
+ gvc.event(e => {
1001
+ vm.query = e.value;
1002
+ gvc.notifyDataChange(vm.id);
1003
+ }),
1004
+ vm.query || '',
1005
+ cf.key == 'album-manager' || vm.type == 'file' ? `搜尋圖片` : `搜尋相簿`
1006
+ )}
1007
+ ${BgWidget.updownFilter({
1008
+ gvc,
1009
+ callback: (value: any) => {
1010
+ vm.orderString = value;
1011
+ gvc.notifyDataChange(vm.id);
1012
+ },
1013
+ default: vm.orderString || 'default',
1014
+ options: FilterOptions.imageLibraryOrderBy,
1015
+ })}
1016
+ </div>
1017
+ </div>
1018
+ <div class="scrollable-bottom-section d-flex flex-column">
1019
+ <div
1020
+ class="w-100 ${gClass('select-bar')} ${getSelectCount({
1021
+ items: vm.link,
1022
+ }) > 0 && vm.type == 'file'
1023
+ ? ``
1024
+ : `d-none`}"
1025
+ >
1026
+ <div
1027
+ style="flex: 1 1 0; color: #393939; font-size: 14px; font-family: Noto Sans; font-weight: 700; word-wrap: break-word"
1028
+ >
1029
+ 已選取${getSelectCount({
1030
+ items: vm.link,
1031
+ })}項
1032
+ </div>
1033
+ </div>
1034
+ <div
1035
+ style="align-self: stretch; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 18px; display: flex"
1036
+ >
1037
+ ${(() => {
1038
+ let viewData = vm.link.filter(data => {
1039
+ return data.type == vm.type;
1040
+ });
1041
+ if (viewData.length == 0) {
1042
+ return html`
1043
+ <div
1044
+ class="w-100 h-100 d-flex flex-column align-items-center justify-content-center"
1045
+ style="padding-top: 106px;"
1046
+ >
1047
+ ${vm.type == 'file'
1048
+ ? html` <svg
1049
+ xmlns="http://www.w3.org/2000/svg"
1050
+ width="80"
1051
+ height="80"
1052
+ viewBox="0 0 80 80"
1053
+ fill="none"
1054
+ >
1055
+ <path
1056
+ d="M10 10C7.23438 10 5 12.2344 5 15V51.4688L15.5781 40.8906C18.0156 38.4531 21.9688 38.4531 24.4219 40.8906L35 51.4688L55.5781 30.8906C58.0156 28.4531 61.9688 28.4531 64.4219 30.8906L75 41.4688V15C75 12.2344 72.7656 10 70 10H10ZM5 58.5312V65C5 67.7656 7.23438 70 10 70H16.4688L31.4688 55L20.8906 44.4219C20.4062 43.9375 19.6094 43.9375 19.125 44.4219L5 58.5312ZM60.8906 34.4219C60.4063 33.9375 59.6094 33.9375 59.125 34.4219L23.5312 70H70C72.7656 70 75 67.7656 75 65V48.5312L60.8906 34.4219ZM0 15C0 9.48438 4.48438 5 10 5H70C75.5156 5 80 9.48438 80 15V65C80 70.5156 75.5156 75 70 75H10C4.48438 75 0 70.5156 0 65V15ZM25 22.5C25 21.837 24.7366 21.2011 24.2678 20.7322C23.7989 20.2634 23.163 20 22.5 20C21.837 20 21.2011 20.2634 20.7322 20.7322C20.2634 21.2011 20 21.837 20 22.5C20 23.163 20.2634 23.7989 20.7322 24.2678C21.2011 24.7366 21.837 25 22.5 25C23.163 25 23.7989 24.7366 24.2678 24.2678C24.7366 23.7989 25 23.163 25 22.5ZM15 22.5C15 20.5109 15.7902 18.6032 17.1967 17.1967C18.6032 15.7902 20.5109 15 22.5 15C24.4891 15 26.3968 15.7902 27.8033 17.1967C29.2098 18.6032 30 20.5109 30 22.5C30 24.4891 29.2098 26.3968 27.8033 27.8033C26.3968 29.2098 24.4891 30 22.5 30C20.5109 30 18.6032 29.2098 17.1967 27.8033C15.7902 26.3968 15 24.4891 15 22.5Z"
1057
+ fill="#393939"
1058
+ />
1059
+ </svg>`
1060
+ : html` <svg
1061
+ xmlns="http://www.w3.org/2000/svg"
1062
+ width="80"
1063
+ height="80"
1064
+ viewBox="0 0 80 80"
1065
+ fill="none"
1066
+ >
1067
+ <path
1068
+ d="M10 10C7.23438 10 5 12.2344 5 15V65C5 67.7656 7.23438 70 10 70H70C72.7656 70 75 67.7656 75 65V25C75 22.2344 72.7656 20 70 20H45.6094C42.9531 20 40.4062 18.9531 38.5312 17.0781L32.9219 11.4688C31.9844 10.5312 30.7188 10 29.3906 10H10ZM0 15C0 9.48438 4.48438 5 10 5H29.3906C32.0469 5 34.5938 6.04688 36.4688 7.92188L42.0781 13.5312C43.0156 14.4688 44.2812 15 45.6094 15H70C75.5156 15 80 19.4844 80 25V65C80 70.5156 75.5156 75 70 75H10C4.48438 75 0 70.5156 0 65V15Z"
1069
+ fill="#393939"
1070
+ />
1071
+ </svg>`}
1072
+ <div
1073
+ style="color: #8D8D8D;font-size: 18px;font-weight: 400;margin-top: 12px;margin-bottom: 24px;"
1074
+ >
1075
+ ${vm.type == 'file' ? `尚未上傳任何圖片` : `尚未建立任何相簿`}
1076
+ </div>
1077
+ <div
1078
+ style="color: #FFF;font-weight: 700;font-size: 16px;padding: 6px 18px;border-radius: 10px;background: #393939;cursor: pointer;"
1079
+ onclick="${gvc.event(() => {
1080
+ if (vm.type == 'file') {
1081
+ cf.plus(
1082
+ gvc,
1083
+ file => {
1084
+ vm.link.push(...file);
1085
+ save(() => {
1086
+ gvc.notifyDataChange(vm.id);
1087
+ });
1088
+ },
1089
+ 'file'
1090
+ );
1113
1091
  } else {
1114
- cf.getSelect(select);
1115
- gvc.closeDialog();
1092
+ vm.tag = '';
1093
+ vm.type = 'folderADD';
1094
+ gvc.notifyDataChange(vm.id);
1116
1095
  }
1117
- }),
1118
- finishBTN
1119
- ),
1120
- ].join('');
1121
- }
1122
- }
1096
+ })}"
1097
+ >
1098
+ ${vm.type == 'file' ? `上傳圖片` : `建立相簿`}
1099
+ </div>
1100
+ </div>
1101
+ `;
1102
+ }
1103
+ return html`
1104
+ <div
1105
+ class="w-100 ${cf.key == 'album'
1106
+ ? `d-none`
1107
+ : `d-flex`} align-items-center justify-content-center"
1108
+ style="padding: 39px 0;border-radius: 10px;border: 1px solid #DDD;background: #FFF;"
1109
+ >
1110
+ <div
1111
+ style="padding:6px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);font-size: 16px;font-weight: 400;cursor:pointer;"
1112
+ onclick="${gvc.event(() => {
1113
+ if (vm.type == 'file') {
1114
+ cf.plus(
1115
+ gvc,
1116
+ file => {
1117
+ vm.link.push(...file);
1118
+ save(() => {
1119
+ gvc.notifyDataChange(vm.id);
1120
+ });
1121
+ },
1122
+ 'file'
1123
+ );
1124
+ } else {
1125
+ vm.tag = '';
1126
+ vm.type = 'folderADD';
1127
+ gvc.notifyDataChange(vm.id);
1128
+ }
1129
+ })}"
1130
+ >
1131
+ ${vm.type == 'file' ? '上傳新照片' : '新增相簿'}
1132
+ </div>
1133
+ </div>
1134
+ ${renderItems(viewData)}
1135
+ `;
1136
+ })()}
1137
+ </div>
1138
+ </div>
1139
+ </div>
1140
+ `;
1141
+ }
1142
+
1143
+ if (vm.loading) {
1144
+ dialog.dataLoading({
1145
+ visible: true,
1146
+ });
1147
+ return ``;
1148
+ }
1149
+ dialog.dataLoading({
1150
+ visible: false,
1151
+ });
1152
+ return drawSelectImg();
1123
1153
  },
1124
- closeCallback: () => {
1125
- if (cf.cancelEvent) {
1126
- cf.cancelEvent();
1127
- }
1154
+ divCreate: {
1155
+ class: `w-100 h-100`,
1156
+ style: ``,
1128
1157
  },
1158
+ };
1129
1159
  });
1130
- }
1160
+ },
1161
+ footer_html: (gvc: GVC) => {
1162
+ type BtnDef = {
1163
+ type: 'cancel' | 'save' | 'danger' | 'edit';
1164
+ label: string;
1165
+ onClick: () => void;
1166
+ };
1167
+ const dialog = new ShareDialog(cf.gvc.glitter);
1131
1168
 
1132
- public static selectImageFromArray(imageArray: string[], cf: {
1133
- gvc: GVC,
1134
- title: string,
1135
- getSelect: (id: string) => void,
1136
- cancelEvent?: () => void;
1137
- }) {
1138
- const gvc = cf.gvc;
1139
- gvc.addStyle(`
1140
- .imageHover {
1141
- border: 2px solid #393939;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);
1169
+ function clearNoNeedData(items: FileItem[]) {
1170
+ items.map(dd => {
1171
+ if ((dd as any).selected) {
1172
+ (dd as any).selected = undefined;
1142
1173
  }
1143
- `)
1144
- let selected: any = undefined
1145
- BgWidget.imageLibraryDialog({
1146
- gvc: gvc,
1147
- title: cf.title,
1148
- innerHTML: (gvc: GVC) => {
1149
- let editArray:boolean[] = []
1150
- imageArray.forEach((item) => {
1151
- editArray.push(false)
1152
- })
1153
- return html`
1154
- <div class="w-100 d-flex flex-column">
1155
- <div style="font-size: 13px;">您只能選擇圖片當作子類媒體</div>
1156
- <div class="d-flex flex-wrap w-100" style="gap: 0.5rem;margin-top:1rem;">
1157
- ${gvc.bindView({
1158
- bind: "imageArray",
1159
- view: () => {
1160
- const isSafari = (() => {
1161
- const userAgent = navigator.userAgent.toLowerCase();
1162
- return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('edg');
1163
- })();
1164
- return [html`<div class="col-2 d-flex align-items-center justify-content-center " style="border-radius:10px;cursor: pointer;border:1px solid #DDD;" onclick="${gvc.event(()=>{
1165
- EditorElem.uploadFileFunction({
1166
- gvc: gvc,
1167
- callback: (text: any) => {
1168
- let allData: any ={}
1169
- const updateData = {
1170
- title: text[0].split('_')[3],
1171
- data: text[0],
1172
- items: [],
1173
- type: 'file',
1174
- tag: [],
1175
- id: gvc.glitter.getUUID(),
1176
- }
1177
- const dialog = new ShareDialog(gvc.glitter)
1178
- dialog.dataLoading({
1179
- visible:true
1180
- })
1181
- function getPublicConfig(callback: () => void) {
1182
- ApiUser.getPublicConfig('image-manager', 'manager').then((data: any) => {
1183
- if (data.response.value) {
1184
- allData = data.response.value;
1185
- function loop(array: FileItem[]) {
1186
- if (array.length > 0) {
1187
- array.map((dd) => {
1188
- if (dd.type === 'folder') {
1189
- loop(dd.items ?? []);
1190
- }
1191
- });
1192
- }
1193
- }
1194
-
1195
- loop(data);
1196
- callback();
1197
- } else {
1198
- callback();
1199
- }
1200
- });
1201
- }
1202
- getPublicConfig(()=>{
1203
- allData.push(updateData);
1204
- ApiUser.setPublicConfig({
1205
- key: 'image-manager',
1206
- value: allData,
1207
- user_id: 'manager',
1208
- }).then((data) => {
1209
- imageArray.push(text[0]);
1210
- dialog.dataLoading({
1211
- visible:false
1212
- })
1213
- gvc.notifyDataChange('imageArray');
1214
- });
1215
- })
1216
- },
1217
- return_array: true,
1218
- multiple: true,
1219
- });
1220
- })}">
1221
- <div style="padding:6px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);font-size: 16px;font-weight: 400;cursor:pointer;">新增圖片</div>
1222
- </div>`,
1223
- imageArray.map((image: string, index) => {
1224
- return html`
1225
- <div class="col-2 position-relative imageHover" style="padding: 10px 12px;position: relative;${selected==index
1226
- ? `border-radius: 10px;border: 2px solid #393939;background: #F7F7F7;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);`
1227
- : editArray[index]
1228
- ? `border-radius: 10px;border: 1px solid #DDD;background: #F7F7F7;`
1229
- : ``}" onclick="${gvc.event(() => {
1230
- selected = index;
1231
- gvc.notifyDataChange("imageArray");
1232
- })}"
1233
- onmouseenter="${gvc.event(() => {
1234
- if (!editArray[index]) {
1235
- editArray[index] = true;
1236
- gvc.notifyDataChange('imageArray');
1237
- }
1238
- })}"
1239
- onmouseleave="${gvc.event((e, event) => {
1240
- if (isSafari) {
1241
- const imageBoxClass = Tool.randomString(5);
1242
- const target = event.relatedTarget as HTMLElement;
1243
- const imageBoxClassList = [imageBoxClass];
1244
- const targetClassList = Array.from(target.classList);
1245
- const isOutBorder =
1246
- imageBoxClassList.every((cls) => targetClassList.includes(cls)) &&
1247
- targetClassList.every((cls) => imageBoxClassList.includes(cls));
1248
- const isTitle = targetClassList.includes(`${imageBoxClass}-title`);
1249
- const isInside = targetClassList.length === 0;
1250
- const isOutOfViewContainer = target.dataset.viewContainer === 'true';
1251
- const isUL = target.tagName === 'UL';
1252
-
1253
- if ((isOutBorder || isTitle || isInside) && !(isOutOfViewContainer || isUL)) {
1254
- return;
1255
- }
1256
- }
1257
- editArray[index] = false;
1258
- gvc.notifyDataChange('imageArray');
1259
- })}"
1260
- >
1261
- <div class="w-100"
1262
- style="background: url('${image}') 50%/cover;padding-bottom:100%;border-radius: 10px;"></div>
1263
- </div>
1264
- `
1265
- }).join(``)
1266
- ].join(``)
1267
-
1268
- }, divCreate: {class: `d-flex flex-wrap w-100`, style: `gap: 0.5rem;margin-top:1rem;`}
1269
- })}
1270
- </div>
1271
- </div>
1272
- `
1273
- },
1274
- footer_html: (gvc: GVC) => {
1275
- const dialog = new ShareDialog(cf.gvc.glitter);
1174
+ clearNoNeedData(dd.items || []);
1175
+ });
1176
+ }
1276
1177
 
1277
- return BgWidget.save(gvc.event(() => {
1278
- gvc.closeDialog()
1279
- cf.getSelect(imageArray[selected])
1178
+ function save(finish: () => void, text?: string) {
1179
+ clearNoNeedData(vm.link);
1180
+ dialog.dataLoading({ visible: true });
1181
+ ApiUser.setPublicConfig({
1182
+ key: 'image-manager',
1183
+ value: vm.link,
1184
+ user_id: 'manager',
1185
+ }).then(data => {
1186
+ dialog.dataLoading({ visible: false });
1187
+ dialog.successMessage({ text: text ?? '儲存成功' });
1188
+ changeWindowsName('圖片庫');
1189
+ finish();
1190
+ });
1191
+ }
1192
+
1193
+ function getFolderEditButtons(gvc: GVC, save: Function): BtnDef[] {
1194
+ return [
1195
+ {
1196
+ type: 'cancel',
1197
+ label: '返回',
1198
+ onClick: () => {
1199
+ if (cf.cancelEvent) {
1200
+ changeWindowsName('圖片庫');
1201
+ cf.cancelEvent();
1202
+ }
1203
+ gvc.closeDialog();
1204
+ },
1205
+ },
1206
+ {
1207
+ type: 'danger',
1208
+ label: '刪除相簿',
1209
+ onClick: () => {
1210
+ new ShareDialog(gvc.glitter).checkYesOrNot({
1211
+ text: `您確定要永久刪除此資料夾嗎?刪除後將取消這些照片間的關聯。`,
1212
+ callback: yes => {
1213
+ if (!yes) return;
1214
+ // 取消選取、移除 tag
1215
+ vm.link.forEach(item => {
1216
+ if (item.tag?.includes(vm.tag!)) {
1217
+ item.selected = false;
1218
+ item.tag = item.tag!.filter(t => t !== vm.tag);
1219
+ }
1220
+ });
1221
+ // 刪掉資料夾
1222
+ const idx = vm.link.findIndex(d => d.title === vm.tag && d.type === 'folder');
1223
+ vm.link.splice(idx, 1);
1224
+ cf.getSelect(vm.link);
1225
+ save(() => {
1226
+ changeWindowsName('圖片庫');
1227
+ gvc.closeDialog();
1228
+ }, '刪除成功');
1229
+ },
1230
+ });
1231
+ },
1232
+ },
1233
+ {
1234
+ type: 'save',
1235
+ label: '確定變更',
1236
+ onClick: () => {
1237
+ cf.getSelect(vm.link);
1238
+ save(() => gvc.closeDialog());
1239
+ },
1240
+ },
1241
+ ];
1242
+ }
1280
1243
 
1281
- }))
1244
+ function getDefaultButtons(gvc: GVC, save: Function, dialog: ShareDialog): BtnDef[] {
1245
+ const finishLabel = cf.key === 'album' ? '建立' : '完成';
1246
+ const cancelLabel = cf.key === 'album' ? '返回' : '取消';
1282
1247
 
1248
+ return [
1249
+ {
1250
+ type: 'cancel',
1251
+ label: cancelLabel,
1252
+ onClick: () => {
1253
+ if (cf.cancelEvent) cf.cancelEvent();
1254
+ if (vm.type === 'folderView' || vm.type === 'folderADD') {
1255
+ closeFolderView();
1256
+ vm.type = 'folder';
1257
+ gvc.notifyDataChange(vm.id);
1258
+ } else {
1259
+ gvc.closeDialog();
1260
+ }
1261
+ },
1283
1262
  },
1284
- closeCallback: () => {
1285
- if (cf.cancelEvent) {
1286
- cf.cancelEvent();
1263
+ {
1264
+ type: 'edit',
1265
+ label: '編輯',
1266
+ onClick: () => {
1267
+ vm.type = 'folderViewToEdit';
1268
+ gvc.notifyDataChange(vm.id);
1269
+ },
1270
+ },
1271
+ {
1272
+ type: 'save',
1273
+ label: finishLabel,
1274
+ onClick: () => {
1275
+ // 遞迴撈出所有選好的圖片
1276
+ const selected: FileItem[] = [];
1277
+ (function walk(arr: FileItem[]) {
1278
+ arr.forEach(d => {
1279
+ if (d.type === 'folder') walk(d.items || []);
1280
+ else if ((d as any).selected) selected.push(d);
1281
+ });
1282
+ })(vm.link);
1283
+ if (vm.type === 'folderADD') {
1284
+ if (!vm.tag) {
1285
+ dialog.infoMessage({ text: '相簿尚未命名' });
1286
+ return;
1287
+ }
1288
+ vm.newFolder.title = vm.tag;
1289
+ vm.newFolder.data.forEach((data: FileItem) => {
1290
+ const findImage = vm.link.find(image => image.id === data.id);
1291
+ if (findImage) {
1292
+ findImage.tag.push(vm.tag ?? '');
1293
+ }
1294
+ });
1295
+ vm.newFolder.data = [];
1296
+ vm.link.push(vm.newFolder);
1297
+ save(() => {
1298
+ vm.type = 'folder';
1299
+ gvc.notifyDataChange(vm.id);
1300
+ });
1301
+ return;
1302
+ }
1303
+ if (cf.key === 'album') {
1304
+ dialog.successMessage({ text: '相簿建立成功' });
1305
+ cf.getSelect(selected);
1306
+ gvc.closeDialog();
1307
+ return;
1287
1308
  }
1309
+
1310
+ if (['image-manager', 'folderEdit'].includes(cf.key)) {
1311
+ if (selected.length || cf.edit_only) {
1312
+ save(() => {
1313
+ cf.getSelect(selected);
1314
+ gvc.closeDialog();
1315
+ });
1316
+ } else {
1317
+ dialog.errorMessage({ text: '請選擇至少一張圖片' });
1318
+ }
1319
+ } else {
1320
+ cf.getSelect(selected);
1321
+ gvc.closeDialog();
1322
+ }
1323
+ },
1288
1324
  },
1289
- });
1325
+ ];
1326
+ }
1327
+
1328
+ const defs = vm.type === 'folderEdit' ? getFolderEditButtons(gvc, save) : getDefaultButtons(gvc, save, dialog);
1329
+ return gvc.bindView({
1330
+ bind:vm.footer_id,
1331
+ view:()=>{
1332
+ return defs
1333
+ .map(d => {
1334
+ const widget =
1335
+ ( d.type === 'cancel' || d.type === 'edit') ? BgWidget.cancel : d.type === 'danger' ? BgWidget.danger : BgWidget.save;
1336
+ if (d.type == 'edit') {
1337
+ if (vm.type == 'folderView') {
1338
+ return widget(gvc.event(d.onClick), d.label);
1339
+ }
1340
+ return '';
1341
+ } else {
1342
+ return widget(gvc.event(d.onClick), d.label);
1343
+ }
1344
+ })
1345
+ .join('');
1346
+ },divCreate:{
1347
+ class:'w-100 d-flex align-items-center justify-content-end',
1348
+ style:'gap:14px'
1349
+ }
1350
+ })
1351
+
1352
+ },
1353
+ closeCallback: () => {
1354
+ if (cf.cancelEvent) {
1355
+ cf.cancelEvent();
1356
+ }
1357
+ },
1358
+ });
1359
+ }
1360
+
1361
+ public static selectImageFromArray(
1362
+ imageArray: string[],
1363
+ cf: {
1364
+ gvc: GVC;
1365
+ title: string;
1366
+ getSelect: (id: string) => void;
1367
+ cancelEvent?: () => void;
1290
1368
  }
1369
+ ) {
1370
+ const gvc = cf.gvc;
1371
+ gvc.addStyle(`
1372
+ .imageHover {
1373
+ border: 2px solid #393939;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);
1374
+ }
1375
+ `);
1376
+ let selected: any = undefined;
1377
+ BgWidget.imageLibraryDialog({
1378
+ gvc: gvc,
1379
+ title: cf.title,
1380
+ innerHTML: (gvc: GVC) => {
1381
+ let editArray: boolean[] = [];
1382
+ imageArray.forEach(item => {
1383
+ editArray.push(false);
1384
+ });
1385
+ return html`
1386
+ <div class="w-100 d-flex flex-column">
1387
+ <div style="font-size: 13px;">您只能選擇圖片當作子類媒體</div>
1388
+ <div class="d-flex flex-wrap w-100" style="gap: 0.5rem;margin-top:1rem;">
1389
+ ${gvc.bindView({
1390
+ bind: 'imageArray',
1391
+ view: () => {
1392
+ const isSafari = (() => {
1393
+ const userAgent = navigator.userAgent.toLowerCase();
1394
+ return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('edg');
1395
+ })();
1396
+ return [
1397
+ html` <div
1398
+ class="col-2 d-flex align-items-center justify-content-center "
1399
+ style="border-radius:10px;cursor: pointer;border:1px solid #DDD;"
1400
+ onclick="${gvc.event(() => {
1401
+ EditorElem.uploadFileFunction({
1402
+ gvc: gvc,
1403
+ callback: (text: any) => {
1404
+ let allData: any = {};
1405
+ const updateData = {
1406
+ title: text[0].split('_')[3],
1407
+ data: text[0],
1408
+ items: [],
1409
+ type: 'file',
1410
+ tag: [],
1411
+ id: gvc.glitter.getUUID(),
1412
+ };
1413
+ const dialog = new ShareDialog(gvc.glitter);
1414
+ dialog.dataLoading({
1415
+ visible: true,
1416
+ });
1291
1417
 
1292
- public static async selectImageLibrary(
1293
- gvc: GVC,
1294
- callback: (id: FileItem[]) => void,
1295
- title: string,
1296
- opt?: {
1297
- key?: string;
1298
- mul?: boolean;
1299
- tag?: string;
1300
- cancelEvent?: () => void;
1301
- },
1302
- edit_only?:boolean
1303
- ) {
1304
- let alt: any = '';
1305
- let saveAlt = function () {
1306
- };
1418
+ function getPublicConfig(callback: () => void) {
1419
+ ApiUser.getPublicConfig('image-manager', 'manager').then((data: any) => {
1420
+ if (data.response.value) {
1421
+ allData = data.response.value;
1307
1422
 
1308
- function editorView(gvc: GVC, item: FileItem) {
1309
- if (item.type === 'folder') {
1310
- return BgWidget.editeInput({
1311
- gvc: gvc,
1312
- title: `資料夾標題`,
1313
- default: item.title,
1314
- placeHolder: `請輸入資料夾標題`,
1315
- callback: (text) => {
1316
- item.title = text;
1317
- },
1318
- });
1319
- } else {
1320
- item.data = item.data ?? {};
1321
- return `<div>${[
1322
- BgWidget.editeInput({
1323
- gvc: gvc,
1324
- title: `圖片標題`,
1325
- default: item.title,
1326
- placeHolder: `請輸入圖片標題`,
1327
- callback: (text) => {
1328
- item.title = text;
1329
- },
1330
- }),
1331
- EditorElem.uploadImageContainer({
1332
- gvc: gvc,
1333
- title: `圖片資源`,
1334
- def: item.data ?? '',
1335
- callback: (text) => {
1336
- item.data = text;
1337
- },
1338
- }),
1339
- gvc.bindView(() => {
1340
- const id = gvc.glitter.getUUID();
1341
- return {
1342
- bind: id,
1343
- view: async () => {
1344
- const tag = gvc.glitter.generateCheckSum(item.data, 9);
1345
- alt = (await ApiUser.getPublicConfig(`alt_` + tag, 'manager')).response.value || {alt: ''};
1346
- saveAlt = async () => {
1347
- ApiUser.setPublicConfig({
1348
- key: `alt_` + tag,
1349
- value: alt,
1350
- user_id: 'manager',
1351
- });
1352
- };
1353
- return BgWidget.textArea({
1354
- gvc: gvc,
1355
- title: `ALT描述`,
1356
- default: alt.alt,
1357
- placeHolder: `請輸入ALT描述`,
1358
- callback: (text) => {
1359
- alt.alt = text;
1360
- },
1423
+ function loop(array: FileItem[]) {
1424
+ if (array.length > 0) {
1425
+ array.map(dd => {
1426
+ if (dd.type === 'folder') {
1427
+ loop(dd.items ?? []);
1428
+ }
1429
+ });
1430
+ }
1431
+ }
1432
+
1433
+ loop(data);
1434
+ callback();
1435
+ } else {
1436
+ callback();
1437
+ }
1438
+ });
1439
+ }
1440
+
1441
+ getPublicConfig(() => {
1442
+ allData.push(updateData);
1443
+ ApiUser.setPublicConfig({
1444
+ key: 'image-manager',
1445
+ value: allData,
1446
+ user_id: 'manager',
1447
+ }).then(data => {
1448
+ imageArray.push(text[0]);
1449
+ dialog.dataLoading({
1450
+ visible: false,
1361
1451
  });
1362
- },
1363
- };
1364
- }),
1365
- ].join('<div class="my-2"></div>')}</div>`;
1366
- }
1452
+ gvc.notifyDataChange('imageArray');
1453
+ });
1454
+ });
1455
+ },
1456
+ return_array: true,
1457
+ multiple: true,
1458
+ });
1459
+ })}"
1460
+ >
1461
+ <div
1462
+ style="padding:6px 18px;border-radius: 10px;border: 1px solid #DDD;background: #FFF;box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.10);font-size: 16px;font-weight: 400;cursor:pointer;"
1463
+ >
1464
+ 新增圖片
1465
+ </div>
1466
+ </div>`,
1467
+ imageArray
1468
+ .map((image: string, index) => {
1469
+ return html`
1470
+ <div
1471
+ class="col-2 position-relative imageHover"
1472
+ style="padding: 10px 12px;position: relative;${selected == index
1473
+ ? `border-radius: 10px;border: 2px solid #393939;background: #F7F7F7;box-shadow: 3px 3px 10px 0px rgba(0, 0, 0, 0.10);`
1474
+ : editArray[index]
1475
+ ? `border-radius: 10px;border: 1px solid #DDD;background: #F7F7F7;`
1476
+ : ``}"
1477
+ onclick="${gvc.event(() => {
1478
+ selected = index;
1479
+ gvc.notifyDataChange('imageArray');
1480
+ })}"
1481
+ onmouseenter="${gvc.event(() => {
1482
+ if (!editArray[index]) {
1483
+ editArray[index] = true;
1484
+ gvc.notifyDataChange('imageArray');
1485
+ }
1486
+ })}"
1487
+ onmouseleave="${gvc.event((e, event) => {
1488
+ if (isSafari) {
1489
+ const imageBoxClass = Tool.randomString(5);
1490
+ const target = event.relatedTarget as HTMLElement;
1491
+ const imageBoxClassList = [imageBoxClass];
1492
+ const targetClassList = Array.from(target.classList);
1493
+ const isOutBorder =
1494
+ imageBoxClassList.every(cls => targetClassList.includes(cls)) &&
1495
+ targetClassList.every(cls => imageBoxClassList.includes(cls));
1496
+ const isTitle = targetClassList.includes(`${imageBoxClass}-title`);
1497
+ const isInside = targetClassList.length === 0;
1498
+ const isOutOfViewContainer = target.dataset.viewContainer === 'true';
1499
+ const isUL = target.tagName === 'UL';
1500
+
1501
+ if ((isOutBorder || isTitle || isInside) && !(isOutOfViewContainer || isUL)) {
1502
+ return;
1503
+ }
1504
+ }
1505
+ editArray[index] = false;
1506
+ gvc.notifyDataChange('imageArray');
1507
+ })}"
1508
+ >
1509
+ <div
1510
+ class="w-100"
1511
+ style="background: url('${image}') 50%/cover;padding-bottom:100%;border-radius: 10px;"
1512
+ ></div>
1513
+ </div>
1514
+ `;
1515
+ })
1516
+ .join(``),
1517
+ ].join(``);
1518
+ },
1519
+ divCreate: { class: `d-flex flex-wrap w-100`, style: `gap: 0.5rem;margin-top:1rem;` },
1520
+ })}
1521
+ </div>
1522
+ </div>
1523
+ `;
1524
+ },
1525
+ footer_html: (gvc: GVC) => {
1526
+ const dialog = new ShareDialog(cf.gvc.glitter);
1527
+
1528
+ return BgWidget.save(
1529
+ gvc.event(() => {
1530
+ gvc.closeDialog();
1531
+ cf.getSelect(imageArray[selected]);
1532
+ })
1533
+ );
1534
+ },
1535
+ closeCallback: () => {
1536
+ if (cf.cancelEvent) {
1537
+ cf.cancelEvent();
1367
1538
  }
1539
+ },
1540
+ });
1541
+ }
1368
1542
 
1369
- imageLibrary.fileSystem({
1370
- getSelect: callback,
1371
- edit_only:edit_only,
1543
+ public static async selectImageLibrary(
1544
+ gvc: GVC,
1545
+ callback: (id: FileItem[]) => void,
1546
+ title: string,
1547
+ opt?: {
1548
+ key?: string;
1549
+ mul?: boolean;
1550
+ tag?: string;
1551
+ cancelEvent?: () => void;
1552
+ deleteEvent?: () => void;
1553
+ },
1554
+ edit_only?: boolean
1555
+ ) {
1556
+ let alt: any = '';
1557
+ let saveAlt = function () {};
1558
+
1559
+ function editorView(gvc: GVC, item: FileItem) {
1560
+ if (item.type === 'folder') {
1561
+ return BgWidget.editeInput({
1562
+ gvc: gvc,
1563
+ title: `資料夾標題`,
1564
+ default: item.title,
1565
+ placeHolder: `請輸入資料夾標題`,
1566
+ callback: text => {
1567
+ item.title = text;
1568
+ },
1569
+ });
1570
+ } else {
1571
+ item.data = item.data ?? {};
1572
+ return `<div>${[
1573
+ BgWidget.editeInput({
1372
1574
  gvc: gvc,
1373
- key: opt ? opt.key ?? 'image-manager' : 'image-manager',
1374
- title: title,
1375
- tag: opt?.tag ?? '',
1376
- mul: opt ? opt.mul ?? false : false,
1377
- plus: (gvc: GVC, callback: (file: FileItem[]) => void) => {
1378
- const item: FileItem = {
1379
- title: '',
1380
- data: {},
1381
- items: [],
1382
- type: 'file',
1383
- tag: [],
1384
- id: gvc.glitter.getUUID(),
1385
- };
1386
- let count = 1;
1387
- // function upload(file: any) {
1388
- // const dialog = new ShareDialog(gvc.glitter);
1389
- // dialog.dataLoading({ visible: true });
1390
- // const saasConfig=(window.parent as any).saasConfig;
1391
- // saasConfig.api.uploadFileAll(file).then((res: { result: boolean; links: string[] }) => {
1392
- // dialog.dataLoading({ visible: false });
1393
- // if (res.result) {
1394
- // res.links.map((dd) => {
1395
- // obj.callback(dd);
1396
- // });
1397
- // } else {
1398
- // dialog.errorMessage({ text: '上傳失敗' });
1399
- // }
1400
- // });
1401
- // }
1402
- // gvc.glitter.ut.chooseMediaCallback({
1403
- // single: true,
1404
- // accept: obj.type ?? '*',
1405
- // callback(data: any) {
1406
- // upload(
1407
- // data.map((dd: any) => {
1408
- // return dd.file;
1409
- // })
1410
- // );
1411
- // },
1412
- // });
1413
- EditorElem.uploadFileFunction({
1414
- gvc: gvc,
1415
- callback: (text: any) => {
1416
- callback(
1417
- text.map((item: string) => {
1418
- return {
1419
- title: item.split('_')[3],
1420
- data: item,
1421
- items: [],
1422
- type: 'file',
1423
- tag: [],
1424
- id: gvc.glitter.getUUID(),
1425
- };
1426
- })
1427
- );
1428
- },
1429
- return_array: true,
1430
- multiple: true,
1431
- });
1432
- },
1433
- edit: (item, callback: (file?: FileItem) => void) => {
1434
- item = JSON.parse(JSON.stringify(item));
1435
- BgWidget.settingDialog({
1436
- gvc: gvc,
1437
- title: '更新圖片',
1438
- innerHTML: (gvc: GVC) => {
1439
- return editorView(gvc, item);
1440
- },
1441
- footer_html: (gvc: GVC) => {
1442
- return [
1443
- BgWidget.danger(
1444
- gvc.event(() => {
1445
- const dialog = new ShareDialog(gvc.glitter);
1446
- dialog.checkYesOrNot({
1447
- text: `刪除後使用此資源的內容將被取消關聯,是否確認刪除?`,
1448
- callback: (response) => {
1449
- if (response) {
1450
- callback(undefined);
1451
- gvc.closeDialog();
1452
- }
1453
- },
1454
- });
1455
- })
1456
- ),
1457
- BgWidget.cancel(
1458
- gvc.event(() => {
1459
- gvc.closeDialog();
1460
- })
1461
- ),
1462
- BgWidget.save(
1463
- gvc.event(() => {
1464
- callback(item);
1465
- saveAlt();
1466
- gvc.closeDialog();
1467
- }),
1468
- '確定'
1469
- ),
1470
- ].join('');
1471
- },
1472
- closeCallback: () => {
1473
- },
1474
- });
1575
+ title: `圖片標題`,
1576
+ default: item.title,
1577
+ placeHolder: `請輸入圖片標題`,
1578
+ callback: text => {
1579
+ item.title = text;
1475
1580
  },
1476
- cancelEvent: () => {
1477
- if (opt?.cancelEvent) {
1478
- opt.cancelEvent();
1479
- }
1581
+ }),
1582
+ EditorElem.uploadImageContainer({
1583
+ gvc: gvc,
1584
+ title: `圖片資源`,
1585
+ def: item.data ?? '',
1586
+ callback: text => {
1587
+ item.data = text;
1480
1588
  },
1481
- });
1589
+ }),
1590
+ gvc.bindView(() => {
1591
+ const id = gvc.glitter.getUUID();
1592
+ return {
1593
+ bind: id,
1594
+ view: async () => {
1595
+ const tag = gvc.glitter.generateCheckSum(item.data, 9);
1596
+ alt = (await ApiUser.getPublicConfig(`alt_` + tag, 'manager')).response.value || { alt: '' };
1597
+ saveAlt = async () => {
1598
+ ApiUser.setPublicConfig({
1599
+ key: `alt_` + tag,
1600
+ value: alt,
1601
+ user_id: 'manager',
1602
+ });
1603
+ };
1604
+ return BgWidget.textArea({
1605
+ gvc: gvc,
1606
+ title: `ALT描述`,
1607
+ default: alt.alt,
1608
+ placeHolder: `請輸入ALT描述`,
1609
+ callback: text => {
1610
+ alt.alt = text;
1611
+ },
1612
+ });
1613
+ },
1614
+ };
1615
+ }),
1616
+ ].join('<div class="my-2"></div>')}</div>`;
1617
+ }
1482
1618
  }
1619
+
1620
+ imageLibrary.fileSystem({
1621
+ getSelect: callback,
1622
+ edit_only: edit_only,
1623
+ gvc: gvc,
1624
+ key: opt ? (opt.key ?? 'image-manager') : 'image-manager',
1625
+ title: title,
1626
+ tag: opt?.tag ?? '',
1627
+ mul: opt ? (opt.mul ?? false) : false,
1628
+ plus: (gvc: GVC, callback: (file: FileItem[]) => void) => {
1629
+ const item: FileItem = {
1630
+ selected: false,
1631
+ title: '',
1632
+ data: {},
1633
+ items: [],
1634
+ type: 'file',
1635
+ tag: [],
1636
+ id: gvc.glitter.getUUID(),
1637
+ };
1638
+ let count = 1;
1639
+ EditorElem.uploadFileFunction({
1640
+ gvc: gvc,
1641
+ callback: (text: any) => {
1642
+ callback(
1643
+ text.map((item: string) => {
1644
+ return {
1645
+ title: item.split('_')[item.split('_').length - 1],
1646
+ data: item,
1647
+ items: [],
1648
+ type: 'file',
1649
+ tag: [],
1650
+ id: gvc.glitter.getUUID(),
1651
+ };
1652
+ })
1653
+ );
1654
+ },
1655
+ return_array: true,
1656
+ multiple: true,
1657
+ });
1658
+ },
1659
+ edit: (
1660
+ item,
1661
+ callback: (file?: FileItem) => void,
1662
+ obj?: {
1663
+ deleteStyle?: number | 0;
1664
+ tag?: string;
1665
+ }
1666
+ ) => {
1667
+ item = JSON.parse(JSON.stringify(item));
1668
+ BgWidget.settingDialog({
1669
+ gvc: gvc,
1670
+ title: '更新圖片',
1671
+ innerHTML: (gvc: GVC) => {
1672
+ return editorView(gvc, item);
1673
+ },
1674
+ footer_html: (gvc: GVC) => {
1675
+ return [
1676
+ BgWidget.danger(
1677
+ gvc.event(() => {
1678
+ const dialog = new ShareDialog(gvc.glitter);
1679
+
1680
+ function deleteImage() {
1681
+ dialog.checkYesOrNotWithCustomWidth({
1682
+ width: '432',
1683
+ text: '刪除此圖片後,所有使用它的頁面與商品將無法顯示。<br>是否確定?',
1684
+ icon: '<i class="fa-solid fa-info"></i>',
1685
+ callback: response => {
1686
+ if (response) {
1687
+ callback(undefined);
1688
+ gvc.closeDialog();
1689
+ }
1690
+ },
1691
+ });
1692
+ }
1693
+
1694
+ function deleteAlbumTag() {
1695
+ item.tag = item.tag.filter(t => t !== obj?.tag);
1696
+ callback(item);
1697
+ gvc.closeDialog();
1698
+ }
1699
+
1700
+ switch (obj?.deleteStyle) {
1701
+ case 1: {
1702
+ gvc.glitter.innerDialog(() => {
1703
+ const prefixClass = 'deleteWindows';
1704
+
1705
+ function closeThisDialog() {
1706
+ gvc.glitter.closeDiaLog('deleteWindows');
1707
+ }
1708
+
1709
+ function gClass(className: string) {
1710
+ return prefixClass + '-' + className;
1711
+ }
1712
+
1713
+ gvc.addStyle(css`
1714
+ .${prefixClass}-window {
1715
+ width: 452px;
1716
+ height: 281px;
1717
+ border-radius: 10px;
1718
+ background: #fff;
1719
+ position: relative;
1720
+ display: inline-flex;
1721
+ flex-direction: column;
1722
+ align-items: center;
1723
+ gap: 24px;
1724
+ padding: 36px 46px;
1725
+ }
1726
+
1727
+ .${prefixClass}-window .fa-xmark-large {
1728
+ position: absolute;
1729
+ top: 17px;
1730
+ right: 20px;
1731
+ cursor: pointer;
1732
+ }
1733
+
1734
+ .${prefixClass}-text-block {
1735
+ display: flex;
1736
+ flex-direction: column;
1737
+ align-items: center;
1738
+ gap: 8px;
1739
+ text-align: center;
1740
+ font-size: 16px;
1741
+ font-weight: 400;
1742
+ line-height: 160%; /* 25.6px */
1743
+ }
1744
+
1745
+ .${prefixClass}-text-block .button {
1746
+ display: flex;
1747
+ padding: 6px 18px;
1748
+ justify-content: center;
1749
+ align-items: center;
1750
+ gap: 8px;
1751
+ border-radius: 10px;
1752
+ border: 1px solid #ddd;
1753
+ background: #fff;
1754
+ color: #393939;
1755
+ cursor: pointer;
1756
+ }
1757
+ `);
1758
+ return html`
1759
+ <div class="${gClass('window')}">
1760
+ <i
1761
+ class="fa-regular fa-xmark-large"
1762
+ onclick="${gvc.event(() => {
1763
+ closeThisDialog();
1764
+ })}"
1765
+ ></i>
1766
+ <i class="fa-regular fa-circle-exclamation mb-1" style="font-size: 4rem;"></i>
1767
+ <div class="${gClass('text-block')}">
1768
+ <div>請選擇刪除方式:</div>
1769
+ <div
1770
+ class="button"
1771
+ onclick="${gvc.event(() => {
1772
+ deleteAlbumTag();
1773
+ closeThisDialog();
1774
+ })}"
1775
+ >
1776
+ 僅從此相簿移除
1777
+ </div>
1778
+ <div
1779
+ class="button"
1780
+ onclick="${gvc.event(() => {
1781
+ deleteImage();
1782
+ closeThisDialog();
1783
+ })}"
1784
+ >
1785
+ 從圖庫中永久刪除
1786
+ </div>
1787
+ </div>
1788
+ </div>
1789
+ `;
1790
+ }, `deleteWindows`);
1791
+ break;
1792
+ }
1793
+ default: {
1794
+ deleteImage();
1795
+ break;
1796
+ }
1797
+ }
1798
+ })
1799
+ ),
1800
+ BgWidget.cancel(
1801
+ gvc.event(() => {
1802
+ gvc.closeDialog();
1803
+ })
1804
+ ),
1805
+ BgWidget.save(
1806
+ gvc.event(() => {
1807
+ callback(item);
1808
+ saveAlt();
1809
+ gvc.closeDialog();
1810
+ }),
1811
+ '確定'
1812
+ ),
1813
+ ].join('');
1814
+ },
1815
+ closeCallback: () => {},
1816
+ });
1817
+ },
1818
+ cancelEvent: () => {
1819
+ if (opt?.cancelEvent) {
1820
+ opt.cancelEvent();
1821
+ }
1822
+ },
1823
+ });
1824
+ }
1483
1825
  }