Now with better Zoom info support.

This commit is contained in:
Scott Idem
2025-07-14 21:11:58 -04:00
parent de2b5db21a
commit 6c79be7179
6 changed files with 449 additions and 30 deletions

View File

@@ -833,6 +833,7 @@ export async function db_save_ae_obj_li__event(
mod_abstracts_json: obj.mod_abstracts_json,
mod_badges_json: obj.mod_badges_json,
mod_exhibits_json: obj.mod_exhibits_json,
mod_meetings_json: obj.mod_meetings_json,
mod_pres_mgmt_json: obj.mod_pres_mgmt_json,
cfg_json: obj.cfg_json,
@@ -869,6 +870,7 @@ export async function db_save_ae_obj_li__event(
attend_url: obj.attend_url,
attend_url_text: obj.attend_url_text,
attend_url_code: obj.attend_url_code,
attend_url_passcode: obj.attend_url_passcode,
attend_phone: obj.attend_phone,
attend_phone_passcode: obj.attend_phone_passcode,
@@ -1059,6 +1061,7 @@ export const properties_to_save = [
'mod_abstracts_json',
'mod_badges_json',
'mod_exhibits_json',
'mod_meetings_json',
'mod_pres_mgmt_json',
'cfg_json',
@@ -1095,6 +1098,7 @@ export const properties_to_save = [
'attend_url',
'attend_url_text',
'attend_url_code',
'attend_url_passcode',
'attend_phone',
'attend_phone_passcode',
@@ -1183,6 +1187,7 @@ export async function process_ae_obj__event_props({
mod_abstracts_json: obj.mod_abstracts_json,
mod_badges_json: obj.mod_badges_json,
mod_exhibits_json: obj.mod_exhibits_json,
mod_meetings_json: obj.mod_meetings_json,
mod_pres_mgmt_json: obj.mod_pres_mgmt_json,
cfg_json: obj.cfg_json,
@@ -1223,6 +1228,7 @@ export async function process_ae_obj__event_props({
attend_url: obj.attend_url,
attend_url_text: obj.attend_url_text,
attend_url_code: obj.attend_url_code,
attend_url_passcode: obj.attend_url_passcode,
attend_phone: obj.attend_phone,
attend_phone_passcode: obj.attend_phone_passcode,

View File

@@ -43,6 +43,7 @@ export interface Event {
mod_abstracts_json?: null|key_val;
mod_badges_json?: null|key_val;
mod_exhibits_json?: null|key_val;
mod_meetings_json?: null|key_val;
mod_pres_mgmt_json?: null|key_val;
cfg_json?: null|key_val;
@@ -84,6 +85,7 @@ export interface Event {
attend_url?: null|string;
attend_url_text?: null|string;
attend_url_code?: null|string; // Meeting ID, Conference ID, etc.
attend_url_passcode?: null|string;
attend_phone?: null|string;
attend_phone_passcode?: null|string;

View File

@@ -151,6 +151,8 @@ let idaa_session_data_struct: key_val = {
show__modal_edit__event_id: null,
show__modal_view__event_id: null,
obj_changed: false, // Used to track if the event object has been changed in the edit view
attend_platform: null, // 'Zoom', 'Google Meet', 'Microsoft Teams', etc.
},
};

View File

@@ -27,7 +27,7 @@ import { ae_util } from '$lib/ae_utils/ae_utils';
import { core_func } from '$lib/ae_core/ae_core_functions';
import { api } from '$lib/api';
import { ae_snip, ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_stores';
import { idaa_loc, idaa_sess, idaa_slct } from '$lib/ae_idaa_stores';
import { idaa_loc, idaa_sess, idaa_slct, idaa_trig } from '$lib/ae_idaa_stores';
import { events_func } from '$lib/ae_events_functions';
import Tiptap_editor from '$lib/element_tiptap_editor.svelte';
@@ -101,13 +101,18 @@ if ($idaa_slct.event_id) {
location_text: null,
attend_platform: null,
attend_url: null,
attend_url_code: null,
attend_url_passcode: null,
attend_phone: null,
attend_phone_passcode: null,
attend_text: null,
attend_json: {
},
timezone: null,
recurring_text: null,
@@ -347,7 +352,9 @@ async function handle_submit_form(event: any) {
}
event_do['attend_url'] = event_meeting_fd.attend_url;
event_do['attend_url_code'] = event_meeting_fd.attend_url_code;
event_do['attend_url_passcode'] = event_meeting_fd.attend_url_passcode;
event_do['attend_phone'] = event_meeting_fd.attend_phone;
event_do['attend_phone_passcode'] = event_meeting_fd.attend_phone_passcode;
@@ -358,6 +365,41 @@ async function handle_submit_form(event: any) {
console.log('New attend text is not a string. Do nothing.');
}
if ($idaa_sess.recovery_meetings?.attend_platform === 'Zoom') {
// event_do['attend_url_passcode_enc'] = event_meeting_fd.attend_url_passcode_enc;
let zoom_attend_domain = event_meeting_fd.attend_domain ?? 'zoom.us';
let zoom_meeting_id = event_do['attend_url_code'] ? event_do['attend_url_code'].replace(/[^0-9]/g, '').trim() : null; // Strip out any non-numeric characters
let zoom_passcode = event_do['attend_url_passcode'] ? event_do['attend_url_passcode'].trim() : null; // Strip out any non-alphanumeric characters
let zoom_passcode_enc = event_meeting_fd.attend_url_passcode_enc ? event_meeting_fd.attend_url_passcode_enc.replace(/[^a-zA-Z0-9]/g, '').trim() : null; // Strip out any non-alphanumeric characters
let zoom_url = event_meeting_fd.zoom_attend_url ? event_meeting_fd.zoom_attend_url.trim() : null;
// Example JSON structure:
// "zoom": {
// domain = attend_url_base; Zoom domain; Vanity URL
// meeting_id = append as /j/attend_url_code;
// passcode = attend_url_passcode
// url = ''; // generated below
// phone = ''; // ignored; Just use the standard list?
// }
// domain: only contain letters, numbers and dashes (-)
// let domain = event_do['attend_url'] ? event_do['attend_url'].replace(/[^a-zA-Z0-9-]/g, '') : null; // Strip out any non-alphanumeric characters except dashes
event_do['attend_json'] = {
'zoom':
{
domain: zoom_attend_domain,
meeting_id: zoom_meeting_id,
passcode: zoom_passcode,
passcode_enc: zoom_passcode_enc,
full_url: zoom_url,
}
};
console.log(event_do['attend_json']);
} else {
event_do['attend_json'] = {};
}
event_do['timezone'] = event_meeting_fd.timezone;
event_do['recurring'] = true; // Assume always true 2024-10 !!event_meeting_fd.recurring;
@@ -653,15 +695,69 @@ $effect(() => {
if (orig_event_obj === null || orig_event_obj === undefined || orig_event_obj === 'undefined') {
obj_changed = false;
} else if (!obj_changed && orig_event_obj?.id && (JSON.stringify($idaa_slct.event_obj) !== JSON.stringify(orig_event_obj) || description_changed || notes_changed)) {
// console.log('Post object has changed from original.', $inspect(orig_event_obj));
console.log('Post object has changed from original.', orig_event_obj);
console.log('Post object has changed.', $idaa_slct.event_obj);
// console.log('Event object has changed from original.', $inspect(orig_event_obj));
console.log('Event object has changed from original.', orig_event_obj);
console.log('Event object has changed.', $idaa_slct.event_obj);
obj_changed = true;
} else if (obj_changed && orig_event_obj?.id && (JSON.stringify($idaa_slct.event_obj) === JSON.stringify(orig_event_obj) && !description_changed && !notes_changed)) {
obj_changed = false;
// console.log(orig_event_obj?.attend_json);
// if (orig_event_obj?.attend_json?.zoom) {
// $idaa_sess.recovery_meetings.attend_platform = 'Zoom';
// } else {
// $idaa_sess.recovery_meetings.attend_platform = null;
// }
}
});
// $effect(() => {
// if ($idaa_slct.event_obj?.attend_json?.zoom) {
// $idaa_sess.recovery_meetings.attend_platform = 'Zoom';
// } else {
// $idaa_sess.recovery_meetings.attend_platform = null;
// }
// });
if (browser && $idaa_slct.event_obj?.attend_json) {
if ($idaa_slct.event_obj?.attend_json?.zoom) {
$idaa_sess.recovery_meetings.attend_platform = 'Zoom';
} else {
$idaa_sess.recovery_meetings.attend_platform = null;
}
}
$effect(() => {
if ($idaa_trig == 'update_zoom_full_url' && $idaa_slct.event_obj.attend_url_code && $idaa_slct.event_obj.attend_url_passcode && $idaa_sess.recovery_meetings.attend_platform === 'Zoom') {
$idaa_trig = null;
// $idaa_slct.event_obj.attend_json.zoom.full_url = `https://${$idaa_slct.event_obj.attend_url.replace(/[^a-zA-Z0-9-]/g, '')}/j/${$idaa_slct.event_obj.attend_url_code.replace(/[^0-9]/g, '')}?pwd=${$idaa_slct.event_obj.attend_url_passcode.replace(/[^a-zA-Z0-9]/g, '')}`;
// $idaa_slct.event_obj.attend_url_code = String($idaa_slct.event_obj.attend_url_code).replace(/\D/g, '').trim();
$idaa_slct.event_obj.attend_url_code = String($idaa_slct.event_obj.attend_url_code).replace(/[^0-9]/g, '').trim() ?? '';
$idaa_slct.event_obj.attend_url_passcode = String($idaa_slct.event_obj.attend_url_passcode).trim() ?? '';
// $idaa_slct.event_obj.attend_json.zoom.passcode_enc = String($idaa_slct.event_obj.attend_json.zoom.passcode_enc).replace(/[^a-zA-Z0-9]/g, '').trim();
$idaa_slct.event_obj.attend_json.zoom.passcode_enc = String($idaa_slct.event_obj.attend_json.zoom.passcode_enc) ?? '';
// $idaa_slct.event_obj.attend_json.zoom.domain = $idaa_slct.event_obj.attend_json.zoom.domain ? String($idaa_slct.event_obj.attend_json.zoom.domain).replace(/[^a-zA-Z0-9.-]/g, '').trim() : 'zoom.us';
$idaa_slct.event_obj.attend_json.zoom.domain = $idaa_slct.event_obj.attend_json.zoom.domain ? String($idaa_slct.event_obj.attend_json.zoom.domain).toLowerCase().trim() : 'zoom.us';
$idaa_slct.event_obj.attend_json.zoom.domain = $idaa_slct.event_obj.attend_json.zoom.domain.replace(/^https?:\/\//, '').replace(/\/.*$/, ''); // Remove any leading http(s):// and anything after the first /
if ($idaa_slct.event_obj.attend_json.zoom.passcode_enc && $idaa_slct.event_obj.attend_json.zoom.passcode_enc.length >= 8) {
$idaa_slct.event_obj.attend_json.zoom.full_url = `https://${$idaa_slct.event_obj.attend_json.zoom.domain}/j/${$idaa_slct.event_obj.attend_url_code}?pwd=${$idaa_slct.event_obj.attend_json.zoom.passcode_enc}`;
} else {
$idaa_slct.event_obj.attend_json.zoom.full_url = `https://${$idaa_slct.event_obj.attend_json.zoom.domain}/j/${$idaa_slct.event_obj.attend_url_code}?pwd=${$idaa_slct.event_obj.attend_url_passcode}`;
}
} else {
// $idaa_slct.event_obj.attend_json = {};
// $idaa_slct.event_obj.attend_json.zoom = null;
}
});
</script>
@@ -712,7 +808,7 @@ $effect(() => {
<div>
<label for="name" class="w-full">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Name of Recovery Meeting
</span>
<input
@@ -734,7 +830,7 @@ $effect(() => {
</div>
<label for="description" class="ae_label event__description w-full">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Short description
</span>
<!-- <textarea name="description" id="description" class="ae_value event__description tinymce_editor editor_basic textarea" rows="5" cols="70" bind:value={$idaa_slct.event_obj.description} ></textarea> -->
@@ -770,7 +866,7 @@ $effect(() => {
<div>
<label class="form-group w-100">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Type of Recovery Meeting
</span>
<select
@@ -787,7 +883,7 @@ $effect(() => {
<option value="Family Recovery">Family Recovery</option>
</select>
</label>
<ul class="list-disc list-inside">
<ul class="text-sm text-neutral-500 list-disc list-inside">
<li><strong>IDAA</strong> - Open to IDAA members only</li>
<li><strong>Caduceus</strong> - Open to all healthcare workers including those who do not qualify for IDAA</li>
<li><strong>Family Recovery</strong> - Open to spouses, parents, and adult children of medical professionals who have substance use disorder.
@@ -802,7 +898,7 @@ $effect(() => {
<h3 class="h2">How to Attended</h3>
<fieldset class="event__physical_virtual">
<legend class="legend text-lg font-semibold">Face-to-Face or Virtual</legend>
<legend class="legend text-lg text-neutral-500 font-semibold">Face-to-Face or Virtual</legend>
<p>Is this a face-to-face/in person meeting, a virtual/online meeting, or both?</p>
<div class="ae_group border border-gray-200 rounded-md p-2 space-y-1 ">
<label
@@ -893,7 +989,7 @@ $effect(() => {
class:hidden={!$idaa_slct.event_obj?.physical && !$idaa_slct.event_obj?.more__location_fields}
>
<legend class="legend text-lg font-semibold">Address</legend>
<legend class="legend text-lg text-neutral-500 font-semibold">Address</legend>
<input id="" name="address_location_id_random" type="hidden" value="{$lq__event_obj?.address_location_id_random}">
@@ -1043,7 +1139,7 @@ $effect(() => {
class="w-full"
class:hidden={!$idaa_slct.event_obj?.physical && !$idaa_slct.event_obj?.more__location_fields}
>
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Additional information about the meeting location
</span>
<!-- <textarea class="ae_value event__location_text tinymce_editor editor_less_100 textarea" id="location_text" name="location_text" placeholder="Additional information about the meeting location" rows="2" cols="70" bind:value={$idaa_slct.event_obj.location_text}></textarea> -->
@@ -1109,26 +1205,240 @@ $effect(() => {
"
class:hidden={!$idaa_slct.event_obj.virtual && !$idaa_slct.event_obj?.more__virtual_fields}
>
<legend class="legend text-lg font-semibold">Virtual/Online</legend>
<legend class="legend text-lg font-semibold">
Virtual/Online
{#if $idaa_sess.recovery_meetings.attend_platform == 'Zoom'}
<span class="text-sm italic text-gray-600"> (Zoom Meeting)</span>
{:else if $idaa_sess.recovery_meetings.attend_platform == 'Google Meet'}
<span class="text-sm italic text-gray-600"> (Google Meet)</span>
{:else if $idaa_sess.recovery_meetings.attend_platform == 'Microsoft Teams'}
<span class="text-sm italic text-gray-600"> (Microsoft Teams)</span>
{:else if $idaa_sess.recovery_meetings.attend_platform == 'other'}
<span class="text-sm italic text-gray-600"> (Other Platform/ Service)</span>
{/if}
</legend>
<label for="attend_url">URL to access the virtual meeting
<input type="url" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_url" name="attend_url" placeholder="URL to access the virtual meeting" value={$lq__event_obj?.attend_url ?? ''} autocomplete="url">
</label>
<label for="attend_url_passcode">Passcode to join at URL
<input type="text" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_url_passcode" name="attend_url_passcode" placeholder="Passcode to join at URL" value={$lq__event_obj?.attend_url_passcode ?? ''} autocomplete="off">
</label>
<!-- Toggle if this is a Zoom meeting, Google Meet, Microsoft Teams, or "other" as a catch all type of virtual meeting. For now just toggle between "Zoom" and "other" -->
<div class="w-full flex flex-col flex-wrap gap-1 items-center justify-center">
<p class="text-sm italic text-gray-600">
Click button to toggle if this is a Zoom meeting or other platform/service.
<!-- {$idaa_slct.event_obj?.attend_json?.zoom} -->
{$idaa_sess.recovery_meetings.attend_platform}
</p>
{#if $idaa_sess.recovery_meetings?.attend_platform === 'Zoom'}
<button
type="button"
class="
novi_btn
btn btn-lg
preset-filled-tertiary-200-800
transition
"
onclick={() => {
$idaa_sess.recovery_meetings.attend_platform = 'other'
}}
>
<span class="fas fa-minus"></span>
Not Zoom? Other Platform/Service
</button>
{:else if !$idaa_sess.recovery_meetings?.attend_platform || $idaa_sess.recovery_meetings?.attend_platform === 'other'}
<button
type="button"
class="
novi_btn
btn btn-lg
w-48
preset-filled-tertiary-200-800
transition
"
onclick={() => {
if (!$idaa_slct.event_obj.attend_json || JSON.stringify($idaa_slct.event_obj.attend_json) === '{}') {
$idaa_slct.event_obj.attend_json = {
"zoom": {
"domain": "zoom.us",
"meeting_id": "",
"passcode": "",
"passcode_enc": "",
"full_url": "",
}
};
}
$idaa_sess.recovery_meetings.attend_platform = 'Zoom'
$idaa_trig = 'update_zoom_full_url';
}}
>
<!-- <span class="fas fa-plus"></span> -->
<span class="fas fa-video m-1"></span>
Zoom Meeting?
</button>
{/if}
<!-- <label for="attend_platform" class="form-group w-100 col-12">
<span class="text-lg font-semibold">
Platform/Service
</span>
<select
class="
form-control col-6
select w-48 p-1
preset-tonal-surface hover:preset-filled-surface-100-900
"
id="attend_platform"
name="attend_platform"
value={$idaa_slct.event_obj?.tmp__attend_platform ?? 'other'}
>
<option value="Zoom">Zoom</option>
<option value="Google Meet">Google Meet</option>
<option value="Microsoft Teams">Microsoft Teams</option>
<option value="other">Other / Not specified</option>
</select>
</label> -->
</div>
{#if $idaa_sess.recovery_meetings?.attend_platform === 'Zoom'}
<div class="flex flex-row flex-wrap gap-2 items-center justify-start">
<label for="attend_url_code">
Zoom Meeting ID
<input
type="number"
id="attend_url_code" name="attend_url_code"
max="99999999999"
autocomplete="off"
required
bind:value={$idaa_slct.event_obj.attend_url_code}
onchange={() => {
console.log('Changed Zoom Meeting ID to:', $idaa_slct.event_obj.attend_url_code);
if ($idaa_slct.event_obj.attend_url_code && $idaa_slct.event_obj.attend_url_code.length > 8) {
// $idaa_slct.event_obj.attend_url_code = String($idaa_slct.event_obj.attend_url_code).replace(/\D/g, '').trim();
<label for="attend_phone">Phone number for meeting conference call
<input type="tel" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_phone" name="attend_phone" placeholder="Phone number for meeting conference call" value={$lq__event_obj?.attend_phone ?? ''} autocomplete="tel">
</label>
<label for="attend_phone_passcode">Passcode to join conference call
<input type="text" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_phone_passcode" name="attend_phone_passcode" placeholder="Passcode to join conference call" value={$lq__event_obj?.attend_phone_passcode ?? ''} autocomplete="off">
</label>
$idaa_trig = 'update_zoom_full_url';
} else {
// $idaa_slct.event_obj.attend_url_code = '';
}
}}
class="
form-control
input w-72 preset-tonal-surface hover:preset-filled-surface-100-900
invalid:[&:not(:placeholder-shown):not(:focus)]:border-red-500
required:preset-filled-warning
invalid:preset-filled-error
"
placeholder="Zoom Meeting ID"
>
</label>
<label for="attend_url_passcode">
Zoom Passcode
<input
type="text"
id="attend_url_passcode" name="attend_url_passcode"
autocomplete="off"
bind:value={$idaa_slct.event_obj.attend_url_passcode}
onchange={() => {
console.log('Changed Zoom Passcode to:', $idaa_slct.event_obj.attend_url_passcode);
if ($idaa_slct.event_obj.attend_url_passcode && $idaa_slct.event_obj.attend_url_passcode.length > 3) {
// $idaa_slct.event_obj.attend_url_passcode = String($idaa_slct.event_obj.attend_url_passcode).trim();
$idaa_trig = 'update_zoom_full_url';
} else {
$idaa_slct.event_obj.attend_url_passcode = '';
}
}}
class="
form-control
input w-72 preset-tonal-surface hover:preset-filled-surface-100-900
"
placeholder="Zoom Passcode"
>
</label>
<label for="attend_url_passcode_enc">
Zoom Encrypted Passcode
<input
type="text"
id="attend_url_passcode_enc" name="attend_url_passcode_enc"
autocomplete="off"
bind:value={$idaa_slct.event_obj.attend_json.zoom.passcode_enc}
onchange={() => {
console.log('Changed Zoom Encrypted Passcode to:', $idaa_slct.event_obj.attend_json.zoom.passcode_enc);
if ($idaa_slct.event_obj.attend_json.zoom.passcode_enc && $idaa_slct.event_obj.attend_json.zoom.passcode_enc.length >= 8) {
// $idaa_slct.event_obj.attend_json.zoom.passcode_enc = String($idaa_slct.event_obj.attend_json.zoom.passcode_enc).replace(/[^a-zA-Z0-9]/g, '').trim();
$idaa_trig = 'update_zoom_full_url';
} else {
// $idaa_slct.event_obj.attend_json.zoom.passcode_enc = '';
}
}}
class="
form-control
input w-72 preset-tonal-surface hover:preset-filled-surface-100-900
"
placeholder="Zoom Encrypted Passcode"
>
</label>
<label for="attend_domain">
Zoom domain / Vanity URL
<input
type="text"
id="attend_domain" name="attend_domain"
autocomplete="url"
bind:value={$idaa_slct.event_obj.attend_json.zoom.domain}
onchange={() => {
console.log('Changed Zoom domain to:', $idaa_slct.event_obj.attend_json.zoom.domain);
if ($idaa_slct.event_obj.attend_json.zoom.domain) {
// Remove any protocol (http:// or https://) and any trailing slashes
// $idaa_slct.event_obj.attend_json.zoom.domain = String($idaa_slct.event_obj.attend_json.zoom.domain).replace(/(^\w+:|^)\/\//, '').replace(/\/+$/, '').toLowerCase();
// $idaa_slct.event_obj.attend_json.zoom.domain = String($idaa_slct.event_obj.attend_json.zoom.domain).toLowerCase();
$idaa_trig = 'update_zoom_full_url';
} else {
$idaa_slct.event_obj.attend_json.zoom.domain = 'zoom.us';
}
}}
class="
form-control
input w-72 preset-tonal-surface hover:preset-filled-surface-100-900
"
placeholder="Zoom domain"
>
<!-- Example: example.zoom.us -->
</label>
</div>
<label for="zoom_attend_url">
Zoom Meeting URL
<input
type="url"
id="zoom_attend_url" name="zoom_attend_url"
autocomplete="url"
readonly
bind:value={$idaa_slct.event_obj.attend_json.zoom.full_url}
class="
input w-100 preset-tonal-surface hover:preset-filled-surface-100-900 form-control
"
placeholder="Zoom Meeting URL"
>
<!-- Example: https://zoom.us/j/1234567890?pwd=abcdefg -->
</label>
<!-- https://{$idaa_slct.event_obj?.attend_json?.zoom?.domain?? 'zoom.us'}/j/{$idaa_slct.event_obj?.attend_url_code ?? 'INVALID' }?pwd={$idaa_slct.event_obj?.attend_url_passcode ?? 'REQUIRED'} -->
<!-- {$idaa_slct.event_obj.attend_json.zoom.full_url} -->
{:else if !$idaa_sess.recovery_meetings?.attend_platform || $idaa_sess.recovery_meetings?.attend_platform === 'other'}
<label for="attend_url">URL to access the virtual meeting
<input type="url" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_url" name="attend_url" placeholder="URL to access the virtual meeting" value={$lq__event_obj?.attend_url ?? ''} autocomplete="url">
</label>
<label for="attend_url_passcode">Passcode to join at URL
<input type="text" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_url_passcode" name="attend_url_passcode" placeholder="Passcode to join at URL" value={$lq__event_obj?.attend_url_passcode ?? ''} autocomplete="off">
</label>
<label for="attend_phone">Phone number for meeting conference call
<input type="tel" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_phone" name="attend_phone" placeholder="Phone number for meeting conference call" value={$lq__event_obj?.attend_phone ?? ''} autocomplete="tel">
</label>
<label for="attend_phone_passcode">Passcode to join conference call
<input type="text" class="input w-72 preset-tonal-surface hover:preset-filled-surface-100-900 form-control" id="attend_phone_passcode" name="attend_phone_passcode" placeholder="Passcode to join conference call" value={$lq__event_obj?.attend_phone_passcode ?? ''} autocomplete="off">
</label>
{/if}
</fieldset>
<label for="attend_text" class="w-full">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Additional information on how to attend
</span>
<!-- <textarea class="ae_value event__attend_text tinymce_editor editor_less_100 textarea" id="attend_text" name="attend_text" placeholder="Additional information on how to attend or join the meeting" rows="2" cols="70" value={$lq__event_obj?.attend_text ?? ''}></textarea> -->
@@ -1201,7 +1511,7 @@ $effect(() => {
<!-- <legend class="legend">Recurring</legend> -->
<label for="recurring_pattern" class="form-group w-100 col-12">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Recurring Repeats
</span>
<select
@@ -1269,7 +1579,7 @@ $effect(() => {
<fieldset class="flex flex-row flex-wrap gap-1 items-center justify-start flex_row flex_gap_md flex_justify_around space-y-1">
<label class="form-group w-56">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Timezone
</span>
{#if $ae_loc?.lu_time_zone_list && $ae_loc?.lu_time_zone_list.length > 0}
@@ -1296,7 +1606,7 @@ $effect(() => {
<!-- client TZ: {$ae_loc?.current_timezone} -->
</label>
<label class="form-group">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Start Time
</span>
<input name="recurring_start_time"
@@ -1311,7 +1621,7 @@ $effect(() => {
/>
</label>
<label class="form-group">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
End Time
</span>
<input
@@ -1331,7 +1641,7 @@ $effect(() => {
{#if ( $ae_loc.administrator_access || $lq__event_obj && ($idaa_slct.event_obj?.show_recurring_text || ($lq__event_obj?.recurring_text && !$lq__event_obj?.recurring_text.includes('*gen*'))) )}
<p>Please only use the text box for additional information if the options above do not cover your needs. This may affect how this meeting shows up in search results.</p>
<label for="recurring_text" class="w-full">
<span class="text-lg font-semibold">
<span class="text-lg text-neutral-500 font-semibold">
Additional information on when and how often
</span>
<!-- <textarea class="ae_value event__recurring_text tinymce_editor editor_less_100 textarea" id="recurring_text" name="recurring_text" placeholder="Additional information on when and how often" value={$lq__event_obj?.recurring_text ?? ''}></textarea> -->
@@ -1375,6 +1685,7 @@ $effect(() => {
novi_btn
btn btn-sm
preset-filled-tertiary-200-800
transition
"
onclick={() => {
if (confirm('Are you sure you want to remove the text for the additional details?')) {
@@ -1396,6 +1707,7 @@ $effect(() => {
novi_btn
btn btn-sm
preset-filled-success-200-800
transition
"
onclick={preventDefault(() => {
// Remove *gen* prefix from recurring_text

View File

@@ -6,6 +6,7 @@ import { browser } from '$app/environment';
import { ae_util } from '$lib/ae_utils/ae_utils';
import { ae_snip, ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_stores';
import { idaa_loc, idaa_sess, idaa_slct, idaa_trig } from '$lib/ae_idaa_stores';
import MyClipboard from '$lib/e_app_clipboard.svelte';
export let lq__event_obj: any;
@@ -139,6 +140,54 @@ if ($idaa_slct.event_id) {
class:meeting_virtual={$lq__event_obj?.virtual}
class:hidden={!$lq__event_obj?.virtual}
>
<div
class="event__attend"
class:ae_d_none={!$lq__event_obj?.attend_json?.zoom?.full_url}
>
<span class="ae_label">
<span class="fas fa-video m-1"></span>
Zoom Meeting:
</span>
<span class="ae_value">
<!-- text-blue-800 hover:underline -->
<a
href="{$lq__event_obj?.attend_json?.zoom?.full_url}"
target="_blank"
class="
novi_btn btn-default
btn btn-sm
preset-outlined-tertiary-800-200
preset-filled-tertiary-200-800
hover:preset-filled-tertiary-600-400
transition
"
>
<span class="fas fa-link m-1"></span>
<!-- {$lq__event_obj?.attend_json?.zoom?.full_url} -->
Join: Zoom ID {$lq__event_obj?.attend_json?.zoom?.meeting_id}
{#if $lq__event_obj?.attend_json?.zoom?.passcode}
| Passcode: {$lq__event_obj?.attend_json?.zoom?.passcode}
{/if}
</a>
</span>
<MyClipboard
value={$lq__event_obj?.attend_json?.zoom?.full_url}
btn_text="Copy Zoom Link"
btn_title="Copy Zoom link to clipboard"
btn_class="
novi_btn
btn btn-sm
preset-outlined-tertiary-800-200
preset-filled-tertiary-200-800
hover:preset-filled-tertiary-600-400
transition
"
></MyClipboard>
</div>
{#if !$lq__event_obj?.attend_json?.zoom?.full_url || !$lq__event_obj?.attend_json?.zoom?.meeting_id}
<div class="meeting_attend_url"
class:hidden={!$lq__event_obj?.attend_url}
>
@@ -163,6 +212,7 @@ if ($idaa_slct.event_id) {
</span>
</span>
</div>
{/if}
<div class="meeting_attend_phone"
class:hidden={!$lq__event_obj?.attend_phone}
>

View File

@@ -28,6 +28,7 @@ import { ae_util } from '$lib/ae_utils/ae_utils';
import { core_func } from '$lib/ae_core/ae_core_functions';
import { ae_snip, ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_stores';
import { idaa_loc, idaa_sess, idaa_slct, idaa_trig } from '$lib/ae_idaa_stores';
import MyClipboard from '$lib/e_app_clipboard.svelte';
if (browser) {
@@ -228,6 +229,52 @@ function add_activity_log(
<span class="ae_value">{idaa_event_obj?.type}</span>
</div>
<div
class="event__attend"
class:ae_d_none={!idaa_event_obj?.attend_json?.zoom?.full_url}
>
<span class="ae_label">
<span class="fas fa-video m-1"></span>
Zoom Meeting:
</span>
<span class="ae_value">
<!-- text-blue-800 hover:underline -->
<a
href="{idaa_event_obj?.attend_json?.zoom?.full_url}"
target="_blank"
class="
novi_btn btn-default
btn btn-sm
preset-outlined-tertiary-800-200
preset-filled-tertiary-200-800
hover:preset-filled-tertiary-600-400
transition
"
>
<span class="fas fa-link m-1"></span>
<!-- {idaa_event_obj?.attend_json?.zoom?.full_url} -->
Join: Zoom ID {idaa_event_obj?.attend_json?.zoom?.meeting_id}
{#if idaa_event_obj?.attend_json?.zoom?.passcode}
| Passcode: {idaa_event_obj?.attend_json?.zoom?.passcode}
{/if}
</a>
</span>
<MyClipboard
value={idaa_event_obj?.attend_json?.zoom?.full_url}
btn_text="Copy Zoom Link"
btn_title="Copy Zoom link to clipboard"
btn_class="
novi_btn
btn btn-sm
preset-outlined-tertiary-800-200
preset-filled-tertiary-200-800
hover:preset-filled-tertiary-600-400
transition
"
></MyClipboard>
</div>
<div
class="ae_group event__timezone event__recurring_start_time"
>