@dolphinweex/weex-harmony 0.1.80 → 0.1.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dolphinweex/weex-harmony",
3
- "version": "0.1.80",
3
+ "version": "0.1.81",
4
4
  "description": "weex harmony adapter",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div>
2
+ <div @viewappear="allHarmonyViewAppear">
3
3
  <div class="progress-container" v-if="progressText">
4
4
  <img class="progress-loading" src="data:image/gif;base64,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" alt="loading" />
5
5
  <text class="progress-text">{{progressText}}</text>
@@ -168,7 +168,14 @@ export default {
168
168
  window.addEventListener("message", this._onMessage, false);
169
169
  },
170
170
  methods: {
171
- onPageFinish() {
171
+ allHarmonyViewAppear() {
172
+ const iframe = this.$refs.iframe;
173
+ if (iframe && iframe.contentWindow && typeof iframe.contentWindow.harmonyViewAppear === 'function') {
174
+ iframe.contentWindow.harmonyViewAppear();
175
+ }
176
+ }
177
+ },
178
+ onPageFinish() {
172
179
  if (this.$refs["iframe"]) {
173
180
  this.$refs["iframe"].contentWindow.$midea_harmony_native =
174
181
  window.$midea_harmony_native;
@@ -22,11 +22,13 @@
22
22
  v-for="(item, index) in data.list"
23
23
  :key="item.id"
24
24
  class="grid-item"
25
- :class="{
26
- 'being-dragged': draggingIndex === index,
27
- hidden: isDragClone && draggingIndex === index,
28
- disabled: item.disabled === true
29
- }"
25
+ :class="{
26
+ 'being-dragged': draggingIndex === index,
27
+ hidden: isDragClone && draggingIndex === index,
28
+ disabled: item.disabled === true,
29
+ deleted: item.deleted
30
+ }"
31
+ v-show="!item.deleted"
30
32
  :data-index="index"
31
33
  @touchstart="(e) => onTouchStart(e, index)"
32
34
  @touchmove="onTouchMove"
@@ -37,9 +39,9 @@
37
39
  <div class="box" :class="{ shaking: isEditing }">
38
40
  <div class="thumb-wrap">
39
41
  <img class="thumb" :src="item.imageSrc" alt="" />
40
- <button class="delete-btn"
41
- :style="{ fontSize : data.deleteBtnSize && data.deleteBtnSize * 4 || 16 * 4 }"
42
- @click.stop="onDelete(index, item)">×</button>
42
+ <button class="delete-btn"
43
+ :style="{ fontSize : data.deleteBtnSize && data.deleteBtnSize * 4 || 16 * 4 }"
44
+ @click.stop="requestDelete(index, item)">×</button>
43
45
  </div>
44
46
  <div
45
47
  class="label-row"
@@ -76,11 +78,22 @@
76
78
  v-model="editInputValue"
77
79
  :placeholder="data.inputPlaceholder || ''"
78
80
  />
79
- <div class="modal-actions">
80
- <text class="btn cancel" @click="onEditCancel">取消</text>
81
- <div class="btn-divider"></div>
82
- <text class="btn confirm" @click="onEditConfirm">确认</text>
83
- </div>
81
+ <div class="modal-actions">
82
+ <text class="btn cancel" @click="onEditCancel">取消</text>
83
+ <div class="btn-divider"></div>
84
+ <text class="btn confirm" @click="onEditConfirm">确认</text>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ <div v-if="showDeleteConfirm" class="modal-mask">
89
+ <div class="modal">
90
+ <div class="modal-title">温馨提示</div>
91
+ <div class="modal-content">删除所选关注视角后,相关的智能场景将执行失败</div>
92
+ <div class="modal-actions">
93
+ <text class="btn cancel" @click="onDeleteCancel">取消</text>
94
+ <div class="btn-divider"></div>
95
+ <text class="btn confirm" @click="onDeleteConfirmAction">确定</text>
96
+ </div>
84
97
  </div>
85
98
  </div>
86
99
  </div>
@@ -132,6 +145,8 @@
132
145
  showEditDialog: false,
133
146
  editInputValue: '',
134
147
  editIndex: null,
148
+ showDeleteConfirm: false,
149
+ pendingDeleteIndex: null,
135
150
  scale: weex.config.env.scale
136
151
  };
137
152
  },
@@ -161,6 +176,25 @@
161
176
  if (this.isTouchDragging || this.longPressTimer || this.secondLongPressTimer) return;
162
177
  this.$emit('onClickEvent', { item, index });
163
178
  },
179
+
180
+ requestDelete(index, item) {
181
+ const targetItem = this.data.list[index];
182
+ if (!targetItem || targetItem.deleted) return;
183
+ this.pendingDeleteIndex = index;
184
+ this.showDeleteConfirm = true;
185
+ },
186
+
187
+ onDeleteCancel() {
188
+ this.showDeleteConfirm = false;
189
+ this.pendingDeleteIndex = null;
190
+ },
191
+
192
+ onDeleteConfirmAction() {
193
+ if (this.pendingDeleteIndex === null) return;
194
+ const item = this.data.list[this.pendingDeleteIndex];
195
+ this.onDelete(this.pendingDeleteIndex, item);
196
+ this.onDeleteCancel();
197
+ },
164
198
 
165
199
  onEditClick(item, index) {
166
200
  // 点击编辑按钮:弹出编辑名称对话框
@@ -175,16 +209,19 @@
175
209
  },
176
210
 
177
211
  /**
178
- * @description 校验并过滤输入内容:仅允许中文/英文/数字。
212
+ * @description 校验输入内容,仅允许中文/英文/数字,且去除前后空白。
179
213
  * @param {string} value 当前输入值
180
- * @returns {string} 校验并过滤后的值
214
+ * @returns {{ valid: boolean, message?: string, value?: string }}
181
215
  */
182
- validateAndFilterInput(value) {
183
- if (!value) return '';
184
- // 过滤:只保留中文、英文、数字
185
- // 正则表达式:[^a-zA-Z0-9\u4e00-\u9fa5] 匹配所有非英文、非数字、非汉字的字符
186
- let filteredValue = value.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '');
187
- return filteredValue;
216
+ validateLabelInput(value) {
217
+ const trimmedValue = (value || '').trim();
218
+ if (!trimmedValue) {
219
+ return { valid: false, message: '视角名称不能为空' };
220
+ }
221
+ if (/[^a-zA-Z0-9\u4e00-\u9fa5]/.test(trimmedValue)) {
222
+ return { valid: false, message: '视角名称只能输入中文、英文和数字' };
223
+ }
224
+ return { valid: true, value: trimmedValue };
188
225
  },
189
226
 
190
227
  showToast(message) {
@@ -199,20 +236,28 @@
199
236
  },
200
237
 
201
238
  onEditConfirm() {
202
- const originalValue = (this.editInputValue || '').trim();
203
- const newLabel = this.validateAndFilterInput(originalValue);
204
-
205
- // 2. 检查是否为空
206
- if (!newLabel) {
207
- this.showToast('不支持为空');
239
+ const validation = this.validateLabelInput(this.editInputValue);
240
+ if (!validation.valid) {
241
+ this.showToast(validation.message);
208
242
  return;
209
243
  }
244
+ const newLabel = validation.value;
245
+
210
246
  // 3. 检查长度
211
247
  if (newLabel.length > 8) {
212
248
  // 长度超限:提示并阻止后续更新和关闭逻辑
213
249
  this.showToast('限8个字符以内名称,请重新输入');
214
250
  return;
215
251
  }
252
+ const duplicateExists = this.data.list && this.data.list.some((it, idx) => {
253
+ if (idx === this.editIndex) return false;
254
+ if (!it || it.deleted) return false;
255
+ return String(it.label || '') === newLabel;
256
+ });
257
+ if (duplicateExists) {
258
+ this.showToast('已存在此视角');
259
+ return;
260
+ }
216
261
  if (this.editIndex !== null && this.data.list && this.data.list[this.editIndex]) {
217
262
  this.$set(this.data.list[this.editIndex], 'label', newLabel);
218
263
  // 通知外部(可选)
@@ -230,15 +275,20 @@
230
275
  * @param {object} item 列表项数据
231
276
  */
232
277
  onDelete(index, item) {
233
- this.$emit('onDeleteEvent', { item, index });
234
- // 默认本地也删除
235
- this.data.list.splice(index, 1);
278
+ const currentItem = this.data.list[index];
279
+ if (!currentItem) return;
280
+ this.$emit('onDeleteEvent', { item: currentItem, index });
281
+ this.$set(currentItem, 'deleted', true);
236
282
  this.$nextTick(this.measureItemSize);
237
283
  },
238
284
 
239
285
  onTouchStart(e, index) {
240
286
  if (!e.changedTouches || e.changedTouches.length === 0) return;
241
- this.measureItemSize();
287
+ const targetItem = this.data.list[index];
288
+ if (targetItem && targetItem.deleted) {
289
+ return;
290
+ }
291
+ this.measureItemSize();
242
292
  const touch = e.changedTouches[0];
243
293
  this.touchStartX = touch.pageX;
244
294
  this.touchStartY = touch.pageY;
@@ -395,7 +445,9 @@
395
445
  const gridItems = Array.from(this.$el.querySelectorAll('.grid-item'));
396
446
  let targetIndex = null;
397
447
  for (let i = 0; i < gridItems.length; i++) {
398
- if (i === this.draggingIndex) continue;
448
+ if (i === this.draggingIndex) continue;
449
+ const listItem = this.data.list[i];
450
+ if (listItem && listItem.deleted) continue;
399
451
  const rect = gridItems[i].getBoundingClientRect();
400
452
  const centerX = (rect.left + rect.right) / 2;
401
453
  const centerY = (rect.top + rect.bottom) / 2;
@@ -421,11 +473,15 @@
421
473
  },
422
474
  getListData(callback) {
423
475
  const list = Array.isArray(this.data && this.data.list) ? this.data.list : [];
424
- const arr = list.map((it) => ({
425
- id: String((it && (it.id != null ? it.id : '')) || ''),
426
- label: String((it && (it.label != null ? it.label : '')) || ''),
427
- imageSrc: (it && it.imageSrc) || ''
428
- }));
476
+ const arr = [];
477
+ list.forEach((it) => {
478
+ if (!it || it.deleted) return;
479
+ arr.push({
480
+ id: String((it && (it.id != null ? it.id : '')) || ''),
481
+ label: String((it && (it.label != null ? it.label : '')) || ''),
482
+ imageSrc: (it && it.imageSrc) || ''
483
+ });
484
+ });
429
485
  const payload = { listData: arr, list: arr };
430
486
  if (typeof callback === 'function') {
431
487
  try { callback(payload); } catch (e) { /* ignore */ }
@@ -512,8 +568,6 @@
512
568
  flex-direction: row;
513
569
  justify-content: center;
514
570
  gap: 8px;
515
- }
516
- .edit-icon {
517
571
  }
518
572
  .drag-clone {
519
573
  box-sizing: border-box;
@@ -548,6 +602,13 @@
548
602
  color: #222;
549
603
  margin: 24px 0 24px 0px;
550
604
  text-align: center;
605
+ font-weight: 500;
606
+ }
607
+ .modal-content {
608
+ font-size: 24px;
609
+ color: #333;
610
+ text-align: center;
611
+ padding-bottom: 16px;
551
612
  }
552
613
  .modal-input {
553
614
  width: 100%;
package/src/.DS_Store DELETED
Binary file
Binary file