diff --git a/ecc/blocks/attendee-management-table/attendee-management-table.js b/ecc/blocks/attendee-management-table/attendee-management-table.js index da21c865..caa4f0c3 100644 --- a/ecc/blocks/attendee-management-table/attendee-management-table.js +++ b/ecc/blocks/attendee-management-table/attendee-management-table.js @@ -1,7 +1,7 @@ /* eslint-disable max-len */ import { getAllEventAttendees, getEvents } from '../../scripts/esp-controller.js'; import { ALLOWED_ACCOUNT_TYPES } from '../../constants/constants.js'; -import { DEV_MODE, LIBS, MILO_CONFIG } from '../../scripts/scripts.js'; +import { LIBS } from '../../scripts/scripts.js'; import { getIcon, buildNoAccessScreen, @@ -418,7 +418,6 @@ function buildBackToDashboardBtn(props, config) { if (!sidePanel) return; const url = new URL(`${window.location.origin}${config['event-dashboard-url']}`); - if (DEV_MODE) url.searchParams.set('devMode', true); const backBtn = createTag('a', { class: 'back-btn', href: url.toString() }, 'Back', { parent: sidePanel }); backBtn.prepend(getIcon('chev-left')); } @@ -554,20 +553,11 @@ export default async function init(el) { import(`${miloLibs}/features/spectrum-web-components/dist/link.js`), ]); - const { search } = window.location; - const urlParams = new URLSearchParams(search); - const devMode = urlParams.get('devMode'); - const config = readBlockConfig(el); el.innerHTML = ''; buildLoadingScreen(el); const profile = BlockMediator.get('imsProfile'); - if (devMode === 'true' && ['stage', 'local'].includes(MILO_CONFIG.env.name)) { - buildDashboard(el, config); - return; - } - if (profile) { if (profile.noProfile || !ALLOWED_ACCOUNT_TYPES.includes(profile.account_type)) { buildNoAccessScreen(el); diff --git a/ecc/blocks/ecc-dashboard/ecc-dashboard.js b/ecc/blocks/ecc-dashboard/ecc-dashboard.js index bc81fe88..85a920ef 100644 --- a/ecc/blocks/ecc-dashboard/ecc-dashboard.js +++ b/ecc/blocks/ecc-dashboard/ecc-dashboard.js @@ -7,7 +7,7 @@ import { unpublishEvent, } from '../../scripts/esp-controller.js'; import { ALLOWED_ACCOUNT_TYPES } from '../../constants/constants.js'; -import { LIBS, MILO_CONFIG, DEV_MODE } from '../../scripts/scripts.js'; +import { LIBS } from '../../scripts/scripts.js'; import { getIcon, buildNoAccessScreen, getEventPageHost, readBlockConfig } from '../../scripts/utils.js'; import { quickFilter } from '../form-handler/data-handler.js'; import BlockMediator from '../../scripts/deps/block-mediator.min.js'; @@ -388,7 +388,6 @@ function buildStatusTag(event) { function buildEventTitleTag(config, eventObj) { const url = new URL(`${window.location.origin}${config['create-form-url']}`); url.searchParams.set('eventId', eventObj.eventId); - if (DEV_MODE) url.searchParams.set('devMode', true); const eventTitleTag = createTag('a', { class: 'event-title-link', href: url.toString() }, eventObj.title); return eventTitleTag; } @@ -407,7 +406,6 @@ function buildRSVPTag(config, eventObj) { const url = new URL(`${window.location.origin}${config['attendee-dashboard-url']}`); url.searchParams.set('eventId', eventObj.eventId); - if (DEV_MODE) url.searchParams.set('devMode', true); const rsvpTag = createTag('a', { class: 'rsvp-tag', href: url }, text); return rsvpTag; @@ -709,11 +707,6 @@ export default async function init(el) { buildLoadingScreen(el); const profile = BlockMediator.get('imsProfile'); - if (DEV_MODE === true && ['stage', 'local'].includes(MILO_CONFIG.env.name)) { - buildDashboard(el, config); - return; - } - if (profile) { if (profile.noProfile || !ALLOWED_ACCOUNT_TYPES.includes(profile.account_type)) { buildNoAccessScreen(el); diff --git a/ecc/blocks/event-community-link-component/event-community-link-component.js b/ecc/blocks/event-community-link-component/event-community-link-component.js index 9b2c210a..02f964dc 100644 --- a/ecc/blocks/event-community-link-component/event-community-link-component.js +++ b/ecc/blocks/event-community-link-component/event-community-link-component.js @@ -1,3 +1,4 @@ +import { LINK_REGEX } from '../../constants/constants.js'; import { LIBS } from '../../scripts/scripts.js'; import { generateToolTip } from '../../scripts/utils.js'; @@ -14,7 +15,7 @@ async function decorateFields(row) { id: 'community-url-details', class: 'text-input', placeholder: text, - pattern: '^https:\\/\\/[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$', + pattern: LINK_REGEX, size: 'xl', }); diff --git a/ecc/blocks/form-handler/controllers/checkbox-component-controller.js b/ecc/blocks/form-handler/controllers/checkbox-component-controller.js index ff78c213..59674058 100644 --- a/ecc/blocks/form-handler/controllers/checkbox-component-controller.js +++ b/ecc/blocks/form-handler/controllers/checkbox-component-controller.js @@ -40,7 +40,11 @@ export default function init(component, props) { }); } -export async function onUpdate(_component, _props) { +export async function onPayloadUpdate(_component, _props) { + // Do nothing +} + +export async function onRespUpdate(_component, _props) { // Do nothing } diff --git a/ecc/blocks/form-handler/controllers/event-agenda-component-controller.js b/ecc/blocks/form-handler/controllers/event-agenda-component-controller.js index c3865d02..59759f2d 100644 --- a/ecc/blocks/form-handler/controllers/event-agenda-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-agenda-component-controller.js @@ -17,7 +17,11 @@ export function onSubmit(component, props) { props.payload = { ...props.payload, ...agendaInfo }; } -export async function onUpdate(_component, _props) { +export async function onPayloadUpdate(_component, _props) { + // Do nothing +} + +export async function onRespUpdate(_component, _props) { // Do nothing } diff --git a/ecc/blocks/form-handler/controllers/event-community-link-component-controller.js b/ecc/blocks/form-handler/controllers/event-community-link-component-controller.js index 77c76d85..ac54ce5b 100644 --- a/ecc/blocks/form-handler/controllers/event-community-link-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-community-link-component-controller.js @@ -16,7 +16,11 @@ export function onSubmit(component, props) { } } -export async function onUpdate(_component, _props) { +export async function onPayloadUpdate(_component, _props) { + // Do nothing +} + +export async function onRespUpdate(_component, _props) { // Do nothing } diff --git a/ecc/blocks/form-handler/controllers/event-format-component-controller.js b/ecc/blocks/form-handler/controllers/event-format-component-controller.js index bd527715..8ac4697c 100644 --- a/ecc/blocks/form-handler/controllers/event-format-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-format-component-controller.js @@ -1,6 +1,7 @@ /* eslint-disable no-unused-vars */ import { getSeries } from '../../../scripts/esp-controller.js'; -import { LIBS, BlockMediator } from '../../../scripts/scripts.js'; +import BlockMediator from '../../../scripts/deps/block-mediator.min.js'; +import { LIBS } from '../../../scripts/scripts.js'; import { changeInputValue } from '../../../scripts/utils.js'; const { createTag } = await import(`${LIBS}/utils/utils.js`); @@ -52,7 +53,7 @@ function initStepLock(component) { onFormatChange(); } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { const { seriesId } = props.payload; if (seriesId) { const partnerSelectorGroups = document.querySelectorAll('partner-selector-group'); @@ -67,6 +68,10 @@ export async function onUpdate(component, props) { } } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + async function populateSeriesOptions(props, component) { const seriesSelect = component.querySelector('#series-select-input'); if (!seriesSelect) return; diff --git a/ecc/blocks/form-handler/controllers/event-info-component-controller.js b/ecc/blocks/form-handler/controllers/event-info-component-controller.js index d7538031..b86323dd 100644 --- a/ecc/blocks/form-handler/controllers/event-info-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-info-component-controller.js @@ -1,7 +1,8 @@ /* eslint-disable no-unused-vars */ /* eslint-disable no-use-before-define */ import { getEvents } from '../../../scripts/esp-controller.js'; -import { BlockMediator, LIBS } from '../../../scripts/scripts.js'; +import BlockMediator from '../../../scripts/deps/block-mediator.min.js'; +import { LIBS } from '../../../scripts/scripts.js'; import { changeInputValue } from '../../../scripts/utils.js'; const { createTag, getConfig } = await import(`${LIBS}/utils/utils.js`); @@ -342,10 +343,14 @@ export function onSubmit(component, props) { props.payload = { ...props.payload, ...eventInfo }; } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { // do nothing } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + function checkEventDuplication(event, compareMetrics) { const titleMatch = event.title === compareMetrics.title; const startDateMatch = event.localStartDate === compareMetrics.startDate; @@ -376,7 +381,7 @@ export default async function init(component, props) { BlockMediator.set('eventDupMetrics', { ...BlockMediator.get('eventDupMetrics'), title: eventTitleInput.value }); }); - endTimeInput.addEventListener('change', () => { + const updateEndTimeOptions = () => { if (datePicker.dataset.startDate !== datePicker.dataset.endDate) return; const allOptions = startTimeInput.querySelectorAll('sp-menu-item'); allOptions.forEach((option) => { @@ -386,9 +391,9 @@ export default async function init(component, props) { option.disabled = false; } }); - }); + }; - startTimeInput.addEventListener('change', () => { + const updateStartTimeOptions = () => { if (datePicker.dataset.startDate !== datePicker.dataset.endDate) return; const allOptions = endTimeInput.querySelectorAll('sp-menu-item'); allOptions.forEach((option) => { @@ -398,9 +403,9 @@ export default async function init(component, props) { option.disabled = false; } }); - }); + }; - datePicker.addEventListener('change', () => { + const updateTimeOptionsBasedOnDate = () => { if (datePicker.dataset.startDate !== datePicker.dataset.endDate) { startTimeInput?.querySelectorAll('sp-menu-item')?.forEach((option) => { option.disabled = false; @@ -409,7 +414,13 @@ export default async function init(component, props) { option.disabled = false; }); } + }; + endTimeInput.addEventListener('change', updateEndTimeOptions); + startTimeInput.addEventListener('change', updateStartTimeOptions); + + datePicker.addEventListener('change', () => { + updateTimeOptionsBasedOnDate(); BlockMediator.set('eventDupMetrics', { ...BlockMediator.get('eventDupMetrics'), startDate: datePicker.dataset.startDate }); }); @@ -473,6 +484,10 @@ export default async function init(component, props) { }); component.classList.add('prefilled'); } + + updateEndTimeOptions(); + updateStartTimeOptions(); + updateTimeOptionsBasedOnDate(); } export function onEventUpdate(component, props) { diff --git a/ecc/blocks/form-handler/controllers/event-partners-component-controller.js b/ecc/blocks/form-handler/controllers/event-partners-component-controller.js index 1ecaa5d7..a250fdeb 100644 --- a/ecc/blocks/form-handler/controllers/event-partners-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-partners-component-controller.js @@ -95,7 +95,7 @@ export async function onSubmit(component, props) { props.payload = { ...props.payload, showSponsors }; } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { if (!PARTNERS_SERIES_ID || PARTNERS_SERIES_ID !== props.eventDataResp.seriesId) { const partnersGroup = component.querySelector('partner-selector-group'); @@ -108,6 +108,10 @@ export async function onUpdate(component, props) { } } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + export default async function init(component, props) { const eventData = props.eventDataResp; const partnersGroup = component.querySelector('partner-selector-group'); diff --git a/ecc/blocks/form-handler/controllers/event-topics-component-controller.js b/ecc/blocks/form-handler/controllers/event-topics-component-controller.js index 1488807a..f0de27df 100644 --- a/ecc/blocks/form-handler/controllers/event-topics-component-controller.js +++ b/ecc/blocks/form-handler/controllers/event-topics-component-controller.js @@ -9,7 +9,11 @@ export function onSubmit(component, props) { props.payload = { ...props.payload, topics, fullTopicsValue }; } -export async function onUpdate(_component, _props) { +export async function onPayloadUpdate(_component, _props) { + // Do nothing +} + +export async function onRespUpdate(_component, _props) { // Do nothing } diff --git a/ecc/blocks/form-handler/controllers/img-upload-component-controller.js b/ecc/blocks/form-handler/controllers/img-upload-component-controller.js index 1138f0e4..9b2f1c47 100644 --- a/ecc/blocks/form-handler/controllers/img-upload-component-controller.js +++ b/ecc/blocks/form-handler/controllers/img-upload-component-controller.js @@ -38,10 +38,14 @@ function updateImgUploadComponentConfigs(component) { component.dataset.configs = JSON.stringify(configs); } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { updateImgUploadComponentConfigs(component); } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + export default async function init(component, props) { const type = getComponentImageType(component); const dropzones = component.querySelectorAll('image-dropzone'); diff --git a/ecc/blocks/form-handler/controllers/product-promotion-component-controller.js b/ecc/blocks/form-handler/controllers/product-promotion-component-controller.js index 1bec3156..ff1e3566 100644 --- a/ecc/blocks/form-handler/controllers/product-promotion-component-controller.js +++ b/ecc/blocks/form-handler/controllers/product-promotion-component-controller.js @@ -12,7 +12,7 @@ export function onSubmit(component, props) { if (selectedProducts) { const topicsVal = props.payload.fullTopicsValue?.map((x) => JSON.parse(x)); const relatedProducts = selectedProducts - .filter((p) => topicsVal.find((t) => p.tagID.includes(t.tagID))) + .filter((p) => topicsVal.find((t) => p.tagID?.includes(t.tagID))) .map((p) => ({ name: p.title, showProductBlade: !!p.showProductBlade, @@ -65,19 +65,19 @@ async function updateProductSelector(component, props) { 'Substance 3D Collection', ]; const caasTags = await getCaasTags(); - const topicsVal = props.payload.fullTopicsValue?.map((x) => JSON.parse(x)); - if (!caasTags || !topicsVal) return; + const topics = props.payload.fullTopicsValue?.map((x) => JSON.parse(x)); + if (!caasTags || !topics) return; const productGroups = component.querySelectorAll('product-selector-group'); let products = Object.values(caasTags.namespaces.caas.tags['product-categories'].tags).map((x) => [...Object.values(x.tags).map((y) => y)]).flat(); products = products.filter( - (p) => topicsVal.find((t) => p.tagID.includes(t.tagID)) && supportedProducts.includes(p.title), + (p) => topics.find((t) => p.tagID?.includes(t.tagID)) && supportedProducts?.includes(p.title), ); productGroups.forEach((pg) => { pg.setAttribute('data-products', JSON.stringify(products)); - pg.setAttribute('data-selected-topics', JSON.stringify(topicsVal)); + pg.setAttribute('data-selected-topics', JSON.stringify(topics)); pg.requestUpdate(); const selectedProducts = pg.getSelectedProducts(); @@ -100,10 +100,14 @@ async function updateProductSelector(component, props) { }); } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { await updateProductSelector(component, props); } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + export default async function init(component, props) { const eventData = props.eventDataResp; const productGroup = component.querySelector('product-selector-group'); diff --git a/ecc/blocks/form-handler/controllers/profile-component-controller.js b/ecc/blocks/form-handler/controllers/profile-component-controller.js index ee0eae9b..fd63b307 100644 --- a/ecc/blocks/form-handler/controllers/profile-component-controller.js +++ b/ecc/blocks/form-handler/controllers/profile-component-controller.js @@ -13,15 +13,28 @@ export async function onSubmit(component, props) { const profileContainer = component.querySelector('profile-container'); if (profileContainer) { + const { eventId } = getFilteredCachedResponse(); const speakers = profileContainer.getProfiles(); - if (speakers.length === 0) return; + + if (speakers.length === 0) { + if (props.eventDataResp.speakers) { + const savedSpeakers = props.eventDataResp.speakers; + await savedSpeakers.reduce(async (promise, speaker) => { + await promise; + const { speakerId } = speaker; + const resp = await removeSpeakerFromEvent(speakerId, eventId); + if (resp.error) return; + props.eventDataResp = { ...props.eventDataResp, ...resp }; + }, Promise.resolve()); + } + + return; + } if (speakers.filter((speaker) => !speaker.speakerType).length > 0) { throw new Error('Please select a speaker type for the speakers'); } - const { eventId } = getFilteredCachedResponse(); - await speakers.reduce(async (promise, speaker) => { await promise; @@ -80,10 +93,7 @@ export async function onSubmit(component, props) { if (!stillNeeded) { const resp = await removeSpeakerFromEvent(speakerId, eventId); - if (resp.error) { - return; - } - + if (resp.error) return; props.eventDataResp = { ...props.eventDataResp, ...resp }; } }, Promise.resolve()); @@ -91,7 +101,7 @@ export async function onSubmit(component, props) { } } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { const containers = component.querySelectorAll('profile-container'); containers.forEach(async (container) => { if (props.payload.seriesId && props.payload.seriesId !== container.seriesId) { @@ -103,6 +113,10 @@ export async function onUpdate(component, props) { }); } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + async function prefillProfiles(props) { const d = await props.eventDataResp; if (d?.eventId && d.seriesId) { diff --git a/ecc/blocks/form-handler/controllers/registration-details-component-controller.js b/ecc/blocks/form-handler/controllers/registration-details-component-controller.js index d19f3fad..cde7c625 100644 --- a/ecc/blocks/form-handler/controllers/registration-details-component-controller.js +++ b/ecc/blocks/form-handler/controllers/registration-details-component-controller.js @@ -59,7 +59,11 @@ export function onSubmit(component, props) { props.payload = { ...props.payload, ...rsvpData }; } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { + // Do nothing +} + +export async function onRespUpdate(component, props) { if (!props.eventDataResp) return; if (props.eventDataResp.cloudType === 'CreativeCloud') { diff --git a/ecc/blocks/form-handler/controllers/registration-fields-component-controller.js b/ecc/blocks/form-handler/controllers/registration-fields-component-controller.js index 6fc20673..353d6bb5 100644 --- a/ecc/blocks/form-handler/controllers/registration-fields-component-controller.js +++ b/ecc/blocks/form-handler/controllers/registration-fields-component-controller.js @@ -12,7 +12,11 @@ export function onSubmit(component, props) { props.payload = { ...props.payload, rsvpFormFields }; } -export async function onUpdate(_component, _props) { +export async function onPayloadUpdate(_component, _props) { + // Do nothing +} + +export async function onRespUpdate(_component, _props) { // Do nothing } diff --git a/ecc/blocks/form-handler/controllers/terms-conditions-component-controller.js b/ecc/blocks/form-handler/controllers/terms-conditions-component-controller.js index ce84b020..9c9f7303 100644 --- a/ecc/blocks/form-handler/controllers/terms-conditions-component-controller.js +++ b/ecc/blocks/form-handler/controllers/terms-conditions-component-controller.js @@ -1,10 +1,8 @@ /* eslint-disable no-unused-vars */ -import { ECC_ENV, LIBS } from '../../../scripts/scripts.js'; +import { LIBS } from '../../../scripts/scripts.js'; import HtmlSanitizer from '../../../scripts/deps/html-sanitizer.js'; -import { fetchThrottledMemoizedText, getEventPageHost } from '../../../scripts/utils.js'; -import { getFilteredCachedResponse } from '../data-handler.js'; +import { fetchThrottledMemoizedText, getECCEnv } from '../../../scripts/utils.js'; -const { customFetch } = await import(`${LIBS}/utils/helpers.js`); const { createTag } = await import(`${LIBS}/utils/utils.js`); function buildTerms(terms) { @@ -37,7 +35,7 @@ async function loadPreview(component, templateId) { let host; if (window.location.href.includes('.hlx.')) { - host = window.location.origin.replace(window.location.hostname, `${ECC_ENV}--events-milo--adobecom.hlx.page`); + host = window.location.origin.replace(window.location.hostname, `${getECCEnv()}--events-milo--adobecom.hlx.page`); } else { host = window.location.origin; } @@ -63,12 +61,16 @@ async function loadPreview(component, templateId) { } } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { const { templateId } = props.payload; if (!templateId) return; await loadPreview(component, templateId); } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + export default async function init(component, props) { const { templateId } = props.payload; if (!templateId) return; diff --git a/ecc/blocks/form-handler/controllers/venue-info-component-controller.js b/ecc/blocks/form-handler/controllers/venue-info-component-controller.js index 284d08d0..4b3a894b 100644 --- a/ecc/blocks/form-handler/controllers/venue-info-component-controller.js +++ b/ecc/blocks/form-handler/controllers/venue-info-component-controller.js @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ import { createVenue, replaceVenue } from '../../../scripts/esp-controller.js'; -import { BlockMediator, ECC_ENV } from '../../../scripts/scripts.js'; -import { changeInputValue, getSecret } from '../../../scripts/utils.js'; +import BlockMediator from '../../../scripts/deps/block-mediator.min.js'; +import { changeInputValue, getECCEnv, getSecret } from '../../../scripts/utils.js'; import { buildErrorMessage } from '../form-handler.js'; function togglePrefillableFieldsHiddenState(component, showPrefilledFields) { @@ -18,7 +18,7 @@ function togglePrefillableFieldsHiddenState(component, showPrefilledFields) { async function loadGoogleMapsAPI(callback) { const script = document.createElement('script'); - const apiKey = await getSecret(`${ECC_ENV}-google-places-api`); + const apiKey = await getSecret(`${getECCEnv()}-google-places-api`); script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places&callback=onGoogleMapsApiLoaded`; script.async = true; script.defer = true; @@ -112,10 +112,14 @@ export async function onSubmit(component, props) { // do nothing. Depend on eventUpdated event. } -export async function onUpdate(component, props) { +export async function onPayloadUpdate(component, props) { // do nothing } +export async function onRespUpdate(_component, _props) { + // Do nothing +} + export default async function init(component, props) { const eventData = props.eventDataResp; diff --git a/ecc/blocks/form-handler/form-handler.js b/ecc/blocks/form-handler/form-handler.js index cee726eb..9ff3c8a4 100644 --- a/ecc/blocks/form-handler/form-handler.js +++ b/ecc/blocks/form-handler/form-handler.js @@ -1,5 +1,5 @@ import { ALLOWED_ACCOUNT_TYPES } from '../../constants/constants.js'; -import { LIBS, MILO_CONFIG, DEV_MODE } from '../../scripts/scripts.js'; +import { LIBS } from '../../scripts/scripts.js'; import { getIcon, buildNoAccessScreen, @@ -294,14 +294,31 @@ async function handleEventUpdate(props) { await Promise.all(allComponentPromises); } -async function updateComponents(props) { +async function updateComponentsOnPayloadChange(props) { const allComponentPromises = VANILLA_COMPONENTS.map(async (comp) => { const mappedComponents = props.el.querySelectorAll(`.${comp}-component`); if (!mappedComponents.length) return {}; const promises = Array.from(mappedComponents).map(async (component) => { - const { onUpdate } = await import(`./controllers/${comp}-component-controller.js`); - const componentPayload = await onUpdate(component, props); + const { onPayloadUpdate } = await import(`./controllers/${comp}-component-controller.js`); + const componentPayload = await onPayloadUpdate(component, props); + return componentPayload; + }); + + return Promise.all(promises); + }); + + await Promise.all(allComponentPromises); +} + +async function updateComponentsOnRespChange(props) { + const allComponentPromises = VANILLA_COMPONENTS.map(async (comp) => { + const mappedComponents = props.el.querySelectorAll(`.${comp}-component`); + if (!mappedComponents.length) return {}; + + const promises = Array.from(mappedComponents).map(async (component) => { + const { onRespUpdate } = await import(`./controllers/${comp}-component-controller.js`); + const componentPayload = await onRespUpdate(component, props); return componentPayload; }); @@ -410,7 +427,7 @@ async function saveEvent(props, options = { toPublish: false }) { try { await gatherValues(props); } catch (e) { - return { message: e.message }; + return { error: { message: e.message } }; } let resp; @@ -760,13 +777,14 @@ async function buildECCForm(el) { case 'payload': { setPayloadCache(value); - updateComponents(target); + updateComponentsOnPayloadChange(target); initRequiredFieldsValidation(target); break; } case 'eventDataResp': { setResponseCache(value); + updateComponentsOnRespChange(target); updateCtas(target); if (value.error) { props.el.classList.add('show-error'); @@ -841,13 +859,6 @@ export default async function init(el) { const profile = BlockMediator.get('imsProfile'); - if (DEV_MODE === true && ['stage', 'local'].includes(MILO_CONFIG.env.name)) { - buildECCForm(el).then(() => { - el.classList.remove('loading'); - }); - return; - } - if (profile) { if (profile.noProfile || !ALLOWED_ACCOUNT_TYPES.includes(profile.account_type)) { buildNoAccessScreen(el); diff --git a/ecc/blocks/img-upload-component/img-upload-component.css b/ecc/blocks/img-upload-component/img-upload-component.css index b4ca214a..ecd11b52 100644 --- a/ecc/blocks/img-upload-component/img-upload-component.css +++ b/ecc/blocks/img-upload-component/img-upload-component.css @@ -97,6 +97,10 @@ top: 0; } +.img-upload-component .progress-wrapper.hidden { + display: none; +} + @media (min-width: 900px) { .img-upload-component .image-dropzones { grid-template-columns: 1fr 1fr 1fr; diff --git a/ecc/blocks/profile-component/profile-component.js b/ecc/blocks/profile-component/profile-component.js index 613d1e31..db41d1a5 100644 --- a/ecc/blocks/profile-component/profile-component.js +++ b/ecc/blocks/profile-component/profile-component.js @@ -36,7 +36,7 @@ async function decorateProfile(element) { const profileContainer = createTag('profile-container', { class: 'profile-component' }); profileContainer.fieldlabels = fieldlabels; - profileContainer.profiles = [{ socialMedia: [{ link: '' }] }]; + profileContainer.profiles = [{ socialMedia: [{ link: '' }], isPlaceholder: true }]; element.append(profileContainer); } diff --git a/ecc/components/profile-container/profile-container.js b/ecc/components/profile-container/profile-container.js index b0513587..4e6a3449 100644 --- a/ecc/components/profile-container/profile-container.js +++ b/ecc/components/profile-container/profile-container.js @@ -1,5 +1,6 @@ /* eslint-disable import/prefer-default-export */ /* eslint-disable class-methods-use-this */ +import { getSpeakers } from '../../scripts/esp-controller.js'; import { LIBS } from '../../scripts/scripts.js'; import { isEmptyObject } from '../../scripts/utils.js'; import { style } from './profile-container.css.js'; @@ -32,13 +33,19 @@ export class ProfileContainer extends LitElement { this.requestUpdate(); } + reloadSearchData = async () => { + const spResp = await getSpeakers(this.seriesId); + if (spResp) this.searchdata = spResp.speakers; + }; + updateProfile(index, profile) { this.profiles[index] = profile; + this.reloadSearchData(); this.requestUpdate(); } isValidSpeaker(profile) { - return profile.firstName && profile.lastName && profile.title && profile.bio; + return profile.firstName && profile.lastName && profile.title; } getProfiles() { @@ -56,7 +63,6 @@ export class ProfileContainer extends LitElement { } enableRepeater() { - // eslint-disable-next-line max-len return this.profiles.every((profile) => !profile.isPlaceholder && profile.type); } diff --git a/ecc/components/profile/profile.js b/ecc/components/profile/profile.js index ffdbe133..28090e31 100644 --- a/ecc/components/profile/profile.js +++ b/ecc/components/profile/profile.js @@ -41,7 +41,7 @@ export class Profile extends LitElement { this.attachShadow({ mode: 'open' }); this.fieldlabels = this.fieldlabels ?? DEFAULT_FIELD_LABELS; - this.profile = this.profile ?? { socialMedia: [{ link: '' }] }; + this.profile = this.profile ?? { socialMedia: [{ link: '' }], isPlaceholder: true }; this.profileCopy = {}; } @@ -169,7 +169,7 @@ export class Profile extends LitElement { saveDisabled() { // eslint-disable-next-line max-len - return !this.profile.firstName || !this.profile.lastName || !this.profile.title || !this.profile.bio; + return !this.profile.firstName || !this.profile.lastName || !this.profile.title; } renderNameFieldWithSearchIntegrated() { @@ -269,7 +269,7 @@ export class Profile extends LitElement { }; const bioData = { - value: this.profile?.bio, + value: this.profile?.bio ?? '', placeholder: fieldLabelsJSON.bio, helperText: fieldLabelsJSON.bioSubText, }; @@ -397,7 +397,7 @@ export class Profile extends LitElement { : nothing}
${this.profile.bio}
+ ${this.profile.bio ? html`${this.profile.bio}
` : nothing}