architwin 1.0.71 → 1.0.73

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.
@@ -1,4 +1,4 @@
1
- import { IShowcaseObject } from "architwin/lib/types";
1
+ import { IShowcaseObject } from "../../../types";
2
2
  import { I3DObject } from "../../../types";
3
3
  export declare function renderObjectCard(payload: IShowcaseObject): HTMLDivElement;
4
4
  export declare function renderObjectRow(payload: IShowcaseObject): HTMLDivElement;
@@ -7,7 +7,7 @@ import { setActiveActionBtn } from "./actionBar";
7
7
  import { renderLibraryCards } from "./libraryPane";
8
8
  import { setActiveThemeCard } from "./themePane";
9
9
  import { setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard } from "./card";
10
- import { renderRecepientOptions, renderTagMessages, createTagMessage } from "./tagMessagingPane";
10
+ import { renderRecepientOptions, renderTagMessages, createTagMessage, setTagMessagingDetails } from "./tagMessagingPane";
11
11
  declare let actionBar: HTMLElement;
12
12
  declare function renderToolbarUI(payload: IToolbarData): void;
13
- export { actionBar, tagFormMode, selectedTag, renderToolbarUI, renderObjectCards, setActiveMenu, clearActiveMenu, setActiveActionBtn, renderLibraryCards, renderTags, getTagFormData, renderTagRow, addClickEventToTagRow, setTagCategoriesOption, setActiveThemeCard, setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard, removeObjectCard, renderRecepientOptions, renderTagMessages, createTagMessage, renderCategoryDropdownOptions, toggleDropdown, setTagLink, getTagLink };
13
+ export { actionBar, tagFormMode, selectedTag, renderToolbarUI, renderObjectCards, setActiveMenu, clearActiveMenu, setActiveActionBtn, renderLibraryCards, renderTags, getTagFormData, renderTagRow, addClickEventToTagRow, setTagCategoriesOption, setActiveThemeCard, setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard, removeObjectCard, renderRecepientOptions, renderTagMessages, createTagMessage, renderCategoryDropdownOptions, toggleDropdown, setTagLink, getTagLink, setTagMessagingDetails };
@@ -10,7 +10,7 @@ import { renderLibraryPane, renderLibraryCards } from "./libraryPane";
10
10
  import { renderTagMessagingPane } from "./tagMessagingPane";
11
11
  import { renderThemePane, setActiveThemeCard } from "./themePane";
12
12
  import { setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard } from "./card";
13
- import { renderRecepientOptions, renderTagMessages, createTagMessage } from "./tagMessagingPane";
13
+ import { renderRecepientOptions, renderTagMessages, createTagMessage, setTagMessagingDetails } from "./tagMessagingPane";
14
14
  let iFrame, sidebarContainer, objectCardsContainer, tagListContainer;
15
15
  let menuBar, actionBar, objectListPane, addObjectPane, tagListPane, addObjectForm, tagFormPane, addMediaScreenForm, libraryPane, tagMessagingPane, themePane;
16
16
  function getIframeElement(iframeId) {
@@ -61,4 +61,4 @@ function renderToolbarUI(payload) {
61
61
  tagMessagingPane.style.display = 'none';
62
62
  themePane.style.display = 'none';
63
63
  }
64
- export { actionBar, tagFormMode, selectedTag, renderToolbarUI, renderObjectCards, setActiveMenu, clearActiveMenu, setActiveActionBtn, renderLibraryCards, renderTags, getTagFormData, renderTagRow, addClickEventToTagRow, setTagCategoriesOption, setActiveThemeCard, setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard, removeObjectCard, renderRecepientOptions, renderTagMessages, createTagMessage, renderCategoryDropdownOptions, toggleDropdown, setTagLink, getTagLink };
64
+ export { actionBar, tagFormMode, selectedTag, renderToolbarUI, renderObjectCards, setActiveMenu, clearActiveMenu, setActiveActionBtn, renderLibraryCards, renderTags, getTagFormData, renderTagRow, addClickEventToTagRow, setTagCategoriesOption, setActiveThemeCard, setActiveCard, setActiveLibraryCard, clearActiveCard, clearActiveLibraryCard, removeObjectCard, renderRecepientOptions, renderTagMessages, createTagMessage, renderCategoryDropdownOptions, toggleDropdown, setTagLink, getTagLink, setTagMessagingDetails };
@@ -1,4 +1,4 @@
1
- import { IShowcaseObject } from "architwin/lib/types";
1
+ import { IShowcaseObject } from "../../../types";
2
2
  export declare function renderObjectListPane(cardList: Array<IShowcaseObject>): HTMLElement;
3
3
  export declare function renderObjectCards(cardList: Array<IShowcaseObject>): void;
4
4
  export declare function addObjectCard(objectCards: HTMLElement, payload: IShowcaseObject): void;
@@ -34,7 +34,7 @@ export function renderObjectListPane(cardList) {
34
34
  <span class="mdi mdi-list-box"></span>
35
35
  </div>
36
36
  </div>
37
- <div class="at_scrollable_container" id="at-object-cards" data-cy="at-object-cards">
37
+ <div class="at_scrollable_container at_h-min-60" id="at-object-cards" data-cy="at-object-cards">
38
38
 
39
39
  </div>
40
40
  <div class="at_button_row at_justify_end">
@@ -11,5 +11,6 @@ export declare function getTagFormData(): {
11
11
  tagSubcategoryId?: string;
12
12
  };
13
13
  export declare function setTagCategoriesOption(): void;
14
- export declare function toggleDropdown(): void;
14
+ export declare function toggleDropdown(elementId: string): void;
15
15
  export declare function renderCategoryDropdownOptions(elementId: string, items: Array<ITagCategory>): void;
16
+ export declare function renderSubcategoryDropdownOptions(elementId: string, items: Array<ITagCategory>): void;
@@ -4,6 +4,7 @@ let mode = 'adding';
4
4
  let tagNameInput, tagDescriptionInput, tagEmbedInput, tagCategoryDropdown, tagSubcategoryDropdown;
5
5
  let selectedCategoryId = undefined;
6
6
  let selectedSubCategoryId = undefined;
7
+ let isChevronEventAdded = false;
7
8
  export let tagFormMode = "ADD" /* FORM_MODE.ADD */;
8
9
  export let selectedTag = undefined;
9
10
  export function renderTagFormPane() {
@@ -16,61 +17,77 @@ export function renderTagFormPane() {
16
17
  element.setAttribute('id', 'at-tag-form-pane');
17
18
  element.setAttribute('data-cy', 'at-tag-form-pane');
18
19
  element.innerHTML = `
19
- <div class="at_panel_header">
20
- <span>Tags</span>
21
- </div>
22
- <div class="at_form_container at_h-min-65">
23
- <div class="at_field at_flex_row">
24
- <label for="">Move Tag</label>
25
- <span class="mdi mdi-map-marker at_icon" id="at-move-tag-btn" data-cy="at-move-tag-btn"></span>
26
- </div>
27
- <div class="at_field at_flex_row" style="${_tagCategories ? '' : 'display: none;'}">
28
- <label for="">Category</label>
29
- <select class="at_transparent_dropdown at_w-full" name="" id="at-category-dropdown" data-cy="at-category-dropdown">
30
- <option value="none" selected>No category</option>
31
- </select>
32
- </div>
33
- <!-- <div class="at_field at_flex_row" style="${_tagCategories ? '' : 'display: none;'}">
34
- <label for="">Category</label>
35
- <div class="at_dropdown">
36
- <div class="at_flex at_flex_row at_space_between">
37
- <div class="at_dropdown_toggle" id="at-category-dropdown-toggle">No selection</div>
38
- <span class="mdi mdi-triangle-down at_chevron"></span>
39
- </div>
40
- <div class="at_dropdown_options" id="at-category-options">
20
+ <div class="at_panel_header">
21
+ <span>Tags</span>
22
+ </div>
23
+ <div class="at_form_container at_h-min-65">
24
+ <!-- <div class="at_field at_flex_row" style="${_tagCategories ? '' : 'display: none;'}">
25
+ <label for="">Category</label>
26
+ <select class="at_transparent_dropdown at_w-full" name="" id="at-category-dropdown" data-cy="at-category-dropdown">
27
+ <option value="none" selected>No category</option>
28
+ </select>
29
+ </div> -->
30
+ <div class="at_field at_flex_column" style="${_tagCategories ? '' : 'display: none;'}">
31
+ <label for="">Category</label>
32
+ <div class="at_dropdown" id="at-custom-category-dropdown" data-cy="at-custom-category-dropdown">
33
+ <div class="at_flex at_flex_row at_space_between">
34
+ <div class="at_dropdown_toggle" id="at-category-dropdown-toggle" data-cy="at-category-dropdown-toggle">No selection</div>
35
+ <span class="mdi mdi-triangle-down at_chevron" id="at-category-chevron" data-cy="at-category-chevron"></span>
36
+ </div>
37
+ <div style="position:absolute;">
38
+ <div class="at_dropdown_options" id="at-category-options" data-cy="at-category-options">
41
39
 
42
40
  </div>
43
41
  </div>
44
- </div> -->
45
- <div class="at_field at_flex_row" style="${_tagCategories ? '' : 'display: none;'}">
46
- <label for="">Subcategory</label>
47
- <select class="at_transparent_dropdown" name="" id="at-subcategory-dropdown" data-cy="at-subcategory-dropdown">
48
- <option value="none" selected>No subcategory</option>
49
- </select>
50
- </div>
51
- <div class="at-field at_flex_row">
52
- <label for="">Tag Name</label>
53
- <input class="at_field_input at_w-full" type="text" name="tag_name" id="at-tag-name-input" data-cy="at-tag-name-input" placeholder="Ex: Wall Painting">
54
- </div>
55
- <div class="at-field at_flex_column">
56
- <label for="">Description</label>
57
- <textarea name="" id="at-tag-description-input" data-cy="at-tag-description-input" class="at_textarea"></textarea>
58
- </div>
59
- <div class="at-field at_flex_column">
60
- <label for="">Embed Media</label>
61
- <textarea name="" id="at-tag-embed-input" data-cy="at-tag-embed-input" class="at_textarea"></textarea>
62
42
  </div>
63
43
  </div>
64
- <div class="at_button_row at_justify_between" >
65
- <div class="at_button at_ghost" style="margin-top: auto;" id="at-cancel-tag-form-btn" data-cy="at-cancel-tag-form-btn" target-pane="at-tag-list-pane">
66
- Cancel
67
- <span class="mdi mdi-close-circle-outline"></span>
68
- </div>
69
- <div class="at_button at_ghost" id="at-save-tag-btn" data-cy="at-save-tag-btn">
70
- Save Tag
71
- <span class="mdi mdi-plus-circle-outline"></span>
44
+ <!-- <div class="at_field at_flex_column" style="${_tagCategories ? '' : 'display: none;'}">
45
+ <label for="">Subcategory</label>
46
+ <select class="at_transparent_dropdown" name="" id="at-subcategory-dropdown" data-cy="at-subcategory-dropdown">
47
+ <option value="none" selected>No subcategory</option>
48
+ </select>
49
+ </div> -->
50
+ <div class="at_field at_flex_column" style="${_tagCategories ? '' : 'display: none;'}">
51
+ <label for="">Subcategory</label>
52
+ <div class="at_dropdown" id="at-custom-subcategory-dropdown" data-cy="at-custom-subcategory-dropdown">
53
+ <div class="at_flex at_flex_row at_space_between">
54
+ <div class="at_dropdown_toggle" id="at-subcategory-dropdown-toggle" data-cy="at-subcategory-dropdown-toggle">No selection</div>
55
+ <span class="mdi mdi-triangle-down at_chevron" id="at-subcategory-chevron" data-cy="at-subcategory-chevron"></span>
56
+ </div>
57
+ <div style="position:absolute;">
58
+ <div class="at_dropdown_options" id="at-subcategory-options" data-cy="at-subcategory-options">
59
+
60
+ </div>
61
+ </div>
72
62
  </div>
73
63
  </div>
64
+ <div class="at-field at_flex_row">
65
+ <label for="">Tag Name</label>
66
+ <input class="at_field_input at_w-full" type="text" name="tag_name" id="at-tag-name-input" data-cy="at-tag-name-input" placeholder="Ex: Wall Painting">
67
+ </div>
68
+ <div class="at_field at_flex_row at_items_center">
69
+ <label for="">Move Tag</label>
70
+ <span class="mdi mdi-map-marker at_icon" id="at-move-tag-btn" data-cy="at-move-tag-btn"></span>
71
+ </div>
72
+ <div class="at-field at_flex_column">
73
+ <label for="">Description</label>
74
+ <textarea name="" id="at-tag-description-input" data-cy="at-tag-description-input" class="at_textarea"></textarea>
75
+ </div>
76
+ <div class="at-field at_flex_column">
77
+ <label for="">Embed Media</label>
78
+ <textarea name="" id="at-tag-embed-input" data-cy="at-tag-embed-input" class="at_textarea"></textarea>
79
+ </div>
80
+ </div>
81
+ <div class="at_button_row at_justify_between" >
82
+ <div class="at_button at_ghost" style="margin-top: auto;" id="at-cancel-tag-form-btn" data-cy="at-cancel-tag-form-btn" target-pane="at-tag-list-pane">
83
+ Cancel
84
+ <span class="mdi mdi-close-circle-outline"></span>
85
+ </div>
86
+ <div class="at_button at_ghost" id="at-save-tag-btn" data-cy="at-save-tag-btn">
87
+ Save Tag
88
+ <span class="mdi mdi-plus-circle-outline"></span>
89
+ </div>
90
+ </div>
74
91
  `;
75
92
  return element;
76
93
  }
@@ -93,20 +110,20 @@ export function initFormData(tagId) {
93
110
  tagNameInput.value = targetTag.json_data.label;
94
111
  tagDescriptionInput.value = targetTag.json_data.description;
95
112
  tagEmbedInput.value = '';
96
- const tagCategoryOption = tagCategoryDropdown.querySelector(`option[value="${tagCategory.uuid}"]`);
97
- if (tagCategoryOption) {
98
- tagCategoryOption.selected = true;
99
- tagCategoryDropdown.dispatchEvent(new Event('change'));
100
- //make sure the subcategory dropdown is updated based on selected category dropdown
101
- handleCategoryDropdownChange;
102
- }
103
- const tagSubcategoryOption = tagSubcategoryDropdown.querySelector(`option[value="${targetTag.category_uuid}"]`);
104
- console.log('tagSubCategoryId', tagSubcategoryOption, targetTag.category_uuid);
105
- if (tagSubcategoryOption) {
106
- tagSubcategoryOption.selected = true;
107
- tagSubcategoryDropdown.dispatchEvent(new Event('change'));
108
- handleSubCategoryDropdownChange;
109
- }
113
+ // const tagCategoryOption = tagCategoryDropdown.querySelector(`option[value="${tagCategory.uuid}"]`) as HTMLOptionElement
114
+ // if (tagCategoryOption) {
115
+ // tagCategoryOption.selected = true;
116
+ // tagCategoryDropdown.dispatchEvent(new Event('change'));
117
+ // //make sure the subcategory dropdown is updated based on selected category dropdown
118
+ // handleCategoryDropdownChange
119
+ // }
120
+ // const tagSubcategoryOption = tagSubcategoryDropdown.querySelector(`option[value="${targetTag.category_uuid}"]`) as HTMLOptionElement
121
+ // console.log('tagSubCategoryId', tagSubcategoryOption, targetTag.category_uuid)
122
+ // if (tagSubcategoryOption) {
123
+ // tagSubcategoryOption.selected = true;
124
+ // tagSubcategoryDropdown.dispatchEvent(new Event('change'));
125
+ // handleSubCategoryDropdownChange
126
+ // }
110
127
  // if (tagNameInput) {
111
128
  // const tagName = tagNameInput.value
112
129
  // const tagDescription = tagDescriptionInput.value
@@ -136,6 +153,29 @@ export function initFormData(tagId) {
136
153
  tagDescriptionInput.value = '';
137
154
  tagEmbedInput.value = '';
138
155
  }
156
+ const categoryChevron = document.getElementById('at-category-chevron');
157
+ const subcategoryChevron = document.getElementById('at-subcategory-chevron');
158
+ if (categoryChevron) {
159
+ if (isChevronEventAdded == false) {
160
+ categoryChevron.addEventListener('click', () => {
161
+ toggleDropdown('at-category-options');
162
+ });
163
+ }
164
+ else {
165
+ console.log("Click event already attached to category chevron");
166
+ }
167
+ }
168
+ if (subcategoryChevron) {
169
+ if (isChevronEventAdded == false) {
170
+ subcategoryChevron.addEventListener('click', () => {
171
+ toggleDropdown('at-subcategory-options');
172
+ });
173
+ }
174
+ else {
175
+ console.log("Click event already attached to subcategory chevron");
176
+ }
177
+ }
178
+ isChevronEventAdded = true;
139
179
  }
140
180
  function setInputElements() {
141
181
  tagNameInput = document.getElementById('at-tag-name-input');
@@ -213,46 +253,79 @@ function handleCategoryDropdownChange(event) {
213
253
  }
214
254
  export function setTagCategoriesOption() {
215
255
  if (_tagCategories) {
216
- console.log("application will use tag categories", _tagCategories);
217
- const selectElementCategoryDropdown = document.getElementById('at-category-dropdown');
218
- clearDropdown(selectElementCategoryDropdown);
219
- const selectElementSubcategoryDropdown = document.getElementById('at-subcategory-dropdown');
220
- console.log('selectElementSubcategoryDropdown', selectElementSubcategoryDropdown);
221
- clearDropdown(selectElementSubcategoryDropdown);
222
- console.log('selectElementCategoryDropdown', selectElementCategoryDropdown);
223
- const defaultOption = document.createElement('option');
224
- defaultOption.value = 'none';
225
- defaultOption.textContent = 'No Category';
226
- selectElementCategoryDropdown.appendChild(defaultOption);
227
- _tagCategories.forEach((category, index) => {
228
- const option = document.createElement('option');
229
- option.value = category.uuid;
230
- option.textContent = category.name;
231
- // // Set the "selected" attribute for the first option if it's the default option
232
- // if (index === 0) {
233
- // option.selected = true;
234
- // }
235
- console.log("option", option);
236
- selectElementCategoryDropdown.appendChild(option);
237
- });
256
+ // console.log("application will use tag categories", _tagCategories)
257
+ // const selectElementCategoryDropdown = document.getElementById('at-category-dropdown');
258
+ // clearDropdown(selectElementCategoryDropdown)
259
+ // const selectElementSubcategoryDropdown = document.getElementById('at-subcategory-dropdown');
260
+ // console.log('selectElementSubcategoryDropdown', selectElementSubcategoryDropdown)
261
+ // clearDropdown(selectElementSubcategoryDropdown)
262
+ // console.log('selectElementCategoryDropdown', selectElementCategoryDropdown)
263
+ // const defaultOption = document.createElement('option');
264
+ // defaultOption.value = 'none';
265
+ // defaultOption.textContent = 'No Category';
266
+ // selectElementCategoryDropdown.appendChild(defaultOption);
267
+ // _tagCategories.forEach((category, index) => {
268
+ // const option = document.createElement('option');
269
+ // option.value = category.uuid;
270
+ // option.textContent = category.name;
271
+ // // // Set the "selected" attribute for the first option if it's the default option
272
+ // // if (index === 0) {
273
+ // // option.selected = true;
274
+ // // }
275
+ // console.log("option", option)
276
+ // selectElementCategoryDropdown.appendChild(option);
277
+ // });
238
278
  //Render options of new dropdown
239
- //renderCategoryDropdownOptions('at-category-options',_tagCategories)
240
- selectElementCategoryDropdown.addEventListener("change", handleCategoryDropdownChange);
279
+ renderCategoryDropdownOptions('at-category-options', _tagCategories);
280
+ //selectElementCategoryDropdown.addEventListener("change", handleCategoryDropdownChange)
241
281
  }
242
282
  else {
243
283
  console.log("application will not use tag categories");
244
284
  }
245
285
  }
246
- export function toggleDropdown() {
247
- const dropdownOptions = document.querySelector('.at_dropdown_options');
286
+ export function toggleDropdown(elementId) {
287
+ //const dropdownOptions = document.querySelector('.at_dropdown_options');
288
+ if (!elementId || elementId === '' || elementId == null) {
289
+ console.error("Element is undefined or empty");
290
+ return;
291
+ }
292
+ const dropdownOptions = document.getElementById(elementId);
248
293
  dropdownOptions.classList.toggle('open');
249
294
  }
250
- function selectOption(option) {
251
- const dropdownToggle = document.querySelector('.at_dropdown_toggle');
295
+ function selectOption(option, elementId) {
296
+ //const dropdownToggle = document.querySelector('.at_dropdown_toggle');
297
+ if (!elementId || elementId === '' || elementId == null) {
298
+ console.error("ElementId is empty or undefined");
299
+ return;
300
+ }
301
+ const dropdownToggle = document.getElementById(elementId);
252
302
  dropdownToggle.textContent = option.textContent;
253
303
  dropdownToggle.innerHTML = option.innerHTML;
254
304
  //selectedText = option.textContent;
255
- toggleDropdown();
305
+ const categoryUUID = option.getAttribute('category-uuid');
306
+ const categoryType = option.getAttribute('dropdown-type');
307
+ if (categoryUUID && categoryUUID !== null) {
308
+ if (categoryType == 'category') {
309
+ selectedCategoryId = categoryUUID;
310
+ }
311
+ else {
312
+ selectedSubCategoryId = categoryUUID;
313
+ }
314
+ //Populate subcategory dropdown
315
+ const targetCategory = _tagCategories.find(cat => cat.uuid === categoryUUID);
316
+ if (targetCategory && targetCategory.subcategories && targetCategory.subcategories.length > 0) {
317
+ console.log("Subcategories found", targetCategory.subcategories);
318
+ renderSubcategoryDropdownOptions('at-subcategory-options', targetCategory.subcategories);
319
+ }
320
+ }
321
+ let toggleId = '';
322
+ if (elementId === 'at-category-dropdown-toggle') {
323
+ toggleId = 'at-category-options';
324
+ }
325
+ else {
326
+ toggleId = 'at-subcategory-options';
327
+ }
328
+ toggleDropdown(toggleId);
256
329
  }
257
330
  export function renderCategoryDropdownOptions(elementId, items) {
258
331
  const element = document.getElementById(elementId);
@@ -264,6 +337,7 @@ export function renderCategoryDropdownOptions(elementId, items) {
264
337
  console.error("Parameter items is undefined");
265
338
  return;
266
339
  }
340
+ element.innerHTML = ``;
267
341
  //Add the no selection option
268
342
  const noSelection = document.createElement('div');
269
343
  noSelection.classList.add('at_option');
@@ -280,12 +354,63 @@ export function renderCategoryDropdownOptions(elementId, items) {
280
354
  const option = document.createElement('div');
281
355
  option.classList.add('at_option');
282
356
  option.setAttribute('category-uuid', item.uuid);
357
+ option.setAttribute('dropdown-type', 'category');
358
+ option.setAttribute('data-cy', `at-category-option-${item.uuid}`);
283
359
  option.innerHTML = `
284
360
  <span class="at_colored-indicator" style="background-color:${convertToCssRgb(item.json_data.color.rgb)}"></span>
285
361
  ${item.name}
286
362
  `;
287
363
  option.onclick = () => {
288
- selectOption(option);
364
+ selectOption(option, 'at-category-dropdown-toggle');
365
+ };
366
+ element.appendChild(option);
367
+ });
368
+ }
369
+ export function renderSubcategoryDropdownOptions(elementId, items) {
370
+ const element = document.getElementById(elementId);
371
+ if (!element) {
372
+ console.error("Parameter element is undefined");
373
+ return;
374
+ }
375
+ if (!items) {
376
+ console.error("Parameter items is undefined");
377
+ return;
378
+ }
379
+ //Clear previosly appended children
380
+ element.innerHTML = ``;
381
+ const selectedSubcategoryOption = document.getElementById('at-subcategory-dropdown-toggle');
382
+ if (selectedSubcategoryOption) {
383
+ selectedSubcategoryOption.textContent = 'No selection';
384
+ selectedSubCategoryId = undefined;
385
+ }
386
+ //Add the no selection option
387
+ const noSelection = document.createElement('div');
388
+ noSelection.classList.add('at_option');
389
+ noSelection.setAttribute('category-uuid', '');
390
+ noSelection.innerHTML = `
391
+ <span class="mdi mdi-circle-slice-1"></span> No selection
392
+ `;
393
+ element.appendChild(noSelection);
394
+ if (items.length <= 0) {
395
+ console.log("No items to render");
396
+ return;
397
+ }
398
+ items.forEach(item => {
399
+ const option = document.createElement('div');
400
+ option.classList.add('at_option');
401
+ option.setAttribute('category-uuid', item.uuid);
402
+ option.setAttribute('dropdown-type', 'subcategory');
403
+ option.setAttribute('data-cy', `at-category-option-${item.uuid}`);
404
+ option.innerHTML = `
405
+ ${item.json_data.iconUrl ? `
406
+ <img class="at_avatar_xs" style="display:inline-block" src="${item.json_data.iconUrl}"/>
407
+ ` : `
408
+ <span class="at_colored-indicator" style="background-color:rgb(255,255,255)"></span>
409
+ `}
410
+ ${item.name}
411
+ `;
412
+ option.onclick = () => {
413
+ selectOption(option, 'at-subcategory-dropdown-toggle');
289
414
  };
290
415
  element.appendChild(option);
291
416
  });
@@ -27,11 +27,11 @@ export function renderTagListPane() {
27
27
  <div class="at_panel_header">
28
28
  <span>Tags</span>
29
29
  </div>
30
- <div class="at_scrollable_container at_h-min-65">
30
+ <div class="at_scrollable_container at_h-min-60">
31
31
  <table id="at-tag-list-container">
32
32
  </table>
33
33
  </div>
34
- <div class="at_button_row at_justify_end" >
34
+ <div class="at_button_row at_justify_end" style="">
35
35
  <div class="at_button at_ghost" id="at-add-tag-btn" data-cy="at-add-tag-btn" target-pane="at-tag-form-pane">
36
36
  Add Tag
37
37
  <span class="mdi mdi-plus-circle-outline"></span>
@@ -14,3 +14,4 @@ export declare function clearSelectedMedia(): void;
14
14
  export declare function getTagMessageText(): string;
15
15
  export declare function clearTagMessageInput(): void;
16
16
  export declare function createTagMessage(): TagMessage;
17
+ export declare function setTagMessagingDetails(tagId: string): void;
@@ -1,9 +1,11 @@
1
- import { getTagMessageRecepients, getTagMessages, getSelectedTagUuid, dispatchSpaceEvent } from "../../../architwin";
1
+ import { getTagMessageRecepients, getTagMessages, getSelectedTagUuid, dispatchSpaceEvent, _tags } from "../../../architwin";
2
2
  import { SPACE_EVENTS } from "../../../types";
3
- import { generateUUID } from "../../../convert";
3
+ import { convertToCssRgb, generateUUID } from "../../../convert";
4
4
  import { Notyf } from 'notyf';
5
5
  import 'notyf/notyf.min.css';
6
- import { format } from 'date-fns';
6
+ import { parseISO } from 'date-fns';
7
+ import { formatWithOptions } from "date-fns/fp";
8
+ import { ja } from "date-fns/locale";
7
9
  let notyf = new Notyf({ position: { x: 'left', y: 'bottom' } });
8
10
  export function renderTagMessagingPane() {
9
11
  const element = document.createElement('div');
@@ -18,8 +20,8 @@ export function renderTagMessagingPane() {
18
20
  <div class="at_panel_header">
19
21
  <div class="at_button_row at_justify_between">
20
22
  <div>
21
- <div class="at_colored-indicator" style="background-color:rgb(0,0,0)"></div>
22
- <span>Tag Name</span>
23
+ <div class="at_colored-indicator" id="at-tag-color-messaging" style="background-color:rgb(0,0,0)"></div>
24
+ <span id='at-tag-name-messaging'>Tag Name</span>
23
25
  </div>
24
26
  <span class="mdi mdi-keyboard-return at_icon" id="at-cancel-tag-message-btn" data-cy="at-cancel-tag-message-btn" target-pane="at-tag-list-pane"></span>
25
27
  </div>
@@ -85,7 +87,7 @@ export function renderTagMessages() {
85
87
  }
86
88
  else {
87
89
  chatContainer.innerHTML = `
88
- <span id="at-no-message">No messages</span>
90
+ <span data-cy="at-no-messages-prompt" id="at-no-message">No messages</span>
89
91
  `;
90
92
  }
91
93
  return;
@@ -104,6 +106,10 @@ export function renderTagMessage(message, optimisticUpdate = false) {
104
106
  chat.classList.add('at_flex_row');
105
107
  chat.classList.add('at_justify_start');
106
108
  chat.style.display = 'flex';
109
+ const dateToString = formatWithOptions({ locale: ja }, 'd MMMM yyyy hh:mm:ss');
110
+ //const created_on = format(new Date(), 'yyyy-MM-dd HH:mm:ss')
111
+ const parsedDate = parseISO(message.created_on);
112
+ const created_on = dateToString(parsedDate);
107
113
  if (optimisticUpdate && message.binaryFile) {
108
114
  const reader = new FileReader();
109
115
  reader.onload = function (event) {
@@ -111,7 +117,7 @@ export function renderTagMessage(message, optimisticUpdate = false) {
111
117
  console.log('Data URL:', dataURL);
112
118
  message.image_url = dataURL;
113
119
  chat.innerHTML = `
114
- <span class="at_chat_avatar at_chat_avatar_sender">${message.owner_name.charAt(0)}</span>
120
+ <span class="at_chat_avatar at_chat_avatar_sender">${message.owner_name.charAt(0).toUpperCase()}</span>
115
121
  <div class="at_chat_bubble at_chat_bubble_sent">
116
122
  <div>
117
123
  <small>${message.owner_name} ➡️ ${message.to_user_name}</small> <br>
@@ -121,7 +127,7 @@ export function renderTagMessage(message, optimisticUpdate = false) {
121
127
  `
122
128
  <img class="at_chat_media" src="${message.image_url}"/><br>
123
129
  ` : ``}
124
- <small>${message.created_on}</small>
130
+ <small>${created_on}</small>
125
131
  </div>
126
132
  </div>
127
133
  `;
@@ -133,13 +139,17 @@ export function renderTagMessage(message, optimisticUpdate = false) {
133
139
  }
134
140
  else {
135
141
  chat.innerHTML = `
136
- <span class="at_chat_avatar at_chat_avatar_sender">${message.owner_name.charAt(0)}</span>
142
+ <span class="at_chat_avatar at_chat_avatar_sender">${message.owner_name.charAt(0).toUpperCase()}</span>
137
143
  <div class="at_chat_bubble at_chat_bubble_sent">
138
144
  <div>
139
145
  <small>${message.owner_name} ➡️ ${message.to_user_name}</small> <br>
140
146
  ${message.messages}
141
147
  <br>
142
- <small>${message.created_on}</small>
148
+ ${message.image_url && message.image_url !== '' ?
149
+ `
150
+ <img class="at_chat_media" src="${message.image_url}"/><br>
151
+ ` : ``}
152
+ <small>${created_on}</small>
143
153
  </div>
144
154
  </div>
145
155
  `;
@@ -147,8 +157,8 @@ export function renderTagMessage(message, optimisticUpdate = false) {
147
157
  if (optimisticUpdate) {
148
158
  const firstChild = chatContainer.firstChild;
149
159
  chatContainer.insertBefore(chat, firstChild);
150
- const input = (document.getElementById("at-no-message"));
151
- input.remove();
160
+ // const input = (document.getElementById("at-no-message"))
161
+ // input.remove()
152
162
  return;
153
163
  }
154
164
  else {
@@ -207,7 +217,10 @@ export function createTagMessage() {
207
217
  const tag_uuid = getSelectedTagUuid();
208
218
  const textMessage = getTagMessageText();
209
219
  const media = getChatMedia();
210
- const created_on = format(new Date(), 'yyyy-MM-dd HH:mm:ss');
220
+ const dateToString = formatWithOptions({ locale: ja }, 'yyyy-MM-dd HH:mm:ss');
221
+ //const created_on = format(new Date(), 'yyyy-MM-dd HH:mm:ss')
222
+ const currentDate = new Date();
223
+ const created_on = dateToString(currentDate);
211
224
  console.log("Recepient message ", recepient_uuid);
212
225
  if (!recepient_uuid || recepient_uuid.uuid === '' || recepient_uuid.uuid === 'undefined') {
213
226
  notyf.error("Select a recepient first");
@@ -234,3 +247,32 @@ export function createTagMessage() {
234
247
  notyf.success("Message successfuly sent");
235
248
  return message;
236
249
  }
250
+ export function setTagMessagingDetails(tagId) {
251
+ console.log("setTagMessagingDetails()", tagId);
252
+ if (tagId && tagId !== '') {
253
+ const tagTitle = document.getElementById('at-tag-name-messaging');
254
+ const tagColor = document.getElementById('at-tag-color-messaging');
255
+ if (!tagTitle) {
256
+ console.error("tagTitle does not exist in DOM");
257
+ return;
258
+ }
259
+ if (!tagColor) {
260
+ console.error("g does not exist in DOM");
261
+ return;
262
+ }
263
+ if (tagTitle.textContent === 'Tag Name') {
264
+ //@ts-ignore
265
+ const targetTag = _tags.find(tag => tag.id === tagId);
266
+ if (!targetTag) {
267
+ console.log("Target tag not found");
268
+ return;
269
+ }
270
+ tagTitle.textContent = targetTag.json_data.label;
271
+ tagColor.style.backgroundColor = convertToCssRgb(targetTag.json_data.color);
272
+ return;
273
+ }
274
+ return;
275
+ }
276
+ console.error("tagId is either undefined or empty");
277
+ return;
278
+ }
@@ -7,8 +7,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { actionBar, renderObjectCards, renderLibraryCards, renderTags, renderTagRow, getTagFormData, addClickEventToTagRow, setActiveCard, setActiveMenu, setActiveActionBtn, removeObjectCard, setTagCategoriesOption, toggleDropdown, tagFormMode, selectedTag, renderRecepientOptions, renderTagMessages, createTagMessage, setTagLink } from "./components/toolbar";
11
- import { getTargetPosition, addMediaScreen, _3DXObjects, selectedObject, setTransformControls, copyObject, revertTransform, clearSelectedObject, removeTransformControls, getLibrary, getMpTags, renderTag, captureSpaceScreenshot, moveTag, subscribeSpaceEvent, setModelVisibility, disposeModel, disposeTag, _tags, _tagCategories, dispatchSpaceEvent, editTagLabel, editTagDescription, setTagMessageRecepients, setTagMessages, setSelectedTagUuid, renderMeetingSidebar } from "../architwin";
10
+ import { actionBar, renderObjectCards, renderLibraryCards, renderTags, renderTagRow, getTagFormData, addClickEventToTagRow, setActiveCard, setActiveMenu, setActiveActionBtn, removeObjectCard, setTagCategoriesOption, toggleDropdown, tagFormMode, selectedTag, renderRecepientOptions, renderTagMessages, createTagMessage, setTagLink, setTagMessagingDetails } from "./components/toolbar";
11
+ import { getTargetPosition, addMediaScreen, _3DXObjects, selectedObject, setTransformControls, copyObject, revertTransform, clearSelectedObject, removeTransformControls, getLibrary, getMpTags, renderTag, captureSpaceScreenshot, moveTag, subscribeSpaceEvent, setModelVisibility, disposeModel, disposeTag, _tags, _tagCategories, dispatchSpaceEvent, editTagLabel, editTagDescription, setTagMessageRecepients, setTagMessages, setSelectedTagUuid, renderMeetingSidebar, } from "../architwin";
12
12
  import { Notyf } from 'notyf';
13
13
  import 'notyf/notyf.min.css';
14
14
  import { SPACE_EVENTS } from "../types";
@@ -165,7 +165,7 @@ function setupIndividualEventListeners() {
165
165
  handleSendTagMessage();
166
166
  handleSetModelsView();
167
167
  handleSetLibraryModelsView();
168
- //handleToggleDropdown()
168
+ handleToggleDropdown();
169
169
  }
170
170
  //================ OBJECT EVENT HANDLERS ===============//
171
171
  function handleTranslateObject() {
@@ -237,9 +237,16 @@ function handlePlaceTag() {
237
237
  const payload = getTagFormData();
238
238
  if (tagFormMode == "ADD" /* FORM_MODE.ADD */) {
239
239
  if (_tagCategories) {
240
+ console.log("tagFormData", payload);
241
+ const targetCategory = _tagCategories.find(cat => cat.uuid === payload.tagCategoryId);
240
242
  if (payload && payload.tagName && payload.tagCategoryId && payload.tagSubcategoryId) {
241
243
  tag.label = payload.tagName;
242
244
  tag.description = payload.tagDescription;
245
+ //tag.attachments.push(payload.tagEmbed)
246
+ if (targetCategory) {
247
+ console.log("targetCategory is", targetCategory);
248
+ tag.color = targetCategory.json_data.color.rgb;
249
+ }
243
250
  const iTag = yield renderTag({ tag: tag }, true);
244
251
  console.log('iTag', iTag);
245
252
  moveTag(iTag.id, onTagPlaced);
@@ -393,6 +400,7 @@ function handleSaveTag() {
393
400
  if (_tagCategories) {
394
401
  if (currentTag && tagFormPayload && tagFormPayload.tagName && tagFormPayload.tagCategoryId && tagFormPayload.tagSubcategoryId) {
395
402
  console.log("current Tag", currentTag);
403
+ currentTag.media_url = tagFormPayload.tagEmbed;
396
404
  let payload = { tag: currentTag };
397
405
  dispatchSpaceEvent(SPACE_EVENTS.TAG_SAVED, payload);
398
406
  currentTag = undefined;
@@ -590,8 +598,16 @@ function handleRenderMeetingUI() {
590
598
  }
591
599
  function handleToggleDropdown() {
592
600
  const categoryToggle = document.getElementById('at-category-dropdown-toggle');
601
+ const subcategoryToggle = document.getElementById('at-subcategory-dropdown-toggle');
593
602
  if (categoryToggle) {
594
- categoryToggle.addEventListener('click', toggleDropdown);
603
+ categoryToggle.addEventListener('click', () => {
604
+ toggleDropdown('at-category-options');
605
+ });
606
+ }
607
+ if (subcategoryToggle) {
608
+ subcategoryToggle.addEventListener('click', () => {
609
+ toggleDropdown('at-subcategory-options');
610
+ });
595
611
  }
596
612
  }
597
613
  function setupSpaceEventSubscriptions() {
@@ -621,6 +637,7 @@ function handleRetrieveTagMessage(payload) {
621
637
  setSelectedTagUuid(payload.tagUuid);
622
638
  renderRecepientOptions();
623
639
  renderTagMessages();
640
+ setTagMessagingDetails(payload.tagUuid);
624
641
  }
625
642
  function handleSetModelsView() {
626
643
  const modelsCardViewBtn = document.getElementById('at-models-card-view-btn');
@@ -4,31 +4,31 @@
4
4
  */
5
5
  export function preMeetingTemplate() {
6
6
  return `
7
- <div id="at-premeet" class="at_sidebar_container">
8
- <div id="at-premeet-header" class="at_header_container">
7
+ <div id="at-premeet" data-cy="at-premeet" class="at_sidebar_container">
8
+ <div id="at-premeet-header" data-cy="at-premeet-header" class="at_header_container">
9
9
  <span class="at_header">Setup Meeting</span>
10
- <span id="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
10
+ <span id="at-premeet-close" data-cy="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
11
11
  </div>
12
12
 
13
- <div id="at-sel-avatar-header" class="at_header_container" style="display: none;">
14
- <span id="at-avatar-back" style="cursor: pointer;" class="mdil mdil-arrow-left-circle at_icon-2"></span>
13
+ <div id="at-sel-avatar-header" data-cy="at-sel-avatar-header" class="at_header_container" style="display: none;">
14
+ <span id="at-avatar-back" data-cy="at-avatar-back" style="cursor: pointer;" class="mdil mdil-arrow-left-circle at_icon-2"></span>
15
15
  <span class="at_header">Select Avatar</span>
16
- <span id="at-avatar-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
16
+ <span id="at-avatar-close" data-cy="at-avatar-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
17
17
  </div>
18
18
 
19
- <div id="at-premeet-settings" class="column">
19
+ <div id="at-premeet-settings" data-cy="at-premeet-settings" class="column">
20
20
  <h2 class="at_sub-1">Setup your Video and Audio</h2>
21
21
  <div class="at_premeet_video">
22
- <video id="at-premeet-video"></video>
22
+ <video id="at-premeet-video" data-cy="at-premeet-video"></video>
23
23
  </div>
24
24
  <div>
25
25
  <div class="column">
26
26
  <div class="at_grouped">
27
- <button id="at-premeet-muteBtn" class="at_premeet_btn at_btn_red" @click="">
28
- <span id="at-premeet-muteIcon" class="mdi mdi-microphone-off "> Unmute</span>
27
+ <button id="at-premeet-muteBtn" data-cy="at-premeet-muteBtn" class="at_premeet_btn at_btn_red" @click="">
28
+ <span id="at-premeet-muteIcon" data-cy="at-premeet-muteIcon" class="mdi mdi-microphone-off "> Unmute</span>
29
29
  </button>
30
- <button id="at-premeet-camBtn" class="at_premeet_btn at_btn_blue" @click="">
31
- <span id="at-premeet-camIcon" class="mdi mdi-camera-off"> Camera</span>
30
+ <button id="at-premeet-camBtn" data-cy="at-premeet-camBtn" class="at_premeet_btn at_btn_blue" @click="">
31
+ <span id="at-premeet-camIcon" data-cy="at-premeet-camIcon" class="mdi mdi-camera-off"> Camera</span>
32
32
  </button>
33
33
  </div>
34
34
  <h2 class="at_txt_center at_sub-2">Select video and audio device</h2>
@@ -37,39 +37,39 @@ export function preMeetingTemplate() {
37
37
  <span class="mdi mdi-video at_icon-1"></span>
38
38
  <p class="at_ml-1 at_inter-16">Video</p>
39
39
  </div>
40
- <select class="at_select at_ml-2" name="videos" id="at-select-cameras"></select>
40
+ <select class="at_select at_ml-2" name="videos" id="at-select-cameras" data-cy="at-select-cameras"></select>
41
41
  </div>
42
42
  <div class="at_justify-center">
43
43
  <div class="at_flex-center at_mr-2" style="width: 70px">
44
44
  <span class="mdi mdi-volume-high at_icon-1"></span>
45
45
  <p class="at_ml-1 at_inter-16">Speaker</p>
46
46
  </div>
47
- <select class="at_select at_ml-2" name="speakers" id="at-select-speakers"></select>
47
+ <select class="at_select at_ml-2" name="speakers" id="at-select-speakers" data-cy="at-select-speakers"></select>
48
48
  </div>
49
49
  <div class="at_justify-center">
50
50
  <div class="at_flex-center at_mr-2" style="width: 70px">
51
51
  <span class="mdi mdi-microphone at_icon-1"></span>
52
52
  <p class="at_ml-1 at_inter-16">Mic</p>
53
53
  </div>
54
- <select class="at_select at_ml-2" name="mics" id="at-select-mics"></select>
54
+ <select class="at_select at_ml-2" name="mics" id="at-select-mics" data-cy="at-select-mics"></select>
55
55
  </div>
56
56
 
57
57
  <div class="at_grouped">
58
- <button id="at-avatar-btn" class="at_premeet_btn at_btn_avatar" onclick="">👨‍🚀 Choose Avatar</button>
58
+ <button id="at-avatar-btn" data-cy="at-avatar-btn" class="at_premeet_btn at_btn_avatar" onclick="">👨‍🚀 Choose Avatar</button>
59
59
  </div>
60
60
  <div class="at_grouped">
61
- <button id="at-joinbtn" class="at_premeet_btn at_btn_blue at_btn_join" onclick="">JOIN MEETING</button>
61
+ <button id="at-joinbtn" data-cy="at-joinbtn" class="at_premeet_btn at_btn_blue at_btn_join" onclick="">JOIN MEETING</button>
62
62
  </div>
63
63
  </div>
64
64
  </div>
65
65
  </div>
66
66
 
67
67
 
68
- <div id="at-select-avatar" class="column" style="display: none;">
69
- <div id="at-avatar-grid" class="at_grid-container">
68
+ <div id="at-select-avatar" data-cy="at-select-avatar" class="column" style="display: none;">
69
+ <div id="at-avatar-grid" data-cy="at-avatar-grid" class="at_grid-container">
70
70
  </div>
71
71
  <div class="at_grouped">
72
- <button id="at-set-avatar-btn" class="at_premeet_btn at_btn_avatar at_border2-white" onclick="">Set as my Avatar</button>
72
+ <button id="at-set-avatar-btn" data-cy="at-set-avatar-btn" class="at_premeet_btn at_btn_avatar at_border2-white" onclick="">Set as my Avatar</button>
73
73
  </div>
74
74
  </div>
75
75
 
@@ -81,115 +81,115 @@ export function preMeetingTemplate() {
81
81
  */
82
82
  export function inMeetingTemplate() {
83
83
  return `
84
- <div id="at-inmeet" class="at_sidebar_container" style="width: 0px !important">
85
- <div id="at-im-sidebar" class="at_im-sidebar">
86
- <div id="at-in-meeting" class="column">
84
+ <div id="at-inmeet" data-cy="at-inmeet" class="at_sidebar_container" style="width: 0px !important">
85
+ <div id="at-im-sidebar" data-cy="at-im-sidebar" class="at_im-sidebar">
86
+ <div id="at-in-meeting" data-cy="at-in-meeting" class="column">
87
87
  <span class="mdi mdi-chevron-down at_icon-2 at_mr-1" style="float: right;"></span>
88
88
  <div class="column">
89
89
  <div class="container">
90
- <canvas id="at-self-canvas" style="display: none;" class="at_inmeet_video" height="150" width="295"></canvas>
90
+ <canvas id="at-self-canvas" data-cy="at-self-canvas" style="display: none;" class="at_inmeet_video" height="150" width="295"></canvas>
91
91
  <div class="at_inmeet_video">
92
- <video id="at-self-video"></video>
92
+ <video id="at-self-video" data-cy="at-self-video"></video>
93
93
  </div>
94
- <span id="at-videoOff-cont" class="at_video_off at_inter-18"></span>
95
- <div id="at-self-role" class="at_host-overlay">
94
+ <span id="at-videoOff-cont" data-cy="at-videoOff-cont" class="at_video_off at_inter-18"></span>
95
+ <div id="at-self-role" data-cy="at-self-role" class="at_host-overlay">
96
96
  <span class="at_indicator"></span>
97
97
  <span> Host</span>
98
98
  </div>
99
99
  <div>
100
- <p id="at-self-name" class="at_text-overlay" ></p>
100
+ <p id="at-self-name" data-cy="at-self-name" class="at_text-overlay" ></p>
101
101
  </div>
102
- <span id="at-self-audio" class="mdi mdi-microphone at_icon-1 at_btn-overlay at_btn_round at_blue"></span>
102
+ <span id="at-self-audio" data-cy="at-self-audio" class="mdi mdi-microphone at_icon-1 at_btn-overlay at_btn_round at_blue"></span>
103
103
  </div>
104
- <div class="container" id="at-remote" style="display: none;">
105
- <canvas id="at-participant-canvas" class="at_inmeet_video at_mt-5" style="display: none; height="150" width="295"> Jochelle</canvas>
106
- <span id="at-videoOffRemoteName" class="at_video_off at_inter-18" top: 0%! important;"></span>
107
- <div id="at-remote-role" class="at_host-overlay" style="display: none; top: 10% !important;">
104
+ <div class="container" id="at-remote" data-cy="at-remote" style="display: none;">
105
+ <canvas id="at-participant-canvas" data-cy="at-participant-canvas" class="at_inmeet_video at_mt-5" style="display: none; height="150" width="295"> Jochelle</canvas>
106
+ <span id="at-videoOffRemoteName" data-cy="at-videoOffRemoteName" class="at_video_off at_inter-18" top: 0%! important;"></span>
107
+ <div id="at-remote-role" data-cy="at-remote-role" class="at_host-overlay" style="display: none; top: 10% !important;">
108
108
  <span class="at_indicator"></span>
109
109
  <span> Host</span>
110
110
  </div>
111
111
  <div>
112
- <p id="at-remote-name" class="at_text-overlay "></p>
112
+ <p id="at-remote-name" data-cy="at-remote-name" class="at_text-overlay "></p>
113
113
  </div>
114
- <span id="at-remote-audio" class="mdi mdi-microphone at_icon-1 at_btn-overlay at_btn_round at_blue"></span>
114
+ <span id="at-remote-audio" data-cy="at-remote-audio" class="mdi mdi-microphone at_icon-1 at_btn-overlay at_btn_round at_blue"></span>
115
115
  </div>
116
116
 
117
117
  </div>
118
118
  </div>
119
119
 
120
- <div id="at-settings-sidebar" class="column" style="display: none">
120
+ <div id="at-settings-sidebar" data-cy="at-settings-sidebar" class="column" style="display: none">
121
121
  <div class="at_tabs_container">
122
- <span id="at-participant-tab" class="at_tabs at_blue" @click="">Participants</span>
123
- <span id="at-settings-tab" class="at_tabs " @click="">Settings</span>
122
+ <span id="at-participant-tab" data-cy="at-participant-tab" class="at_tabs at_blue" @click="">Participants</span>
123
+ <span id="at-settings-tab" data-cy="at-settings-tab" class="at_tabs " @click="">Settings</span>
124
124
  </div>
125
125
 
126
126
 
127
- <div id="at-participantsDiv" style="display: none">
127
+ <div id="at-participantsDiv" data-cy="at-participantsDiv" style="display: none">
128
128
  <div class="at_tooltip at_copy_link">
129
- <div id="at-copy-link-btn" class="">
129
+ <div id="at-copy-link-btn" data-cy="at-copy-link-btn" class="">
130
130
  <span class="mdi mdi-content-copy mr-1"></span>
131
131
  <span>Copy Meeting Link</span>
132
132
  </div>
133
- <span class="at_tooltiptext" id="at-tooltip" style="display: none"></span>
133
+ <span class="at_tooltiptext" id="at-tooltip" data-cy="at-tooltip" style="display: none"></span>
134
134
  </div>
135
135
 
136
136
 
137
137
  <div class="at_ml-2 at_mr-3">
138
- <ul id="at-meetingParticipants"></ul>
138
+ <ul id="at-meetingParticipants" data-cy="at-meetingParticipants"></ul>
139
139
  </div>
140
140
  </div>
141
141
  </div>
142
142
 
143
- <div id="at-settingsDiv" class="column" style="display: none">
143
+ <div id="at-settingsDiv" data-cy="at-settingsDiv" class="column" style="display: none">
144
144
  <h2 class="at_txt_center at_sub-2" style="margin-top: 0rem !important;">Select video and audio device</h2>
145
145
  <div class="at_justify-center">
146
146
  <div class="at_flex-center at_mr-2" style="width: 70px">
147
147
  <span class="mdi mdi-video at_icon-1"></span>
148
148
  <p class="at_ml-1 at_inter-16">Video</p>
149
149
  </div>
150
- <select class="at_select at_ml-2" name="videos" id="at-select-cameras"></select>
150
+ <select class="at_select at_ml-2" name="videos" id="at-select-cameras" data-cy="at-select-cameras"></select>
151
151
  </div>
152
152
  <div class="at_justify-center">
153
153
  <div class="at_flex-center at_mr-2" style="width: 70px">
154
154
  <span class="mdi mdi-volume-high at_icon-1"></span>
155
155
  <p class="at_ml-1 at_inter-16">Speaker</p>
156
156
  </div>
157
- <select class="at_select at_ml-2" name="speakers" id="at-select-speakers"></select>
157
+ <select class="at_select at_ml-2" name="speakers" id="at-select-speakers" data-cy="at-select-speakers"></select>
158
158
  </div>
159
159
  <div class="at_justify-center">
160
160
  <div class="at_flex-center at_mr-2" style="width: 70px">
161
161
  <span class="mdi mdi-microphone at_icon-1"></span>
162
162
  <p class="at_ml-1 at_inter-16">Mic</p>
163
163
  </div>
164
- <select class="at_select at_ml-2" name="mics" id="at-select-mics"></select>
164
+ <select class="at_select at_ml-2" name="mics" id="at-select-mics" data-cy="at-select-mics"></select>
165
165
  </div>
166
166
  </div>
167
167
  </div>
168
168
 
169
169
 
170
- <div id="at-navbar" class="at_sidebar_bottom at_row">
170
+ <div id="at-navbar" data-cy="at-navbar" class="at_sidebar_bottom at_row">
171
171
  <div class="">
172
- <a id="at-settings-btn" class="at_btn_round at_white at_mr-1">
172
+ <a id="at-settings-btn" data-cy="at-settings-btn" class="at_btn_round at_white at_mr-1">
173
173
  <span class="mdi mdi-dots-horizontal at_icon-1"></span>
174
174
  </a>
175
- <a id="at-share-btn" class="at_btn_round at_white at_mr-1">
175
+ <a id="at-share-btn" data-cy="at-share-btn" class="at_btn_round at_white at_mr-1">
176
176
  <span class="mdi mdi-monitor-share at_icon-1"></span>
177
177
  </a>
178
- <a id="at-video-on" class="at_btn_round at_white at_mr-1" style="display: none">
179
- <span id="at-navbar-videoIcon" class="mdi mdi-video at_icon-1"></span>
178
+ <a id="at-video-on" data-cy="at-video-on" class="at_btn_round at_white at_mr-1" style="display: none">
179
+ <span id="at-navbar-videoIcon" data-cy="at-navbar-videoIcon" class="mdi mdi-video at_icon-1"></span>
180
180
  </a>
181
- <a id="at-video-off" class="at_btn_round at_light_red at_icon-off at_mr-1">
181
+ <a id="at-video-off" data-cy="at-video-off" class="at_btn_round at_light_red at_icon-off at_mr-1">
182
182
  <span class="mdi mdi-video-off at_icon-1"></span>
183
183
  </a>
184
- <a id="at-audio-on" class="at_btn_round at_white at_mr-1" style="display: none">
184
+ <a id="at-audio-on" data-cy="at-audio-on" class="at_btn_round at_white at_mr-1" style="display: none">
185
185
  <span class="mdi mdi-microphone at_icon-1"></span>
186
186
  </a>
187
- <a id="at-audio-off" class="at_btn_round at_light_red at_icon-off at_mr-1">
187
+ <a id="at-audio-off" data-cy="at-audio-off" class="at_btn_round at_light_red at_icon-off at_mr-1">
188
188
  <span class="mdi mdi-microphone-off at_icon-1"></span>
189
189
  </a>
190
190
  </div>
191
191
 
192
- <button id="at-leave-btn" class="at_leave_btn" @click="">LEAVE MEETING</button>
192
+ <button id="at-leave-btn" data-cy="at-leave-btn" class="at_leave_btn" @click="">LEAVE MEETING</button>
193
193
  </div>
194
194
  </div>
195
195
  `;
@@ -211,7 +211,7 @@ export function participantListTemplate(role, fullname, thumbnail) {
211
211
  </div>
212
212
  <span class="at_ml-1 at_inter ">${fullname}</span>
213
213
  </div>
214
- <span id="at-followParticipant" class="mdi mdi-walk at_icon-1 at_ml-auto" style="cursor: pointer;"></span>
214
+ <span id="at-followParticipant" data-cy="at-followParticipant" class="mdi mdi-walk at_icon-1 at_ml-auto" style="cursor: pointer;"></span>
215
215
  </div>
216
216
  `;
217
217
  }
@@ -220,27 +220,27 @@ export function participantListTemplate(role, fullname, thumbnail) {
220
220
  */
221
221
  export function createMeetingTemplate() {
222
222
  return `
223
- <div id="at-create-meeting" class="at_sidebar_container">
224
- <div id="at-premeet-header" class="at_header_container">
223
+ <div id="at-create-meeting" data-cy="at-create-meeting" class="at_sidebar_container">
224
+ <div id="at-premeet-header" data-cy="at-premeet-header" class="at_header_container">
225
225
  <span class="at_header">Create Meeting</span>
226
- <span id="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
226
+ <span id="at-premeet-close" data-cy="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
227
227
  </div>
228
228
 
229
229
  <div class="column" style="padding: 1.25rem;">
230
- <form id="at-cm-form">
230
+ <form id="at-cm-form" data-cy="at-cm-form">
231
231
  <p class="at_inter-16">Meeting Topic</p>
232
- <input type="text" class="at_input at_mb-1" id="at-cm-topic">
233
- <p id="at-cm-error1" class="at_inter-16" style="color: red; display: none;"></p>
232
+ <input type="text" class="at_input at_mb-1" id="at-cm-topic" data-cy="at-cm-topic">
233
+ <p id="at-cm-error1" data-cy="at-cm-error1" class="at_inter-16" style="color: red; display: none;"></p>
234
234
  <p class="at_inter-16">Fullname</p>
235
- <input type="text" class="at_input at_mb-1" id="at-cm-fullname">
236
- <p id="at-cm-error2" class="at_inter-16" style="color: red; display: none;"></p>
235
+ <input type="text" class="at_input at_mb-1" id="at-cm-fullname" data-cy="at-cm-fullname">
236
+ <p id="at-cm-error2" data-cy="at-cm-error2" class="at_inter-16" style="color: red; display: none;"></p>
237
237
  </form>
238
238
 
239
239
  <div class="at_grouped">
240
- <button id="at-cm-btn" class="at_mt-5 at_premeet_btn at_btn_blue at_btn_join">CREATE MY MEETING</button>
240
+ <button id="at-cm-btn" data-cy="at-cm-btn" class="at_mt-5 at_premeet_btn at_btn_blue at_btn_join">CREATE MY MEETING</button>
241
241
  </div>
242
242
 
243
- <span id="at-cm-join" class="at_inter-14 at_justify-center at_mt-5" style="text-decoration: underline; cursor: pointer;">Have a meeting invite? Click here to join</span>
243
+ <span id="at-cm-join" data-cy="at-cm-join" class="at_inter-14 at_justify-center at_mt-5" style="text-decoration: underline; cursor: pointer;">Have a meeting invite? Click here to join</span>
244
244
  </div>
245
245
  </div>
246
246
  `;
@@ -251,28 +251,28 @@ export function createMeetingTemplate() {
251
251
  export function joinMeetingTemplate(link) {
252
252
  console.log("__@ joinMeeting link: ", link);
253
253
  return `
254
- <div id="at-join-meeting" class="at_sidebar_container">
255
- <div id="at-premeet-header" class="at_header_container">
254
+ <div id="at-join-meeting" data-cy="at-join-meeting" class="at_sidebar_container">
255
+ <div id="at-premeet-header" data-cy="at-premeet-header" class="at_header_container">
256
256
  <span class="at_header">Join Meeting</span>
257
- <span id="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
257
+ <span id="at-premeet-close" data-cy="at-premeet-close" style="cursor: pointer;" class="mdi mdi-close-circle-outline at_icon-2"></span>
258
258
  </div>
259
259
 
260
260
  <div class="column" style="padding: 1.25rem;">
261
- <form id="at-join-form">
261
+ <form id="at-join-form" data-cy="at-join-form">
262
262
  <p class="at_inter-16">Fullname</p>
263
- <input type="text" class="at_input at_mb-1" id="at-join-fullname">
264
- <p id="at-join-error2" class="at_inter-16" style="color: red; display: none;"></p>
263
+ <input type="text" class="at_input at_mb-1" id="at-join-fullname" data-cy="at-join-fullname">
264
+ <p id="at-join-error2" data-cy="at-join-error2" class="at_inter-16" style="color: red; display: none;"></p>
265
265
  <p class="at_inter-16">Enter Meeting Link</p>
266
- <input type="url" class="at_input at_mb-1" id="at-join-link" value="${link == '' ? '' : link}">
267
- <p id="at-join-error3" class="at_inter-16" style="color: red; display: none;"></p>
266
+ <input type="url" class="at_input at_mb-1" id="at-join-link" data-cy="at-join-link" value="${link == '' ? '' : link}">
267
+ <p id="at-join-error3" data-cy="at-join-error3" class="at_inter-16" style="color: red; display: none;"></p>
268
268
 
269
269
  </form>
270
270
 
271
271
  <div class="at_grouped">
272
- <button id="at-join-btn" class="at_mt-5 at_premeet_btn at_btn_blue at_btn_join">JOIN MEETING</button>
272
+ <button id="at-join-btn" data-cy="at-join-btn" class="at_mt-5 at_premeet_btn at_btn_blue at_btn_join">JOIN MEETING</button>
273
273
  </div>
274
274
 
275
- <span id="at-join-back" style="cursor: pointer;" class="at_inter-16 at_justify-center at_mt-5">GO BACK</span>
275
+ <span id="at-join-back" data-cy="at-join-back" style="cursor: pointer;" class="at_inter-16 at_justify-center at_mt-5">GO BACK</span>
276
276
  </div>
277
277
  </div>
278
278
 
package/lib/tag.js CHANGED
@@ -49,6 +49,9 @@ function renderTag({ tag, sdk }) {
49
49
  if (!tagData.id) {
50
50
  tagData.id = tagIds[0];
51
51
  }
52
+ // if(tag. && payload.icon.trim() !== ''){
53
+ // await setTagIcon({sdk: sdk, tag: tag, icon: payload.icon,color:payload.tag.color})
54
+ // }
52
55
  return tagData;
53
56
  // //attach media to tag (Video / Image / PDF); There are still more attachment types pls refer https://matterport.github.io/showcase-sdk/docs/reference/current/enums/tag.attachmenttype.html
54
57
  // if(payload.attachments && payload.attachments.length > 0){
package/lib/types.d.ts CHANGED
@@ -26,6 +26,7 @@ export interface ITag {
26
26
  inDb: boolean;
27
27
  category_uuid?: string;
28
28
  uuid?: string;
29
+ media_url?: string;
29
30
  }
30
31
  export interface ITagCategory {
31
32
  uuid: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "architwin",
3
- "version": "1.0.71",
3
+ "version": "1.0.73",
4
4
  "description": "ArchiTwin Library for Matterport",
5
5
  "main": "./lib/architwin.js",
6
6
  "types": "./lib/architwin.d.ts",
@@ -31,7 +31,6 @@
31
31
  "@superviz/matterport-plugin": "^0.8.8",
32
32
  "@superviz/sdk": "^4.13.9",
33
33
  "@zoom/videosdk": "^1.8.7",
34
- "aws-sdk": "^2.1385.0",
35
34
  "axios": "^1.4.0",
36
35
  "date-fns": "^2.30.0",
37
36
  "jsrsasign": "^10.8.6",
@@ -220,6 +220,10 @@
220
220
  justify-content: space-between;
221
221
  }
222
222
 
223
+ .at_items_center {
224
+ align-items: center;
225
+ }
226
+
223
227
  .at_sidebar_button_icon {
224
228
  padding: 4px 8px;
225
229
  cursor: pointer;
@@ -395,17 +399,19 @@
395
399
  .at_dropdown {
396
400
  width: calc(100% - 8px);
397
401
  margin: 4px;
398
- background-color: hsla(191, 22%, 10%, 0.5);
399
- color: white;
402
+ background-color: var(--bg-secondary);
403
+ color: var(--text-color-light);
400
404
  font-family: Arial, sans-serif;
401
405
  padding: 8px 8px;
402
406
  transition: opacity 0.3s ease-in-out;
407
+ cursor: pointer;
403
408
  }
404
409
 
405
410
  .at_dropdown_options {
406
411
  display: none;
407
412
  padding: 4px;
408
413
  z-index: 10;
414
+ background-color: var(--bg-secondary);
409
415
  }
410
416
 
411
417
  .at_option {
@@ -413,15 +419,33 @@
413
419
  padding: 4px 8px;
414
420
  }
415
421
 
422
+ .at_option:hover {
423
+ background-color: var(--bg-accent);
424
+ }
425
+
416
426
  .at_dropdown_options.open {
417
427
  display: block;
418
428
  opacity: 1;
429
+ z-index: 10;
430
+ position: relative;
419
431
  }
420
432
 
421
433
  .at_dropdown_toggle {
422
434
  display: inline-block;
423
435
  }
424
436
 
437
+ .at_avatar_xs {
438
+ width: 24px;
439
+ }
440
+
441
+ .at_avatar_sm {
442
+ width: 48px;
443
+ }
444
+
445
+ .at_avatar_md {
446
+ width: 96px;
447
+ }
448
+
425
449
  /* CSS Class for Transparent Textarea with White Bottom Border */
426
450
  .at_textarea {
427
451
  border: none;
Binary file