This commit is contained in:
nnduc
2026-10-24 14:03:52 +07:00
commit 4fe046de58
4790 changed files with 311146 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
<section>
<h3>{{ __('account.clear') }}</h3>
<br />
<h4 class="gray">{{ __('account.clear_text') }}</h4>
<br />
<h4 class="gray">{{ __('account.clear_text_confirm') }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat"
onclick="Account_ajaxClearAccountConfirm(); Dialog_ajaxClear()">
{{ __('button.clear') }}
</button>
</footer>
@@ -0,0 +1,34 @@
<section>
<h3>{{ __('account.delete_bundle_title') }}</h3>
<br />
<h4 class="gray">{{ __('account.delete_bundle_text') }}</h4>
<br />
<ul class="list">
<li>
<span class="primary icon red">
<i class="material-symbols">fingerprint</i>
</span>
<div>
<p>
<span class="fingerprint">
{{ fingerprint.fingerprint }}
</span>
</p>
</div>
</li>
</ul>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat color red"
onclick="Account.deleteBundleConfirm({{ fingerprint.bundleid }}); Dialog_ajaxClear()">
{{ __('button.destroy') }}
</button>
</footer>
@@ -0,0 +1,33 @@
{% if fingerprints %}
<ul class="list middle">
<li class="subheader">
<div>
<p>{{ __('omemo.fingerprints') }}</p>
</div>
</li>
{% for value in fingerprints %}
<li>
<span class="primary icon {% if value.self %}green{% else %}gray{% endif %}">
<i class="material-symbols">fingerprint</i>
</span>
{% if not value.self %}
<span class="control icon active gray divided" onclick="Account.deleteBundle('{{ value.bundleid }}')">
<i class="material-symbols">delete</i>
</span>
<span class="control">
<div class="checkbox">
<input type="checkbox" data-identifier="{{ value.jid }}.{{ value.bundleid }}"
id="accountsessionstate_{{ value.bundleid }}" name="accountsessionstate_{{ value.bundleid }}"
onchange="Account.toggleFingerprintState(this)"/>
<label for="accountsessionstate_{{ value.bundleid }}"></label>
</div>
</span>
{% endif %}
<div>
<p><span class="fingerprint" title="{{ value.bundleid }}">{{ value.fingerprint }}</span></p>
<p class="line">{{ value.bundleid }}{% if value.self %} • {{ __('omemo.this_device') }}{% endif %}</p>
</div>
</li>
{% endfor %}
</ul>
{% endif %}
+26
View File
@@ -0,0 +1,26 @@
<section>
<h3>{{ __('account.password_change_title') }}</h3>
<br />
<form name="password">
<div>
<input type="password" placeholder="Choose a nice password" name="password"/>
<label>{{ __('account.password') }}</label>
</div>
<div>
<input type="password" placeholder="Type your password again" name="password_confirmation"/>
<label>{{ __('account.password_confirmation') }}</label>
</div>
</form>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<a id="password_save" onclick="
Account_ajaxChangePasswordConfirm(MovimUtils.formToJson('password'));
this.className='button flat inactive';" class="button flat color oppose">
{{ __('button.save') }}
</a>
</footer>
+18
View File
@@ -0,0 +1,18 @@
<ul class="list middle">
<li class="subheader">
<div>
<p>{{ __('clients.title_full') }}</p>
</div>
</li>
{% for value in presences %}
<li>
<span class="primary icon gray status {{ value.presence }}">
<i class="material-symbols">devices</i>
</span>
<div>
<p class="line">{% if value.name %}{{ value.name }}{% else %}{{ value.resource }}{% endif %}{% if value.current %} <span class="tag color green">{{ __('clients.this_device') }}</span>{% endif %}</p>
<p class="line">{{ value.resource }}</p>
</div>
</li>
{% endfor %}
</ul>
+26
View File
@@ -0,0 +1,26 @@
<section>
<h3>{{ __('account.delete') }}</h3>
<br />
<h4 class="gray">{{ __('account.delete_text') }}</h4>
<br />
<h4 class="gray"></h4>
<form name="confirmdelete">
<div>
<input name="jid" placeholder="username@server.com" type="text" required>
<label>{{ __('account.delete_text_confirm') }}</label>
</div>
</form>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat color red"
onclick="Account_ajaxRemoveAccountConfirm(MovimUtils.formToJson('confirmdelete')); Dialog_ajaxClear()">
{{ __('button.delete') }}
</button>
</footer>
+50
View File
@@ -0,0 +1,50 @@
<div class="tabelem" title="{{ __('account.title') }}" data-mobileicon="account_circle" id="account_widget">
<div id="account_presences"></div>
{% if omemo %}<div id="account_fingerprints"></div>{% endif %}
<ul class="list active">
<li class="subheader">
<div>
<p>{{ __('account.account_management') }}</p>
</div>
</li>
<li onclick="Account_ajaxChangePassword()">
<span class="primary icon">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">vpn_key</i>
</a>
</span>
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('account.password_change_title') }}</p>
</div>
</li>
<li onclick="Account_ajaxClearAccount()">
<span class="primary icon orange">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">eject</i>
</a>
</span>
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('account.clear') }}</p>
</div>
</li>
<li onclick="Account_ajaxRemoveAccount()">
<span class="primary icon red">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">delete</i>
</a>
</span>
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('account.delete') }}</p>
</div>
</li>
</ul>
</div>
+14
View File
@@ -0,0 +1,14 @@
<header class="big top color {{ me.color }}" style="background-image: url({{ me.picture }})">
<ul class="list thick">
<li class="block">
<span class="primary icon bubble color {{ me.color }}" style="background-image: url({{ me.picture }})">
</span>
<div>
<a class="button color transparent active" onclick="Avatar_ajaxGetForm()" title="{{ __('avatar.change') }}">
<i class="material-symbols">person_edit</i>
</a>
</div>
</li>
</ul>
<br />
</header>
+31
View File
@@ -0,0 +1,31 @@
<section class="scroll">
<form name="avatarform">
<img class="avatar" src="{{ me.picture }}">
<div class="placeholder">
<i class="material-symbols">image</i>
<h1>{{ __('avatar.missing') }}</h1>
</div>
<input type="hidden" name="photobin"/>
</form>
<ul class="list thick divided">
<li>
<span class="primary icon bubble color green">
<i class="material-symbols">attach_file</i>
</span>
<div>
<p>{{ __('avatar.file') }}</p>
<p><input type="file" onchange="MovimAvatar.file(this.files, 'avatarform');"></p>
</div>
</li>
</ul>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.close') }}
</button>
<button type="button"
onclick="Avatar_ajaxSubmit(MovimUtils.formToJson('avatarform')); this.className='button flat inactive';"
class="button flat">
{{ __('button.submit') }}
</button>
</footer>
+10
View File
@@ -0,0 +1,10 @@
{% for value in list %}<li class="block" id="blocked-{{ value|cleanupId }}">
<span class="control icon active divided" onclick="Blocked_ajaxUnblock('{{ value|echapJS }}')">
<i class="material-symbols">close</i>
</span>
<div>
<p class="line">
{{ value }}
</p>
</div>
</li>{% endfor %}
+18
View File
@@ -0,0 +1,18 @@
<div class="tabelem" title="{{ __('blocked.title') }}" data-mobileicon="block" id="blocked_widget">
<ul class="list thick">
<li>
<span class="primary icon gray">
<i class="material-symbols">info</i>
</span>
<div>
<p class="line">{{ __('blocked.info') }}</p>
<p>{{ __('blocked.info2') }}</p>
</div>
</li>
</ul>
<ul class="list card thin flex shadow" id="blocked_widget_list"></ul>
<div class="placeholder">
<i class="material-symbols">block</i>
<h4>{{ __('blocked.placeholder') }}</h4>
</div>
</div>
@@ -0,0 +1,7 @@
<span
onclick="Presence_ajaxHttpMenu()"
class="primary icon bubble status {{ presence }}">
<a href="#" onclick="listIconClick(event)">
<img src="{{ picture }}">
</a>
</span>
@@ -0,0 +1,36 @@
<ul aria-label="{{ __('global.bottom_menu') }}" id="bottomnavigation" class="navigation active">
<li onclick="{% if page == 'chat' %}Rooms.toggleScroll(){% else %}MovimUtils.reload('{{ route('chat') }}'){% endif %}"
{% if page == 'chat' %}class="active"{% endif %}
title="{{ __('page.chats') }}"
>
<span class="primary icon bubble" id="bottomchatcounter">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">chat_bubble</i>
</a>
</span>
</li>
<li onclick="Search_ajaxRequest()"
title="{{ __('button.search') }}"
>
<span class="primary icon">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">search</i>
</a>
</span>
</li>
<li onclick="Notifications_ajaxRequest()"
title="{{ __('notifs.title') }}"
>
<span class="primary icon">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">notifications</i>
<span class="counter notifications"></span>
</a>
</span>
</li>
<li id="bottomnavigation_me" onclick="Presence_ajaxHttpMenu()">
<span class="primary icon bubble">
<img src="{{ picture }}">
</span>
</li>
</ul>
+140
View File
@@ -0,0 +1,140 @@
{% if muc %}
<nav class="spin" id="{{ jid|cleanupId }}-nav"></nav>
<div id="chat_conference_call" class="spin"></div>
{% endif %}
<header id="{{ jid|cleanupId }}-header">
{{ header|safe }}
</header>
<div id="{{ jid|cleanupId }}-discussion" class="contained {% if muc %}muc{% endif %}">
<section id="{{ jid|cleanupId }}-messages">
<div class="placeholder first_messages">
<i class="material-symbols fill">waving_hand</i>
<h1>{{ __('chat.first_messages_title') }}</h1>
{% if not muc %}
<h4 style="margin-bottom: 1rem;">{{ __('chat.first_messages_text') }}</h4>
<h4>
<button class="button color" onclick="Notifications_ajaxAddAsk('{{ jid|echapJS }}')">
<i class="material-symbols">add</i> {{ __('chat.first_messages_add') }}
</button>
<button class="button flat" onclick="ChatActions_ajaxBlock('{{ jid|echapJS }}'); Notifications_ajaxRefuse('{{ jid|echapJS }}');">
{{ __('chat.first_messages_block') }}
</button>
</h4>
{% endif %}
</div>
<ul class="list spin conversation" id="{{ jid|cleanupId }}-conversation"></ul>
<ul class="list state" id="{{ jid|cleanupId }}-state"></ul>
<div class="placeholder empty">
<i class="material-symbols fill">chat</i>
<h1>{{ __('chat.new_title') }}</h1>
<h4>{{ __('chat.new_text') }}</h4>
<h4>{{ __('message.edit_help') }}</h4>
<h4>{{ __('message.emoji_help') }}</h4>
</div>
</section>
</div>
<div class="chat_box {% if visitor %}disabled{% endif %}">
<button id="scroll_now" class="button action color small" onclick="Chat_ajaxClearAndGetMessages('{{ jid|echapJS }}', {% if muc %}true{% endif %})">
<i class="material-symbols">clock_arrow_down</i>
</button>
<button id="scroll_down" class="button action color transparent small" onclick="Chat.scrollTotally()">
<i class="material-symbols">expand_more</i>
</button>
<ul class="list fill">
<div id="reply"></div>
<ul class="list middle" id="embed"></ul>
<div id="dictaphone"></div>
<li class="emojis"></li>
<li class="main">
<span class="primary icon gray active"
title="{{ __('emojisconfig.title') }}"
onclick="Stickers_ajaxReaction(null)">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">emoji_emotions</i>
</a>
</span>
{% if upload %}
<span class="emojis control icon gray active"
id="dictaphone_toggle"
title="{{ __('dictaphone.name') }}"
onclick="Dictaphone.toggle()">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">mic</i>
</a>
</span>
<span class="attach control icon" onclick="Chat.toggleAttach()">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">add_circle</i>
</a>
</span>
<ul class="list active actions">
<li onclick="Chat.toggleAttach(); Snap.init()">
<span class="control icon gray">
<i class="material-symbols">camera_alt</i>
</span>
<div>
<p class="line">Snap</p>
</div>
</li>
<li onclick="Chat.toggleAttach(); Draw_ajaxHttpGet()">
<span class="control icon gray">
<i class="material-symbols">gesture</i>
</span>
<div>
<p class="line">{{ __('draw.title') }}</p>
</div>
</li>
<li onclick="Chat.toggleAttach(); Upload_ajaxGetPanel()">
<span class="control icon gray">
<i class="material-symbols">attach_file</i>
</span>
<div>
<p class="line">{{ __('upload.title') }}</p>
</div>
</li>
</ul>
{% endif %}
<span title="{{ __('button.submit') }}"
class="send control icon gray"
onclick="Chat.sendMessage()">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">send</i>
</a>
</span>
<form>
<div>
<textarea
dir="auto"
rows="1"
id="chat_textarea"
data-jid="{{ jid }}"
data-muc="{% if muc %}true{% endif %}"
data-muc-group="{% if group %}true{% endif %}"
{% if visitor %}
placeholder="{{ __('message.visitor_help') }}"
{% elif rand == 1 %}
placeholder="{{ __('message.emoji_help') }}"
{% else %}
placeholder="{{ __('chat.placeholder') }}"
{% endif %}
{% if visitor %}disabled{% endif %}
></textarea>
<span class="control icon encrypted" title="{{ __('omemo.encrypted') }}"
onclick="ChatOmemo.disableContactState('{{ jid|echapJS }}', {% if muc %}true{% else %}false{% endif %})">
<i class="material-symbols fill">lock</i>
</span>
<span class="control icon encrypted_disabled" title="{{ __('omemo.encrypted_disabled') }}"
onclick="ChatOmemo.enableContactState('{{ jid|echapJS }}', {% if muc %}true{% else %}false{% endif %})">
<i class="material-symbols">no_encryption</i>
</span>
<span class="control icon encrypted_loading" title="{{ __('omemo.encrypted_loading') }}"
onclick="ChatOmemo.disableContactState('{{ jid|echapJS }}', {% if muc %}true{% else %}false{% endif %})">
<i class="material-symbols">lock_clock</i>
</span>
</div>
</form>
</li>
</ul>
</div>
+28
View File
@@ -0,0 +1,28 @@
<li {% if mine %}class="oppose"{% endif %}>
{% if muc %}
<span class="primary icon bubble" onclick="Chat.quoteMUC(this.dataset.resource, true);"></span>
<span class="control icon bubble"></span>
{% else %}
<span class="primary icon bubble">
{% if not mine %}
<a href="#" onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
{% endif %}
<img src="{{ contact.picture }}" data-name="{{ contact.truename }}">
{% if not mine %}</a>{% endif %}
</span>
{% endif %}
<div class="bubble">
<div class="message">
<p></p>
<ul class="reactions"></ul>
<span class="info"></span>
<span class="reaction" title="{{ __('message.react') }}">
<i class="material-symbols">add_reaction</i>
</span>
<span class="reply">
<i class="material-symbols">reply</i>
</span>
</div>
</div>
</li>
+16
View File
@@ -0,0 +1,16 @@
<section>
<h3>{{ __('chat.clear_history') }}</h3>
<br />
<h4 class="gray">{{ __('chat.clear_history_text', count) }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button color red"
onclick="Chat_ajaxClearHistoryConfirm('{{ jid|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.delete') }}
</button>
</footer>
+15
View File
@@ -0,0 +1,15 @@
<li>
<span class="primary icon bubble color transparent">
{% if not list %}
<img src="{{ contact.picture }}">
{% else %}
<i class="material-symbols tiny">edit</i>
{% endif %}
</span>
<div class="bubble">
<div class="message" title="{{ __('message.composing') }}">
<span class="dots"></span>
<p>{% if list %}{{ list }}{% endif %}</p>
</div>
</div>
</li>
+5
View File
@@ -0,0 +1,5 @@
<li class="date">
<div>
<p>Date</p>
</div>
</li>
+54
View File
@@ -0,0 +1,54 @@
<li class="block">
{% if image %}
<span class="primary icon thumb active color {{ color }}"
onclick="event.stopPropagation(); Preview_ajaxHttpShow('{{ url.image|echapJS }}')"
style="background-image: url({{ image }})">
<i class="material-symbols">image</i>
</span>
{% else %}
<span class="primary icon bubble gray">
{% if icon %}
<img src="{{ icon }}" onerror="this.remove()"/>
{% else %}
<i class="material-symbols">link</i>
{% endif %}
</span>
{% endif %}
<span class="control icon gray active" onclick="event.stopPropagation(); MovimUtils.openInNew('{{ url.url|echapJS }}')">
<i class="material-symbols">open_in_new</i>
</span>
<div>
{% if url.type == 'video' or url.type == 'audio' %}
<p class="line">
{% if url.type == 'audio' %}
<i class="material-symbols">equalizer</i> {{ __('chats.audio') }}
{% else %}
<i class="material-symbols">local_movies</i> {{ __('chats.video') }}
{% endif %}
{% if size %}
<span class="second">•</span>
<span class="second">{{ size }}</span>
{% endif %}
</p>
{% elif url.title %}
<p class="line two" title="{{ url.title }}">
{{ url.title }}
</p>
{% endif %}
<p class="line two" title="{% if url.description %}{{ url.description }}{% endif %}">
{% if url.provider_name %}
{{ url.provider_name }}
{% endif %}
{% if url.author_name %}
<span class="second">•</span>
<span class="second">{{ url.author_name }}</span>
{% endif %}
{% if url.description %}
<span class="second">•</span>
<span class="second">{{ url.description }}</span>
{% endif %}
</p>
</div>
</li>
+40
View File
@@ -0,0 +1,40 @@
<div class="placeholder" aria-hidden="true">
<i class="material-symbols fill">forum</i>
</div>
<div id="chat_frequent" aria-label="{{ __('chat.frequent') }}">
<ul class="list flex fifth card shadow compact middle active">
{% if top %}
<li class="subheader">
<div>
<p>{{ __('chat.frequent') }}</p>
</div>
</li>
{% for value in top %}
<li class="block"
onclick="Search.chat('{{ value.jid|echapJS }}', false)">
<img class="main" src="{{ value.picture }}">
<span class="primary icon bubble {% if value.presence %}status {{ value.presence }}{% endif %}">
<a href="#" onclick="listIconClick(event)">
<img src="{{ value.picture }}">
</a>
</span>
<div>
<p class="line" title="{{ value.truename }}">
{{ value.truename }}
</p>
{% if value.status %}
<p class="line">{{ value.status }}</p>
{% else %}
<p class="line">{{ value.jid }}</p>
{% endif %}
</div>
</li>
{% endfor %}
{% endif %}
</ul>
</div>
<br aria-hidden="true"/>
<br aria-hidden="true"/>
+11
View File
@@ -0,0 +1,11 @@
<li class="block">
<span class="primary icon bubble gray">
<i class="material-symbols fill">{{ file.type|mimeToIcon }}</i>
</span>
<div>
<p class="line"><a href="{{ file.url }}" target="_blank" rel="noopener noreferrer">{{ file.name }}</a></p>
{% if file.cleansize %}
<p>{{ file.cleansize }} · {{ file.type|mimeToLabel }}</p>
{% endif %}
</div>
</li>
+305
View File
@@ -0,0 +1,305 @@
{% if muc %}
<ul class="list middle">
<li>
<span class="primary icon active on_mobile_after"
id="chatheadercounter" onclick="Chat.get()"
{% if counter > 0 %}data-counter="{{ counter }}"{% endif %}>
<i class="material-symbols">arrow_back</i>
</span>
<span class="primary icon bubble active {% if not conference.connected %}disabled{% endif %}"
onclick="RoomsUtils_ajaxGetDrawer('{{ jid|echapJS }}')">
<img src="{{ conference.picture }}">
{% if conference.connected %}
<span class="counter alt" {% if conference.group or conference.count < 10 %}data-mucreceipts="true"{% endif %}>
{% if conference.count > 99 %}99+{% else %}{{ conference.count }}{% endif %}
</span>
{% endif %}
</span>
<span class="control icon active" onclick="ChatActions_ajaxShowSearchDialog('{{ jid|echapJS }}', true)">
<i class="material-symbols">manage_search</i>
</span>
{% if conference.group and conference.connected and conference.muji.count == 0 %}
<span class="control icon active divided {% if in_call %}disabled{% endif %}" onclick="Visio_ajaxGetMujiLobby('{{ jid|echapJS }}', true, false);">
<i class="material-symbols">call</i>
</span>
<span class="control icon active {% if in_call %}disabled{% endif %}" onclick="Visio_ajaxGetMujiLobby('{{ jid|echapJS }}', true, true);">
<i class="material-symbols">videocam</i>
</span>
{% endif %}
<span
class="control icon show_context_menu active {% if not conference.connected %}disabled{% endif %}"
onclick="MovimTpl.showContextMenu()">
<i class="material-symbols">more_vert</i>
</span>
<div>
{% if conference.muji.count > 0 %}
{% if conference.muji.joined %}
<button class="button oppose color red"
onclick="Visio_ajaxLeaveMuji('{{ jid|echapJS }}'); this.classList.add('disabled')">
<i class="material-symbols blink">call_end</i>
</button>
{% else %}
<button class="button oppose color blue {% if in_call %}disabled{% endif %}"
onclick="Visio_ajaxJoinMuji('{{ jid|echapJS }}', {% if conference.muji.video %}true{% else %}false{% endif %});">
<i class="material-symbols">call</i> {{ conference.muji.count }}
</button>
{% endif %}
{% endif %}
<p title="{{ jid }}" class="line active" onclick="RoomsUtils_ajaxGetDrawer('{{ jid|echapJS }}')">
{{ conference.title }}
{% if conference.notify == 0 %}
<span class="second" title="{{ __('room.notify_never') }}">
<i class="material-symbols">notifications_off</i>
</span>
{% elif conference.notify == 2 %}
<span class="second" title="{{ __('room.notify_always') }}">
<i class="material-symbols">notifications_active</i>
</span>
{% endif %}
<span class="second">
{% if conference.group %}
<i class="material-symbols">people_alt</i>
{% else %}
<i class="material-symbols">wifi_tethering</i>
{% endif %}
</span>
{% if conference.group and conference.subject %}
<span class="second" title="{{ conference.subject }}">
{{ conference.subject }}
</span>
{% endif %}
</p>
<p class="line active">
{% if conference.muji.count > 0 %}
{% if conference.muji.joined %}
<i class="material-symbols icon green blink">call</i>
{{ __('visio.joined_call') }}
{% else %}
<i class="material-symbols icon blue blink">call</i>
{{ __('visio.in_call') }}
{% endif %}
<span class="second">
<i class="material-symbols">schedule</i>
{{ conference.muji.since }}
-
{{ conference.muji.count }}
<i class="material-symbols">people</i>
</span>
•
{% endif %}
{% if not conference.connected %}
{{ __('button.connecting') }}…
{% elif conference.group %}
{% for value in conference.others %}
<span onclick="Chat.quoteMUC('{{ value.nick|echapJS }}', true);" class="icon bubble tiny">
<img src="{{ value.picture }}">
</span><span onclick="Chat.quoteMUC('{{ value.nick|echapJS }}', true);">{{ value.nick }}</span>
{% endfor %}
{% elif conference.subject %}
<span onclick="RoomsUtils_ajaxGetDrawer('{{ jid|echapJS }}')">{{ conference.subject }}</span>
{% endif %}
</p>
</div>
</li>
</ul>
<ul class="list context_menu thin active">
{% if conference.role == 'moderator' or conference.affiliation == 'owner' %}
<li class="subheader">
<div>
<p class="line">{{ __('page.administration') }}</p>
</div>
</li>
{% endif %}
{% if conference.affiliation == 'owner' %}
<li onclick="RoomsUtils_ajaxGetConfig('{{ jid|echapJS }}')">
<span class="primary icon gray">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">settings</i>
</a>
</span>
<div>
<p>{{ __('chatrooms.config') }}</p>
</div>
</li>
{% endif %}
{% if conference.role == 'moderator' %}
<li onclick="RoomsUtils_ajaxGetSubject('{{ jid|echapJS }}')">
<span class="primary icon gray">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">short_text</i>
</a>
</span>
<div>
<p>{{ __('chatrooms.subject') }}</p>
</div>
</li>
{% endif %}
{% if conference.role == 'moderator' or conference.affiliation == 'owner' %}
<hr />
{% endif %}
<li onclick="RoomsUtils_ajaxAdd('{{ jid|echapJS }}');">
<span class="primary icon gray">
<i class="material-symbols">edit</i>
</span>
<div>
<p>{{ __('button.edit') }}</p>
</div>
</li>
<li onclick="RoomsUtils_ajaxAskInvite('{{ jid|echapJS }}');">
<span class="primary icon gray">
<i class="material-symbols">person_add</i>
</span>
<div>
<p>{{ __('room.invite') }}</p>
</div>
</li>
<li onclick="Chat_ajaxClearHistory('{{ jid|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">delete_sweep</i>
</span>
<div>
<p class="line">{{ __('chat.clear_history') }}</p>
</div>
</li>
<li onclick="Rooms_ajaxExit('{{ jid|echapJS }}');">
<span class="primary icon gray">
<i class="material-symbols">logout</i>
</span>
<div>
<p>{{ __('status.disconnect') }}</p>
</div>
</li>
</ul>
{% else %}
<ul class="list middle">
<li id="chat_header">
<span class="primary icon active on_mobile_after" id="chatheadercounter" onclick="Chat.get()"
{% if counter > 0 %}data-counter="{{ counter }}"{% endif %}>
<i class="material-symbols">arrow_back</i>
</span>
<span class="primary icon bubble active {% if contact.presence %}status {{ contact.presence }}{% endif %}"
onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
<img src="{{ contact.picture }}">
</span>
<span class="control icon active" onclick="ChatActions_ajaxShowSearchDialog('{{ jid|echapJS }}')">
<i class="material-symbols">manage_search</i>
</span>
{% if not in_call %}
{% if call_audio %}
<span title="{{ __('button.audio_call') }}" class="control icon active divided"
onclick="Visio_ajaxGetLobby('{{ call_audio|echapJS }}', true);">
<i class="material-symbols">phone</i>
</span>
{% endif %}
{% if call_video %}
<span title="{{ __('button.video_call') }}" class="control icon active"
onclick="Visio_ajaxGetLobby('{{ call_video|echapJS }}', true, true);">
<i class="material-symbols">videocam</i>
</span>
{% endif %}
{% endif %}
<span class="control icon show_context_menu active"
onclick="MovimTpl.showContextMenu()">
<i class="material-symbols">more_vert</i>
</span>
<div>
{% if in_call %}
<button class="button oppose color red" onclick="Visio_ajaxRemoteGoodbye()">
<i class="material-symbols icon">call_end</i>
</button>
{% endif %}
<p class="line active" onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
{{ contact.truename }}
{% if contact.blocked %}
<span class="tag color red">{{ __('blocked.title') }}</span>
{% endif %}
{% if omemo %}
<span class="second"><i class="material-symbols">lock</i></span>
{% endif %}
</p>
<p class="line active" onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
{% if in_call %}
<i class="material-symbols icon green blink">phone_in_talk</i>
{{ __('visio.in_call') }} •
{% endif %}
{% if contact.seen %}
{{ __('last.title') }} {{ contact.seen }}
{% elif contact.status %}
{{ contact.status }}
{% elif contact.presence %}
{{ presencetext }}
{% else %}
{{ contact.id }}
{% endif %}
</p>
</div>
</li>
</ul>
<ul class="list context_menu active">
<li onclick="ChatActions_ajaxGetContact('{{ contact.id|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">person</i>
</span>
<div>
<p class="line">{{ __('chat.profile') }}</p>
</div>
</li>
<li onclick="Chat_ajaxClearHistory('{{ contact.id|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">delete_sweep</i>
</span>
<div>
<p class="line">{{ __('chat.clear_history') }}</p>
</div>
</li>
<hr />
{% if contact.blocked %}
<li onclick="ChatActions_ajaxUnblock('{{ contact.id|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">check_circle</i>
</span>
<div>
<p class="line">{{ __('blocked.unblock_account') }}</p>
</div>
</li>
{% else %}
<li onclick="ChatActions_ajaxBlock('{{ contact.id|echapJS }}'); Notifications_ajaxRefuse('{{ contact.id|echapJS }}');">
<span class="primary icon gray">
<i class="material-symbols">block</i>
</span>
<div>
<p class="line">{{ __('blocked.block_account') }}</p>
</div>
</li>
{% endif %}
<li onclick="Chats_ajaxClose('{{ jid|echapJS }}', true);">
<span class="primary icon gray">
<i class="material-symbols">close</i>
</span>
<div>
<p class="line">{{ __('button.close') }}</p>
</div>
</li>
</ul>
{% endif %}
+1
View File
@@ -0,0 +1 @@
<i class="material-symbols">outgoing_mail</i> {{ __('message.invitation') }} <a href="#" onclick="Chat.getRoom('{{ room|echapJS }}')">{{ room }}</a>{% if reason %} — {{ reason }}{% endif %}
+7
View File
@@ -0,0 +1,7 @@
{% if type == 'jingle_incoming' %}<i class="material-symbols icon green">call_received</i> {{ __('chat.jingle_incoming') }}
{% elif type == 'jingle_outgoing' %}<i class="material-symbols icon blue">call_made</i> {{ __('chat.jingle_outgoing') }}
{% elif type == 'jingle_reject' %}<i class="material-symbols icon orange">phone_missed</i> {{ __('chat.jingle_reject') }}
{% elif type == 'jingle_retract' %}<i class="material-symbols icon gray">phone_missed</i> {{ __('chat.jingle_retract') }}
{% elif type == 'jingle_finish' %}<i class="material-symbols icon red">phone_disabled</i> {{ __('chat.jingle_end') }}
{% else %}<i class="material-symbols icon red">call_end</i> {{ __('chat.jingle_end') }}{% if duration %} • {{ duration }}{% endif %}
{% endif %}
+14
View File
@@ -0,0 +1,14 @@
{% for r in reactions %}
<li {% if muc %}title="{{ r.from|implodeCsv }}"{% endif %}
{% if r.mine %}class="reacted"{% endif %}
onclick="Chat_ajaxHttpDaemonSendReaction('{{ mid }}', '{{ r.emoji|echapJS }}')">
{{ r.emoji|addEmojis(true) }}
{{ r.from|length }}
</li>
{% endfor %}
{% if reactions %}
<li onclick="Stickers_ajaxReaction('{{ mid }}')" title="{{ __('message.react') }}">
<i class="material-symbols">add_reaction</i>
</li>
{% endif %}
+38
View File
@@ -0,0 +1,38 @@
<div data-mid="{{ message.mid }}">
<ul class="list">
<li>
<span class="primary icon">
<i class="material-symbols">reply</i>
</span>
<span class="control icon active toggleable" onclick="Chat_ajaxClearReply()">
<i class="material-symbols">close</i>
</span>
<div class="parent">
{% if message.type == 'groupchat' %}
<p class="line from">
<span class="resource {{ color }}">{{ message.resource }}</span>
</p>
{% else %}
<p class="line from">{{ from_name }}</p>
{% endif %}
{% if file %}
<p class="line">
{% if file.picture %}
<i class="material-symbols">image</i> {{ __('chats.picture') }}
{% elif file.audio %}
<i class="material-symbols">equalizer</i> {{ __('chats.audio') }}
{% elif file.video %}
<i class="material-symbols">local_movies</i> {{ __('chats.video') }}
{% else %}
<i class="material-symbols">insert_drive_file</i> {{ __('avatar.file') }}
{% endif %}
</p>
{% elif message.encrypted %}
<p class="line"><i class="material-symbols">lock</i> {{ __('message.encrypted') }}</p>
{% else %}
<p class="line">{{ message.body }}</p>
{% endif %}
</div>
</li>
</ul>
</div>
+12
View File
@@ -0,0 +1,12 @@
<ul class="list thin active" id="room_nav_members">
{{ contactsHtml|safe }}
</ul>
<ul class="list thin" id="room_nav_members_search">
<li class="search">
<form name="search" onsubmit="return false;">
<div>
<input name="keyword" autocomplete="off" oninput="Chat.searchMembers(this.value)" type="text">
</div>
</form>
</li>
</ul>
+1
View File
@@ -0,0 +1 @@
<li class="separator"></li>
+1
View File
@@ -0,0 +1 @@
<div id="chat_widget" class="spin"></div>
@@ -0,0 +1,23 @@
<li {% if mine %}class="oppose"{% endif %}
onclick="Chat_ajaxGetMessageContext('{{ jid|echapJS }}', {{ message.mid }}); Drawer.clear()">
<div class="bubble {% if picture %}file{% endif %}"
data-publishedprepared="{{ date }}">
<div class="message">
{% if muc %}
<span class="resource {{ color }}">{{ message.resource }}</span>
{% endif %}
{% if message.encrypted %}
<p class="encrypted">{% if message.retracted %}{{ __('message.retracted') }}{% else %}{{ __('message.encrypted') }}{% endif %} <i class="material-symbols fill">lock</i></p>
{% elif message.retracted %}
<p class="retracted">{{ __('message.retracted') }} <i class="material-symbols">delete</i></p>
{% elif picture %}
<div class="file">
<img src="{{ picture }}">
</div>
{% else %}
<p>{{ body|safe }}</p>
{% endif %}
<span class="info"></span>
</div>
</div>
</li>
@@ -0,0 +1,84 @@
<section id="chat_actions">
<ul class="list" id="message_preview">
{{ preview|safe }}
{% if reactions %}
<li class="reactions">
<div>
<p class="all">{% for r in reactions %}<a class="chip" href="#" title="{{ r.from|implodeCsv }}">{{ r.emoji|addEmojis(true) }}{{ r.from|implodeCsv }}</a>{% endfor %}</p>
</div>
</li>
{% endif %}
</ul>
<ul class="list divided active middle">
{% if not message.encrypted %}
<li onclick="Stickers_ajaxReaction({{ message.mid }}); Dialog_ajaxClear()">
<span class="primary icon gray">
<i class="material-symbols">add_reaction</i>
</span>
<div>
<p>{{ __('message.react') }}</p>
</div>
</li>
<li
onclick="MovimUtils.copyToClipboard(MovimUtils.decodeHTMLEntities(ChatActions.message.body)); ChatActions_ajaxCopiedMessageText(); Dialog_ajaxClear()">
<span class="primary icon gray">
<i class="material-symbols">content_copy</i>
</span>
<div>
<p>{{ __('chatactions.copy_text') }}</p>
</div>
</li>
{% endif %}
<li onclick="Chat_ajaxHttpDaemonReply({{ message.mid }}); Dialog_ajaxClear()">
<span class="primary icon gray">
<i class="material-symbols">reply</i>
</span>
<div>
<p>{{ __('button.reply') }}</p>
</div>
</li>
{% if editable %}
<li onclick="Chat_ajaxEdit({{ message.mid }}); Dialog_ajaxClear();">
<span class="primary icon gray">
<i class="material-symbols">edit</i>
</span>
<div>
<p>{{ __('button.edit') }}</p>
</div>
</li>
{% endif %}
{% if mine %}
<li onclick="ChatActions_ajaxHttpDaemonRetract({{ message.mid }})">
<span class="primary icon gray">
<i class="material-symbols">delete</i>
</span>
<div>
<p>{{ __('message.retract') }}</p>
</div>
</li>
{% endif %}
{% if moderator %}
<li class="subheader">
<div>
<p>{{ __('page.administration') }}</p>
</div>
</li>
<li onclick="ChatActions_ajaxHttpDaemonModerate({{ message.mid }})">
<span class="primary icon gray">
<i class="material-symbols">delete</i>
</span>
<div>
<p>{{ __('message.retract') }}</p>
</div>
</li>
{% endif %}
</ul>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.close') }}
</button>
</footer>
@@ -0,0 +1,13 @@
<section id="chat_search">
{{ placeholder|safe }}
</section>
<ul class="list">
<li class="search">
<form name="search" onsubmit="return false;">
<div>
<input name="keyword" autocomplete="off"
placeholder="{{ __('button.search') }}" oninput="ChatActions_ajaxSearchMessages('{{ jid|echapJS }}', this.value, {% if muc %}true{% else %}false{% endif %});" type="text">
</div>
</form>
</li>
</ul>
@@ -0,0 +1,5 @@
<div class="placeholder">
<i class="material-symbols">search</i>
<h1>{{ __('chatactions.search_messages') }}</h1>
<h4>{{ __('input.open_me_using') }} <span class="chip outline">Ctrl</span> + <span class="chip outline">F</span></h4>
</div>
@@ -0,0 +1,13 @@
{% if not messages %}
<div class="placeholder">
<i class="material-symbols">search_off</i>
<h1>{{ __('chatactions.search_messages') }}</h1>
<h4>{{ __('chatactions.search_messages_empty') }}</h4>
</div>
{% else %}
<ul class="list active divided" id="message_preview">
{% for m in messages %}
{{ m|safe }}
{% endfor %}
</ul>
{% endif %}
+93
View File
@@ -0,0 +1,93 @@
<li
id="{{ contact.id|slugify|cleanupId }}-chat-item"
data-jid="{{ contact.id }}"
class="{% if contact.in_roster %}roster{% if not contact.presence %} faded{% endif %}{% endif %}"
title="{{ contact.id }}{% if message %} • {{ message.date_full }}{% endif %}">
<span class="primary icon bubble {% if contact.presence %}status {{ contact.presence }}{% endif %} {% if composing %}composing{% endif %}"
{% if count > 0 %}data-counter="{{ count }}"{% endif %}>
<a href="#" onclick="listIconClick(event);" title="{{ contact.truename }}">
<img alt="" src="{{ contact.picture }}">
</a>
</span>
<div>
<p class="line">
{% if message %}
<span class="info">
{{ message.date }}
</span>
<span class="info" title="{{ message.date_full }}">
{% if message.mine %}
{% if message.displayed %}
<span class="material-symbols">done_all</span>
{% elif message.delivered %}
<span class="material-symbols">check</span>
{% endif %}
&nbsp;
{% endif %}
</span>
{% endif %}
{% if resource %}
{{ resource }}
<span class="second" title="{{ bare }}">
{{ bare }}
</span>
{% else %}
{{ contact.truename }}
{% endif %}
</p>
{% if message %}
<p class="line">
{% if in_call %}
<i class="material-symbols icon green blink">phone_in_talk</i>
{{ __('visio.in_call') }} •
{% endif %}
{% if message.encrypted %}
<i class="material-symbols fill">lock</i> {% if message.retracted %}{{ __('message.retracted') }}{% else %}{{ __('message.encrypted') }}{% endif %}
{% elif message.retracted %}
<i class="material-symbols">delete</i> {{ __('message.retracted') }}
{% elif message.type == 'invitation' %}
<i class="material-symbols icon gray">outgoing_mail</i> {{ __('message.invitation') }}
{% elif message.type == 'jingle_incoming' %}
<i class="material-symbols icon green">call</i> {{ __('chat.jingle_incoming') }}
{% elif message.type == 'jingle_retract' %}
<i class="material-symbols icon gray">phone_missed</i> {{ __('chat.jingle_retract') }}
{% elif message.type == 'jingle_reject' %}
<i class="material-symbols icon orange">phone_missed</i> {{ __('chat.jingle_reject') }}
{% elif message.type == 'jingle_finish' %}
<i class="material-symbols icon red">phone_disabled</i> {{ __('chat.jingle_end') }}
{% elif message.type == 'jingle_outgoing' %}
<i class="material-symbols icon blue">call</i> {{ __('chat.jingle_outgoing') }}
{% elif message.type == 'jingle_end' %}
<i class="material-symbols icon red">call_end</i> {{ __('chat.jingle_end') }}
{% elif message.file %}
{% if message.mine %}
<span class="moderator">{{ __('chats.me') }}:</span>
{% endif %}
{% if message.file.isPicture %}
{% if message.file.thumbnail_type == 'image/thumbhash' and message.file.thumbnail_url %}
<img class="tinythumb" data-thumbhash="{{ message.file.thumbnail_url }}">
{% else %}
<i class="material-symbols">image</i>
{% endif %}
{{ __('chats.picture') }}
{% elif message.file.isAudio %}
<i class="material-symbols">equalizer</i> {{ __('chats.audio') }}
{% elif message.file.isVideo %}
<i class="material-symbols">local_movies</i> {{ __('chats.video') }}
{% else %}
<i class="material-symbols">insert_drive_file</i> {{ __('avatar.file') }}
{% endif %}
{% elif message.body %}
{% if message.mine %}
<span class="moderator">{{ __('chats.me') }}:</span>
{% endif %}
{{ message.body_html|safe }}
{% endif %}
</p>
{% elif contact.status %}
<p class="line">{{ contact.status }}</p>
{% endif %}
</div>
</li>
+19
View File
@@ -0,0 +1,19 @@
<ul id="chats_widget_header" class="list" data-filter="{{ filter }}">
<li class="subheader">
<div>
<p>
{{ __('page.chats') }}
</p>
</div>
{% for value in filters %}
<span class="chip active" data-filter="{{ value }}" onclick="Chats.setFilter(this.dataset.filter)">{{ __('chats_filter.' ~ value) }}</span>
{% endfor %}
</li>
</ul>
<ul id="chats" class="list middle active divided spaced"></ul>
<div class="placeholder">
<i class="material-symbols fill">chat_dashed</i>
<h1>{{ __('chats.empty_title') }}</h1>
<h4>{{ addplaceholder|safe }}</h4>
</div>
+129
View File
@@ -0,0 +1,129 @@
<form enctype="multipart/form-data" method="post" name="general" onchange="Config_ajaxSubmit(MovimUtils.formToJson('general'));">
<div class="block">
<ul class="list">
<li class="subheader large block"><div><p>{{ __('config.audio_title') }}</p></div></li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">call</i>
</span>
<span class="control">
<div class="checkbox">
<input {% if user.notificationcall %}checked{% endif %} type="checkbox" id="notificationcall" title="{{ __('config.audio_call') }}" name="notificationcall"/>
<label for="notificationcall"></label>
</div>
</span>
<div>
<p class="line">{{ __('config.audio_call') }}</p>
</div>
</li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">forum</i>
</span>
<span class="control">
<div class="checkbox">
<input {% if user.notificationchat %}checked{% endif %} type="checkbox" id="notificationchat" title="{{ __('config.audio_chat') }}" name="notificationchat"/>
<label for="notificationchat"></label>
</div>
</span>
<div>
<p class="line">{{ __('config.audio_chat') }}</p>
</div>
</li>
</ul>
</div>
<ul class="list">
<li class="subheader"><div><p>{{ __('config.general') }}</p></div></li>
</ul>
<div class="block">
<ul class="list">
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">translate</i>
</span>
<div>
<div class="select">
<select name="language" id="language">
<option value="en">English (default)</option>
{% for key, value in languages|items %}
<option value="{{ key }}" dir="auto" {% if key == user.language %}selected="selected"{% endif %}>{{ value }}</option>
{% endfor %}
</select>
</div>
<label for="language">{{ __('config.language') }}</label>
</div>
</li>
</ul>
</div>
<div class="block">
<ul class="list middle">
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">lock</i>
</span>
<span class="control">
<div class="checkbox">
<input {% if user.omemoenabled %}checked{% endif %} type="checkbox"
onchange="window.history.pushState(null, null, '#' + 'config_widget'); setTimeout(() => MovimUtils.reloadThis(), 1000)"
id="omemoenabled" name="omemoenabled"/>
<label for="omemoenabled"></label>
</div>
</span>
<div>
<p>{{ __('config.omemoenabled') }}</p>
<p class="all">{{ __('config.omemoenabled_text') }}</p>
</div>
</li>
<li>
<span class="primary icon red">
<i class="material-symbols">warning</i>
</span>
<div>
<p></p>
<p class="all">{{ __('config.omemoenabled_warning', domain) }}</p>
</div>
</li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">dark_mode</i>
</span>
<span class="control">
<div class="checkbox">
<input {% if user.nightmode %}checked{% endif %} type="checkbox" id="nightmode" onchange="Config.switchNightMode()" name="nightmode"/>
<label for="nightmode">
<i class="material-symbols">night_sight_auto</i>
</label>
</div>
</span>
<div>
<p>{{ __('config.night_mode') }}</p>
<p class="all">{{ __('config.night_mode_text') }}</p>
<span class="night_mode_detected supporting">
<i class="material-symbols">night_sight_auto</i>
{{ __('config.night_mode_detected') }}
</span>
</div>
</li>
<li id="accent_color">
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">palette</i>
</span>
<div>
<p>{{ __('config.accent_color') }}</p>
<p></p>
<div>
{% for color in accent_colors %}
<div class="radio">
<input name="accentcolor" value="{{ color }}" id="accentcolor_{{ color }}" type="radio" {% if user.accentcolor == color %}checked{% endif %}>
<label for="accentcolor_{{ color }}" style="border-color: var(--p-{{ color }}); background-color: var(--p-{{ color }})" onclick="Config.setAccentColor('{{ color }}')"></label>
</div>
{% endfor %}
</div>
</div>
</li>
</ul>
</div>
</form>
+21
View File
@@ -0,0 +1,21 @@
<form>
<div>
<ul class="list">
<li>
<span class="primary icon gray">
<i class="material-symbols">inventory</i>
</span>
<div>
<div class="select">
<select name="mam" id="mam" onchange="Config_ajaxMAMSetConfig(this.value)">
<option {% if default == 'never' %}selected="selected"{% endif %} value="never">{{ __('config.mam_never') }}</option>
<option {% if default == 'roster' %}selected="selected"{% endif %} value="roster">{{ __('page.contacts') }}</option>
<option {% if default == 'always' %}selected="selected"{% endif %} value="always">{{ __('config.mam_always') }}</option>
</select>
</div>
<label for="mam">{{ __('config.mam_text') }}</label>
</div>
</li>
</ul>
</div>
</form>
+17
View File
@@ -0,0 +1,17 @@
<section>
<h3>{{ __('general.nickname') }}</h3>
<form name="nickname" onsubmit="return false;">
<div>
<input name="nickname" id="nickname" type="text" value="{{ nickname }}" placeholder="John"/>
<label for="nickname">{{ __('general.nickname') }}</label>
</div>
</form>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button onclick="Config_ajaxSaveNickname(document.querySelector('#nickname').value)" class="button flat">
{{ __('button.save') }}
</button>
</footer>
+22
View File
@@ -0,0 +1,22 @@
<div class="tabelem" title="{{ __('page.configuration') }}" data-mobileicon="settings" id="config_widget">
<div id="config_widget_form">{{ form|safe }}</div>
<div id="config_widget_mam"></div>
<ul class="list middle active">
<li onclick="Config_ajaxEditNickname()">
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<span class="primary icon gray">
<i class="material-symbols">account_circle</i>
</span>
<div>
<p>{{ __('general.nickname') }}</p>
<p class="all">{{ __('chatrooms.nickname') }}</p>
{% if nickname %}
<p>{{ nickname }}</p>
{% endif %}
</div>
</li>
<br />
</ul>
</div>
+34
View File
@@ -0,0 +1,34 @@
<section id="confirm">
<h3>{{ __('confirm.title') }}</h3>
<br />
<ul class="list thick">
<li>
<div>
<p></p>
<p class="center">{{ __('confirm.description') }}</p>
</div>
<h3>{{ url }}</h3>
</li>
<li>
<div>
<p></p>
<p class="center">
{{ __('confirm.code') }}
</p>
</div>
<h3>{{ id }}</h3>
</li>
</ul>
</section>
<footer>
<button
onclick="Confirm_ajaxRefuse('{{ from|echapJS }}', '{{ id|echapJS }}', '{{ url|echapJS }}', '{{ method|echapJS }}'); Dialog_ajaxClear()"
class="button flat">
{{ __('button.refuse') }}
</button>
<button
onclick="Confirm_ajaxAccept('{{ from|echapJS }}', '{{ id|echapJS }}', '{{ url|echapJS }}', '{{ method|echapJS }}'); Dialog_ajaxClear()"
class="button flat">
{{ __('button.accept') }}
</button>
</footer>
@@ -0,0 +1,168 @@
<section>
<header class="big color {{ contact.color }}"
style="background-image: linear-gradient(to bottom, rgba(23,23,23,0.8) 0%, rgba(23,23,23,0.5) 100%), url('{{ contact.picture }}');"
>
<ul class="list thick">
<li>
<span class="primary icon bubble {% if contact.presence %}status {{ contact.presence }}{% endif %}">
<img src="{{ contact.picture }}">
</span>
{% if not mine %}
<span class="control icon active divided" onclick="Search.chat('{{ contact.id|echapJS }}', false); Drawer.clear();">
<i class="material-symbols">comment</i>
</span>
{% if call_audio %}
<span title="{{ __('button.audio_call') }}" class="control icon active"
onclick="Visio_ajaxGetLobby('{{ call_audio|echapJS }}', true); Drawer.clear();">
<i class="material-symbols">phone</i>
</span>
{% endif %}
{% if call_video %}
<span title="{{ __('button.video_call') }}" class="control icon active"
onclick="Visio_ajaxGetLobby('{{ call_video|echapJS }}', true, true); Drawer.clear();">
<i class="material-symbols">videocam</i>
</span>
{% endif %}
{% endif %}
<div>
<p class="line">
{{ contact.truename }}
{% if contact.blocked %}
<span class="tag color red">{{ __('blocked.title') }}</span>
{% endif %}
{% for g in contact.groups %}
<span class="tag color {{ g|stringToColor }}">{{ g }}</span>
{% endfor %}
</p>
<p class="line">
{{ contact.id }}
</p>
</div>
</li>
</ul>
</header>
<ul class="list thick">
<li>
<div>
<p>
{% if contact.nickname %}{{ contact.nickname }}{% else %}{{ contact.truename }}{% endif %}
</p>
<p class="all">
{% if description %}
{{ description|safe }}
<br /><br />
{% endif %}
{% if contact.status %}
<i class="material-symbols icon-text">chat_info</i>
{{ contact.status }}
<br />
{% endif %}
{% if contact.email %}
<i class="material-symbols icon-text">email</i>
<a href="mailto:{{ contact.email }}">{{ contact.email }}</a>
<br />
{% endif %}
{% if contact.url %}
<i class="material-symbols icon-text">link</i>
{% if contact.url is startingwith('http') %}
<a href="{{ contact.url }}" target="_blank" rel="noopener noreferrer">{{ contact.url }}</a>
{% else %}
{{ contact.url }}
{% endif %}
<br />
{% endif %}
</p>
</div>
</li>
</ul>
{% if not mine %}
<ul class="list middle active">
{% if contact.in_roster %}
<li onclick="Notifications_ajaxEditContact('{{ contact.id|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">edit</i>
</span>
<div>
<p>{{ __('button.edit') }}</p>
</div>
</li>
<li onclick="Notifications_ajaxDeleteContact('{{ contact.id|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">person_remove</i>
</span>
<div>
<p>{{ __('button.delete') }}</p>
</div>
</li>
{% else %}
<li onclick="Notifications_ajaxAddAsk('{{ contact.id|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">person_add</i>
</span>
<div>
<p>{{ __('roster.add_title') }}</p>
</div>
</li>
{% endif %}
{% if contact.blocked %}
<li onclick="ContactActions_ajaxUnblock('{{ contact.id|echapJS }}'); Drawer.clear();">
<span class="primary icon green">
<i class="material-symbols">cancel</i>
</span>
<div>
<p>{{ __('blocked.unblock_account') }}</p>
</div>
</li>
{% else %}
<li onclick="ContactActions_ajaxBlock('{{ contact.id|echapJS }}'); Drawer.clear();">
<span class="primary icon red">
<i class="material-symbols">block</i>
</span>
<div>
<p>{{ __('blocked.block_account') }}</p>
</div>
</li>
{% endif %}
<li onclick="Chat_ajaxClearHistory('{{ contact.id|echapJS }}')">
<span class="primary icon gray">
<i class="material-symbols">clear_all</i>
</span>
<div>
<p class="line">{{ __('chat.clear_history') }}</p>
</div>
</li>
</ul>
{% endif %}
{% if resources %}
<ul class="list middle">
<li class="subheader">
<div>
<p>{{ __('clients.title_full') }}</p>
</div>
</li>
{% for value in resources %}
<li class="block">
<span class="primary icon gray status {{ value.presence }}">
<i class="material-symbols">devices</i>
</span>
<div>
<p class="line">
{% if value.name %}{{ value.name }}{% else %}{{ value.resource }}{% endif %}
<span class="second">{{ value.resource }}</span>
</p>
{% if value.status %}<p class="line">{{ value.status }}</p>{% endif %}
</div>
</li>
{% endfor %}
</ul>
{% endif %}
{% if omemo %}
<div class="spin" id="omemo_fingerprints"></div>
{% endif %}
<br />
</section>
@@ -0,0 +1,48 @@
{% if fingerprints %}
<form>
<div>
<ul class="list middle">
<li class="subheader">
<div>
<p>{{ __('omemo.fingerprints') }}</p>
</div>
</li>
{% for value in fingerprints %}
<li>
<span class="primary icon gray" id="sessionicon_{{ value.jid|cleanupId }}_{{ value.bundleid }}">
<i class="material-symbols">fingerprint</i>
</span>
<span class="control">
<div class="checkbox">
<input
type="checkbox"
data-identifier="{{ value.jid }}.{{ value.bundleid }}"
id="sessionstate_{{ value.jid|cleanupId }}_{{ value.bundleid }}"
name="sessionstate_{{ value.jid|cleanupId }}_{{ value.bundleid }}"
onchange="ContactActions.toggleFingerprintState(this)"/>
<label for="sessionstate_{{ value.jid|cleanupId }}_{{ value.bundleid }}"></label>
</div>
</span>
<div>
<p>
<span class="fingerprint" title="{{ value.bundleid }}">
{{ value.fingerprint }}
</span>
</p>
<p class="line">
{% if value.latest %}
{{ __('omemo.last_activity') }}: {{ value.latest }}
{% endif %}
</p>
</div>
</li>
{% endfor %}
</ul>
</div>
</form>
{% else %}
<div class="placeholder">
<i class="material-symbols">fingerprint</i>
<h1>{{ __('omemo.fingerprints') }}</h1>
</div>
{% endif %}
+1
View File
@@ -0,0 +1 @@
<div role="dialog" id="dialog" class="dialog actions"></div>
+22
View File
@@ -0,0 +1,22 @@
<div id="dictaphone_widget">
<ul class="list">
<li>
<span id="record" class="primary icon color red bubble active">
<i class="material-symbols fill">fiber_manual_record</i>
</span>
<span id="play_pause" class="primary icon active">
<i class="material-symbols">play_arrow</i>
</span>
<span id="audio_upload" class="control icon active">
<i class="material-symbols">send</i>
</span>
<div>
<p class="rec icon red"></p>
<p id="timer"></p>
<audio></audio>
<input type="range" min="0" max="100" step="0.1" value="0">
</div>
</li>
</ul>
</div>
+76
View File
@@ -0,0 +1,76 @@
<div class="canvas">
<canvas id="draw-background"></canvas>
<canvas id="draw-canvas">¯\_(ツ)_/¯</canvas>
<canvas id="screen-canvas"></canvas>
</div>
<div class="draw-actions">
<ul class="list middle">
<li id="draw-clear">
<span class="primary active icon bubble color transparent">
<i class="material-symbols">delete</i>
</span>
</li>
</ul>
<br />
<ul class="list draw-widths">
<li data-width="small">
<span class="primary active icon bubble color transparent">
<i class="material-symbols">brush</i>
</span>
</li>
<li data-width="medium">
<span class="primary active icon bubble color transparent">
<i class="material-symbols">brush</i>
</span>
</li>
<li data-width="big">
<span class="primary active icon bubble color transparent">
<i class="material-symbols">brush</i>
</span>
</li>
</ul>
</div>
<div class="draw-control">
<br />
<ul class="list draw-colors">
<li data-color="black">
<span class="primary active icon bubble color black"></span>
</li>
<li data-color="blue">
<span class="primary active icon bubble color blue"></span>
</li>
<li data-color="purple">
<span class="primary active icon bubble color yellow"></span>
</li>
<li data-color="green">
<span class="primary active icon bubble color orange"></span>
</li>
<li data-color="red">
<span class="primary active icon bubble color red"></span>
</li>
<li data-color="green">
<span class="primary active icon bubble color green"></span>
</li>
<li data-color="purple">
<span class="primary active icon bubble color purple"></span>
</li>
</ul>
<ul class="list">
<li class="draw-eraser">
<span class="primary active icon bubble color transparent">
<i class="material-symbols">ink_eraser</i>
</span>
</li>
</ul>
</div>
<ul class="list controls middle draw-top-nav">
<li>
<span id="drawback" class="primary bubble icon color active">
<i class="material-symbols">arrow_back</i>
</span>
<span class="control active icon bubble color blue" id="draw-save">
<i class="material-symbols">publish</i>
</span>
</li>
</ul>
+2
View File
@@ -0,0 +1,2 @@
<div id="draw"></div>
+1
View File
@@ -0,0 +1 @@
<div role="modal" id="drawer" class="drawer empty"></div>
+29
View File
@@ -0,0 +1,29 @@
<section>
<ul class="list thick" id="login_error">
<li>
<span class="primary icon">
<i class="material-symbols">error</i>
</span>
<div>
<p>{{ __('error.oops') }}</p>
<p>{{ error }}</p>
{% if errormessage %}
<p class="all">
<code>{{ errormessage }}</code>
</p>
{% endif %}
</div>
</li>
</ul>
<ul class="list">
<li>
<div>
<p class="center">
<span class="button flat" onclick="MovimUtils.redirect('{{ route('disconnect') }}');">
{{ __('button.return') }}
</span>
</p>
</div>
</li>
</ul>
</section>
+142
View File
@@ -0,0 +1,142 @@
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function dcl() {
document.removeEventListener('DOMContentLoaded', dcl, false);
if (typeof navigator.registerProtocolHandler == 'function') {
try {
navigator.registerProtocolHandler('xmpp', '{{ route("share") }}/%s');
} catch (e) {}
}
Login.domain = '{{ domain|echapJS }}';
}, false);
</script>
<div id="login_widget">
<div id="form" class="dialog">
<section>
{% if banner %}
<img class="banner" src="{{ banner }}">
{% endif %}
<form
method="post" action="login"
name="login">
<div {% if maxsessionsreached %}class="disabled"{% endif %}>
<input type="text" id="complete" tabindex="-1"/>
<input type="text" pattern="^.+@.+$" name="username" id="username" autofocus required
placeholder="username@server.com" >
<label for="username">{{ __('form.username') }}</label>
</div>
<div {% if maxsessionsreached %}class="disabled"{% endif %}>
<input type="password" name="password" id="password" required
placeholder="{{ __('form.password') }}"/>
<label for="password">{{ __('form.password') }}</label>
</div>
<ul class="list thin">
<li class="info">
<div>
<p></p>
<p class="center">
{% if maxsessionsreached and not whitelist %}
{{ __('error.max_sessions_reached') }}<br />
<a href="https://join.movim.eu/">{{ __('error.max_sessions_reached_join', 'join.movim.eu') }}</a>
{% elif whitelist %}
{{ __('form.whitelist_info') }} :
{% for value in whitelist %}
{{ value }}
{% endfor %}
{% else %}
{{ __('form.connect_info') }}
{% endif %}
</p>
</div>
</li>
</ul>
<div>
<ul class="list middle">
<li>
<div>
<p class="center">
{% if not maxsessionsreached %}
<input
type="submit"
disabled
data-loading="{{ __('button.connecting') }}…"
value="{{ __('page.login') }}"
class="button color"/>
{% endif %}
{% if not disableregistration %}
<a class="button flat" href="{{ route('account') }}">
{{ __('button.sign_up') }}
</a>
{% endif %}
</p>
</div>
</li>
</ul>
</div>
</form>
</section>
</div>
<div id="form" class="dialog more">
<section>
<ul class="list middle">
<li class="subheader">
<div>
<p>
<span class="info">{{ __('form.connected') }}: {{ connected }}{% if maxsessions > 0 %}/{{ maxsessions }}{% endif %} - {{ __('form.population') }}: {{ pop }}</span>
</p>
</div>
</li>
</ul>
{% if info %}
<ul class="list">
<li>
<div>
<article>
<section>
{{ info }}
</section>
</article>
</div>
</li>
</ul>
{% endif %}
<ul class="list thick about">
<li>
<div>
<p>About Movim</p>
<p>
{{ __('about_movim.info') }} <br />
<a href="https://movim.eu" target="_blank">{{ __('about_movim.website', 'movim.eu') }}</a>
</p>
</div>
</li>
</ul>
<ul class="list middle hide" id="pwa">
<li class="block active">
<span class="primary icon bubble gray">
<i class="material-symbols on_desktop">install_desktop</i>
<i class="material-symbols on_mobile">install_mobile</i>
</span>
<div>
<p class="line">{{ __('apps.install') }}<p>
<p class="all">
{{ __('apps.install_text') }}
</p>
</div>
</li>
</ul>
</section>
</div>
<div id="error" class="dialog actions">
{{ error|safe }}
</div>
</div>
+41
View File
@@ -0,0 +1,41 @@
<hr role="none" class="on_desktop"/>
<ul class="navigation list active on_desktop" dir="ltr">
<li onclick="Search_ajaxRequest()"
title="{{ __('button.search') }}"
>
<span class="primary icon">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">search</i>
</a>
</span>
<div>
<p>{{ __('button.search') }}</p>
</div>
</li>
<li onclick="Notifications_ajaxRequest()"
title="{{ __('notifs.title') }}"
>
<span class="primary icon">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">notifications</i>
<span class="counter notifications"></span>
</a>
</span>
<div>
<p>{{ __('notifs.title') }}</p>
</div>
</li>
<li onclick="MovimUtils.reload('{{ route('configuration') }}')"
class="{% if page == 'configuration' %}active{% endif %}"
title="{{ __('page.configuration') }}"
>
<span class="primary icon">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">tune</i>
</a>
</span>
<div>
<p>{{ __('page.configuration') }}</p>
</div>
</li>
</ul>
+19
View File
@@ -0,0 +1,19 @@
<ul class="list thick {% if url %}active{% endif %}"
{% if url %}
onclick="MovimUtils.reload('{{ url|echapJS }}'); Notif.snackbarClear()"
{% endif %}
>
<li>
{% if picture %}
<span class="primary icon bubble"><img src="{{ picture }}"></span>
{% else %}
<span class="primary icon gray"><i class="material-symbols">notification</i></span>
{% endif %}
<div>
<p class="line two">{{ title }}</p>
{% if body %}
<p class="line two">{{ body }}</p>
{% endif %}
</div>
</li>
</ul>
+23
View File
@@ -0,0 +1,23 @@
<section>
<h3>{{ __('notification.request_title') }}</h3>
<ul class="list thick">
<li>
<span class="primary icon gray">
<i class="material-symbols">notifications_active</i>
</span>
<div>
<p>{{ __('notification.request_info') }}</p>
<p>{{ __('notification.request_info2') }}</p>
</div>
</li>
</ul>
</section>
<footer>
<button
name="submit"
class="button flat"
onclick="Notif.request(); Dialog_ajaxClear()">
{{ __('notification.request_button') }}
</button>
</footer>
@@ -0,0 +1,46 @@
{% if subscriptions %}
<form>
<div>
<ul class="list thick">
<li>
<span class="primary icon gray">
<i class="material-symbols">circle_notifications</i>
</span>
<div>
<p>{{ __('notificationconfig.push_subscriptions') }}</p>
<p>{{ __('notificationconfig.push_subscriptions_text') }}</p>
</div>
</li>
</ul>
<ul class="list middle divided">
{% for value in subscriptions %}
<li>
<span class="primary icon {% if value.self %}green{% else %}gray{% endif %}">
<i class="material-symbols">notifications</i>
</span>
<span class="control">
<div class="checkbox">
<input type="checkbox" id="pushsubscription_state_{{ value.id }}" name="pushsubscription_state_{{ value.id }}"
{% if value.enabled %}checked{% endif %}
onchange="NotificationConfig_ajaxTogglePushConfig({{ value.id }}, this.checked)"/>
<label for="pushsubscription_state_{{ value.id }}"></label>
</div>
</span>
<div>
<p>
<span class="info">{{ __('omemo.last_activity') }}: {{ value.activity }}</span>
{{ value.host }}
</p>
<p>{% if value.self %}{{ __('clients.this_device') }}{% else %}{{ __('notificationconfig.unknown_platform') }}{% endif %}</p>
</div>
</li>
{% endfor %}
</ul>
</div>
</form>
{% else %}
<div class="placeholder">
<i class="material-symbols">notifications</i>
<h1>{{ __('notificationconfig.push_subscriptions') }}</h1>
</div>
{% endif %}
@@ -0,0 +1,18 @@
<ul class="list thick">
<li>
<span class="primary icon gray">
<i class="material-symbols">notifications_active</i>
</span>
<div>
<button
name="submit"
class="button oppose green"
onclick="Notif.request(); Dialog_ajaxClear()">
{{ __('notification.request_button') }}
</button>
<p>{{ __('notification.request_info') }}</p>
<p>{{ __('notification.request_info2') }}</p>
</div>
</li>
</ul>
@@ -0,0 +1,4 @@
<div class="tabelem" title="{{ __('notificationconfig.push_subscriptions') }}" data-mobileicon="notifications" id="notificationconfig_widget">
<div id="notificationconfig_widget_request"></div>
<div id="notificationconfig_widget_push"></div>
</div>
@@ -0,0 +1,76 @@
<section id="notifications_widget">
{% if requests %}
<ul class="list">
<li class="subheader">
<div>
<p>{{ __('invitations.received') }}</p>
</div>
</li>
</ul>
<ul id="notifications_invitations" class="list middle spaced">{% for value in requests %}<li id="invitation-{{ value.jid|cleanupId }}" data-jid="{{ value.jid }}">
<span class="primary icon bubble active" onclick="ChatActions_ajaxGetContact('{{ value.jid|echapJS }}');">
<img src="{{ value.picture }}">
</span>
<span class="control icon green active" title="{{ __('button.accept') }}" onclick="Notifications_ajaxAccept('{{ value.jid|echapJS }}');">
<i class="material-symbols">check</i>
</span>
<span class="control icon red active" title="{{ __('button.refuse') }}" onclick="Notifications_ajaxRefuse('{{ value.jid|echapJS }}');">
<i class="material-symbols">close</i>
</span>
<div>
<p class="line">
{{ __('invitations.adds_you', value.truename) }}
</p>
<p class="line">{{ value.jid }}</p>
</div>
</li>{% endfor %}</ul>
<div class="placeholder">
<i class="material-symbols">person_add</i>
<h4>{{ __('invitations.no_new') }}</h4>
</div>
{% endif %}
{% if subscriptions %}
<ul class="list">
<li class="subheader">
<div>
<p>{{ __('subscription.nil') }}</p>
</div>
</li>
</ul>
<ul id="notifications_subscriptions" class="list spaced">{% for value in subscriptions %}<li id="invitation-{{ value.jid|cleanupId }}" data-jid="{{ value.jid }}">
<span class="primary icon bubble active" onclick="ChatActions_ajaxGetContact('{{ value.jid|echapJS }}');">
<img src="{{ value.picture }}">
</span>
{% if value.ask == 'subscribe' %}
<span class="control icon gray disabled" title="{{ __('room.invited') }}">
<i class="material-symbols">chat_paste_go</i>
</span>
{% else %}
<span class="control icon gray active" title="{{ __('button.add') }}" onclick="Notifications_ajaxAddAsk('{{ value.jid|echapJS }}'); Drawer.clear();">
<i class="material-symbols">add</i>
</span>
{% endif %}
<span class="control icon gray active" title="{{ __('button.delete') }}" onclick="Notifications_ajaxDeleteContact('{{ value.jid|echapJS }}'); Drawer.clear();">
<i class="material-symbols">delete</i>
</span>
<div>
<p class="line">
{{ value.truename }}
</p>
<p class="line">{{ value.jid }}</p>
</div>
</li>{% endfor %}</ul>
<div class="placeholder">
<i class="material-symbols">person_check</i>
<h4>{{ __('invitations.no_subscriptions') }}</h4>
</div>
{% endif %}
{% if not requests and not subscriptions %}
<div class="placeholder">
<i class="material-symbols">notifications</i>
<h4>{{ __('invitations.no_new') }}</h4>
</div>
{% endif %}
</section>
@@ -0,0 +1,56 @@
<section>
<h3>{% if edit %}{{ __('button.edit') }}{% else %}{{ __('roster.add_title') }}{% endif %}</h3>
<ul class="list thick">
<li>
<span class="primary icon bubble">
<img src="{{ contact.picture }}">
</span>
<div>
<p class="line">
{{ contact.truename }}
</p>
<p>{{ contact.id }}</p>
</div>
</li>
</ul>
<form name="add" onsubmit="return false;">
{% if contact.id %}
<input name="searchjid" id="searchjid" type="hidden" value="{{ contact.id }}"/>
{% else %}
<div>
<input name="searchjid" id="searchjid" type="email" required placeholder="user@server.tld"/>
<label for="searchjid">{{ __('roster.add_contact_info1') }}</label>
</div>
{% endif %}
<div>
<input
name="alias"
id="alias"
placeholder="{{ __('edit.alias') }}"
value="{{ alias }}"/>
<label for="alias">{{ __('edit.alias') }}</label>
</div>
<div>
<datalist id="group_list" style="display: none;">
{% for value in groups %}
<option value="{{ value }}"/>
{% endfor %}
</datalist>
<input
name="group"
list="group_list"
id="group"
placeholder="{{ __('edit.group') }}"
value="{{ group }}"/>
<label for="group">{{ __('edit.group') }}</label>
</div>
</form>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.close') }}
</button>
<button onclick="Notifications_ajaxAdd(MovimUtils.formToJson('add'))" class="button flat">
{% if edit %}{{ __('button.save') }}{% else %}{{ __('button.add') }}{% endif %}
</button>
</footer>
@@ -0,0 +1,18 @@
<section>
<h3>{{ __('delete.title') }}</h3>
<br />
<h4 class="gray">{{ __('delete.text') }}</h4>
<br />
<h4 class="gray">{{ jid }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat"
onclick="Notifications_ajaxDelete('{{ jid|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.delete') }}
</button>
</footer>
+12
View File
@@ -0,0 +1,12 @@
<li role="menuitem" onclick="Presence_ajaxHttpMenu()">
<span class="primary icon bubble status {{ presence }}">
<a href="#" onclick="listIconClick(event)">
<img alt="{{ __('status.my_avatar') }}" src="{{ contact.picture }}">
</a>
</span>
<div>
<p class="line bold">
{{ contact.truename }}
</p>
</div>
</li>
+17
View File
@@ -0,0 +1,17 @@
<section>
<div class="placeholder">
<i class="material-symbols">exit_to_app</i>
<h4>{{ __('status.logout_confirm') }}</h4>
</div>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat"
onclick="Presence_ajaxLogout()">
{{ __('status.disconnect') }}
</button>
</footer>
+70
View File
@@ -0,0 +1,70 @@
<section>
<header class="big color {{ contact.color }}"
style="background-image: linear-gradient(to bottom, rgba(23,23,23,0.8) 0%, rgba(23,23,23,0.5) 100%), url('{{ contact.picture }}');"
>
<ul class="list thick">
<li>
<span class="primary icon bubble status {{ presence }}" aria-hidden="true">
<img src="{{ contact.picture }}">
</span>
<span class="control icon active white divided" onclick="Presence_ajaxAskLogout(); Drawer.clear('menu')"
title="{{ __('status.disconnect') }}">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">exit_to_app</i>
</a>
</span>
<div>
<p class="line">{{ contact.truename }}</p>
<p class="line">{{ contact.id }}</p>
</div>
</li>
</ul>
</header>
<ul class="list active">
<li class="subheader">
<div>
<p>{{ __('status.status') }}</p>
</div>
</li>
{% for p in presences %}
<li onclick="Presence_ajaxSetPresence('{{ p.value }}'); Drawer.clear('menu')" {% if p.value == presence %}class="active"{% endif %}>
<span class="primary icon bubble status {{ p.value }} small">
<i class="material-symbols">{{ p.icon }}</i>
</span>
<div>
<p class="line">{{ p.label }}</p>
</div>
</li>
{% endfor %}
<hr />
<li onclick="MovimUtils.reload('{{ route('configuration') }}')"
title="{{ __('page.configuration') }}">
<span class="primary icon gray">
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">tune</i>
</a>
</span>
<span class="control icon gray" aria-hidden="true">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('page.configuration') }}</p>
</div>
</li>
</ul>
<ul class="list thick">
<li>
<div>
<p class="center">
<i class="material-symbols" style="margin-right: 1rem;">cloud_queue</i>
Powered by <a target="_blank" href="https://movim.eu">Movim</a> (Rust edition)
</p>
</div>
</li>
</ul>
</section>
+11
View File
@@ -0,0 +1,11 @@
<ul class="list navigation thick active on_desktop" id="presence_widget" dir="ltr">
<li>
<span class="primary icon bubble color status">
<img src="{{ picture }}">
</span>
<div>
<p class="line bold"><br /></p>
<p class="line"><br /></p>
</div>
</li>
</ul>
+12
View File
@@ -0,0 +1,12 @@
<li class="block">
{% if image %}
<span class="primary icon thumb" style="background-image: url({{ image }})"></span>
{% else %}
<span class="primary icon gray"><i class="material-symbols">link</i></span>
{% endif %}
<div>
<p class="line">{% if title %}{{ title }}{% else %}{{ url }}{% endif %}</p>
{% if description %}<p class="line two">{{ description }}</p>{% endif %}
<p class="line"><a href="{{ url }}" target="_blank" rel="noopener noreferrer">{{ host }}</a></p>
</div>
</li>
+23
View File
@@ -0,0 +1,23 @@
<ul class="list controls middle">
<li>
<span class="primary icon active color none" onclick="history.back()" title="{{ __('button.close') }}">
<i class="material-symbols">arrow_back</i>
</span>
</li>
</ul>
<img src="{{ thumb }}" title="{{ raw_url }}" class="transparent"/>
<span class="prevnext prev"></span>
<span class="prevnext next"></span>
<div class="buttons">
<a class="button flat color transparent" href="{{ raw_url }}" target="_blank" download title="{{ __('button.save') }}">
<i class="material-symbols">get_app</i> {{ __('button.save') }}
</a>
<a class="button flat color transparent" href="#" onclick="Preview.copyToClipboard('{{ raw_url|echapJS }}')" title="{{ __('button.copy_link') }}">
<i class="material-symbols">content_copy</i> {{ __('button.copy_link') }}
</a>
{% if messageid %}
<a class="button flat color transparent" href="#" onclick="Preview_ajaxHttpHide(); ChatActions_ajaxShowMessageDialog({{ messageid }});" title="{{ __('button.more') }}">
<i class="material-symbols">more_vert</i>
</a>
{% endif %}
</div>
+1
View File
@@ -0,0 +1 @@
<div id="preview" role="dialog" aria-label="{{ __('publish.preview') }}"></div>
+10
View File
@@ -0,0 +1,10 @@
<form name="data">
{{ formh|safe }}
<button
type="button"
class="button color oppose"
onclick="Register_ajaxRegister(MovimUtils.formToJson('data'))"
>
{{ __('button.validate') }}
</button>
</form>
@@ -0,0 +1,9 @@
<div class="placeholder">
<i class="material-symbols">account_box</i>
<h4>{{ __('create.successfull') }}</h4>
<a class="button color"
href="{{ route('disconnect') }}">
{{ __('page.login') }}
</a>
</div>
+22
View File
@@ -0,0 +1,22 @@
<div id="subscribe">
<div class="flex">
<div class="block on_desktop">
<div class="placeholder">
<i class="material-symbols">person_add</i>
<h4>{{ __('create.title') }}</h4>
<h4>{{ __('create.placeholder') }}</h4>
</div>
</div>
<div id="subscription_form" class="block">
<ul class="list simple thick">
<li>
<div>
<p>{{ __('create.title') }} {{ __('create.server_on') }} {{ host }}</p>
<p>{{ __('create.loading') }}</p>
</div>
</li>
</ul>
</div>
</div>
</div>
+12
View File
@@ -0,0 +1,12 @@
<a href="#" onclick="listIconClick(event)" title="{{ c.title }}">
{% if not with_avatar %}
{{ c.title|firstLetter|addEmojis }}
{% endif %}
{% if c.notify == 2 and c.unreads > 0 %}
<span class="counter">{{ c.unreads }}</span>
{% elif c.quoted > 0 %}
<span class="counter notifications">{{ c.quoted }}</span>
{% elif c.unreads > 0 %}
<span class="counter"><i class="material-symbols">chat_bubble_outline</i></span>
{% endif %}
</a>
+11
View File
@@ -0,0 +1,11 @@
<ul class="list thick spaced empty">
<li>
<span class="primary icon green">
<i class="material-symbols">people_outline</i>
</span>
<div>
<p>{{ __('chatrooms.empty_text1') }}</p>
<p>{{ __('chatrooms.empty_text2') }}</p>
</div>
</li>
</ul>
+71
View File
@@ -0,0 +1,71 @@
<li id="{{ c.jid|cleanupId }}"
data-jid="{{ c.jid }}"
{% if c.nick %} data-nick="{{ c.nick }}" {% endif %}
class="room {% if c.connected %}connected{% endif %} {% if c.pinned %}pinned{% endif %} {% if c.group %}groupchat{% endif %} {% if c.unreads > 0 or c.quoted > 0 %}unread{% endif %} {% if c.joining %}connecting{% endif %} {% if c.muji.count > 0 %}muji{% endif %}">
<ul class="list thin">
<li>
<span class="primary icon bubble small"
id="{{ c.jid|cleanupId }}-rooms-primary"
style="background-image: url({{ c.picture }});">
{{ counter|safe }}
</span>
<div>
<p class="line">
{% if c.pinned %}
<span class="info">
<i class="material-symbols fill" title="{{ __('room.pinned') }}">push_pin</i>
</span>
{% endif %}
{% if not c.group and c.connected %}
<span title="{{ __('communitydata.sub', c.count) }}"
class="info {% if c.role == 'moderator' %}moderator{% endif %}">
{{ c.count }} <i class="material-symbols">people</i>
</span>
{% endif %}
<span title="{{ c.jid }}">
{% if c.muji.count > 0 %}
<i class="material-symbols call icon {% if c.muji.joined %}green blink{% else %}blue{% endif %}" title="{{ __('visio.in_call') }}">phone</i>
{% endif %}
{{ c.title }}
</span>
<span class="second">
{% if c.notify == 0 %}
<i class="material-symbols" title="{{ __('room.notify_never') }}">notifications_off</i>
{% elif c.notify == 2 %}
<i class="material-symbols" title="{{ __('room.notify_always') }}">notifications_active</i>
{% endif %}
{% if c.description %}{{ c.description }}{% else %}{{ c.jid }}{% endif %}
</span>
</p>
</div>
<span class="control icon gray connecting">
<i class="material-symbols spin">progress_activity</i>
</span>
<span class="control icon active gray edition on_desktop" onclick="event.stopPropagation(); RoomsUtils_ajaxAdd('{{ c.jid|echapJS }}');">
<i class="material-symbols">edit</i>
</span>
</li>
{% for value in c.muji.participants %}
<li>
<span class="primary icon r2 small">
<i class="material-symbols icon gray">line_curve</i>
</span>
<span class="primary icon bubble small">
<img loading="lazy" src="{{ value.picture }}">
</span>
<div>
<p>
{% if value.screen %}
<span class="info live"><i class="material-symbols">screen_share</i></span>
{% endif %}
{% if value.video %}
<span class="info"><i class="material-symbols">videocam</i></span>
{% endif %}
{{ value.nick }}
</p>
</div>
</li>
{% endfor %}
</ul>
</li>
+37
View File
@@ -0,0 +1,37 @@
<div id="rooms">
<ul class="list rooms divided thin spaced active spin"></ul>
<ul class="list head flex active">
<li class="subheader" title="{{ __('page.configuration') }}">
<div>
<p>
{{ __('chatrooms.title') }}
</p>
</div>
<span class="chip active" data-filter="all" onclick="Rooms.toggleShowAll()">{{ __('chatrooms.filter_all') }}</span>
<span class="chip active" data-filter="connected" onclick="Rooms.toggleShowAll()">{{ __('chatrooms.filter_connected') }}</span>
</li>
</ul>
<ul class="list thick active spaced toggle_show">
<li onclick="Rooms.toggleShowAll()">
<span class="primary icon gray small">
<i class="material-symbols">
expand_less
</i>
<i class="material-symbols">
expand_more
</i>
</span>
<div>
<p class="line">
{{ __('chatrooms.hide_disconnected') }}
</p>
<p class="line">
{{ __('chatrooms.show_all') }}
</p>
</div>
</li>
</ul>
</div>
+219
View File
@@ -0,0 +1,219 @@
<section>
{% if id %}
<ul class="list thick">
<li>
{% if conference %}
<span class="primary icon bubble">
<img src="{{ conference.picture }}">
</span>
<span class="control icon gray divided active" onclick="RoomsUtils_ajaxRemove('{{ conference.jid|echapJS }}');">
<i class="material-symbols">delete</i>
</span>
{% endif %}
<div>
<p class="line">{% if conference %}{{ conference.title }}{% else %}{{ id }}{% endif %}</p>
<p>{{ __('chatrooms.edit') }}</p>
</div>
</li>
</ul>
{% else %}
<h3>{{ __('chatrooms.create') }}</h3>
{% endif %}
<form name="bookmarkmucadd">
{% if create %}
<div>
<ul class="list middle">
<li>
<span class="primary icon gray">
<i class="material-symbols">people_alt</i>
</span>
<span class="control">
<div class="radio">
<input name="type" value="groupchat"
id="type_groupchat" type="radio"
checked>
<label for="type_groupchat"></label>
</div>
</span>
<div>
<p>{{ __('room.group_chat') }}</p>
<p>{{ __('room.group_chat_text') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">wifi_tethering</i>
</span>
<span class="control">
<div class="radio">
<input name="type" value="channel"
id="type_channel" type="radio">
<label for="type_channel"></label>
</div>
</span>
<div>
<p>{{ __('room.channel') }}</p>
<p>{{ __('room.channel_text') }}</p>
</div>
</li>
</ul>
</div>
<div>
<input
{% if conference %}
value="{{ conference.name }}"
{% elif info %}
value="{{ info.name }}"
{% elif name %}
value="{{ name }}"
{% endif %}
name="name"
placeholder="{{ __('chatrooms.name_placeholder') }}"
onblur="RoomsUtils_ajaxResolveSlug(this.value)"
required />
<label>{{ __('general.name') }}</label>
</div>
{% endif %}
{% if id and not create %}
<input type="hidden" value="{{ id }}" name="jid"/>
{% else %}
<div id="bookmarkmucadd_jid">
<input
name="jid"
{% if mucservice %}
placeholder="chatroom@{{ mucservice.server }}"
{% else %}
placeholder="chatroom@server.com"
{% endif %}
type="email"
list="suggestions"
oninput="Rooms.cleanId(this); Rooms.suggest()"
required />
<label>{{ __('chatrooms.id') }}</label>
</div>
{% endif %}
<div>
<ul class="list">
{% if not create %}
<li>
<div>
<input
{% if conference %}
value="{{ conference.name }}"
{% elif info %}
value="{{ info.name }}"
{% elif name %}
value="{{ name }}"
{% endif %}
name="name"
type="hidden"
required />
</div>
</li>
{% endif %}
<li>
<span class="primary icon gray">
<i class="material-symbols">person_book</i>
</span>
<div>
<input
{% if conference and conference.nick %}
value="{{ conference.nick }}"
{% else %}
value="{{ username }}"
{% endif %}
name="nick"
placeholder="{{ username }}"/>
<label>{{ __('general.nickname') }}</label>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">edit_notifications</i>
</span>
<div>
<div class="select">
<select name="notify">
<option value="never" {% if conference and conference.notify == 0 %}selected{% endif %}>
{{ __('room.notify_never') }}
</option>
<option value="on-mention" {% if conference and conference.notify == 1 %}selected{% endif %}
{% if not conference %}selected{% endif %}>
{{ __('room.notify_mentioned') }}
</option>
<option value="always" {% if conference and conference.notify == 2 %}selected{% endif %}>
{{ __('room.notify_always') }}
</option>
</select>
</div>
<label>{{ __('room.notify_title') }}</label>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">login</i>
</span>
<span class="control">
<div class="checkbox">
<input
{% if conference and conference.autojoin %}
checked
{% endif %}
type="checkbox"
id="autojoin"
name="autojoin"/>
<label for="autojoin"></label>
</div>
</span>
<div>
<p class="all">{{ __('chatrooms.autojoin') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">push_pin</i>
</span>
<span class="control">
<div class="checkbox">
<input
{% if conference and conference.pinned %}
checked
{% endif %}
type="checkbox"
id="pinned"
name="pinned"/>
<label for="pinned"></label>
</div>
</span>
<div>
<p>{{ __('chatrooms.pinned') }}</p>
</div>
</li>
</ul>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.cancel') }}
</button>
<button
class="button flat"
{% if create %}
onclick="RoomsUtils_ajaxAddCreate(MovimUtils.formToJson('bookmarkmucadd'));"
{% else %}
onclick="RoomsUtils_ajaxAddConfirm(MovimUtils.formToJson('bookmarkmucadd'));"
{% endif %}
>
{% if conference %}
{{ __('button.edit') }}
{% else %}
{{ __('button.add') }}
{% endif %}
</button>
</footer>
+31
View File
@@ -0,0 +1,31 @@
<section class="scroll">
<ul class="list thick">
<li>
{% if owner %}
<span class="control icon divided active"
title="{{ __('button.destroy') }}"
onclick="RoomsUtils_ajaxAskDestroy('{{ room|echapJS }}');">
<i class="material-symbols">delete</i>
</span>
{% endif %}
<span class="primary icon bubble">
<img src="{{ picture }}">
</span>
<div>
<p class="line">{{ title }}</p>
<p>{{ __('chatrooms.configure') }}</p>
</div>
</li>
</ul>
<form name="config">
{{ form|safe }}
</form>
</section>
<footer>
<a onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.close') }}
</a>
<a onclick="RoomsUtils_ajaxSetConfig(MovimUtils.formToJson('config'), '{{ room|echapJS }}'); Dialog_ajaxClear();" class="button flat green color">
{{ __('button.save') }}
</a>
</footer>
@@ -0,0 +1,75 @@
<section>
<h3>{{ __('room.configure_user') }}</h3>
<ul class="list thick">
<li>
<span class="primary icon bubble small status {{ occupant.presence }}">
<img loading="lazy" src="{{ occupant.picture }}">
</span>
<div>
<p>{{ occupant.nick }}</p>
<p>{% if occupant.jid %}{{ occupant.jid }}{% endif %}</p>
</div>
</li>
</ul>
<ul class="list active">
{% if occupant.jid %}
<li>
<span class="primary icon gray">
<i class="material-symbols">assignment_ind</i>
</span>
<div>
<div class="select">
<select name="affiliation"
onchange="RoomsUtils_ajaxChangeAffiliation('{{ room|echapJS }}', '{{ occupant.jid|echapJS }}', this.value);">
<option value="owner" {% if occupant.affiliation == 'owner' %}selected{% endif %} {% if my_affiliation != 'owner' %}disabled{% endif %}>
{{ __('affiliation.owner') }}
</option>
<option value="admin" {% if occupant.affiliation == 'admin' %}selected{% endif %} {% if my_affiliation != 'owner' %}disabled{% endif %}>
{{ __('affiliation.admin') }}
</option>
<option value="member" {% if occupant.affiliation == 'member' %}selected{% endif %}>
{{ __('affiliation.member') }}
</option>
<option value="none" {% if occupant.affiliation == 'none' %}selected{% endif %}>
{{ __('affiliation.no') }}
</option>
</select>
</div>
<label>{{ __('room.role') }}</label>
</div>
</li>
{% endif %}
<li>
<span class="primary icon gray">
<i class="material-symbols">voice_selection</i>
</span>
<span class="control">
<div class="checkbox">
<input type="checkbox" id="voice" name="voice" {% if occupant.role != 'visitor' %}checked{% endif %}
onchange="RoomsUtils_ajaxChangeVoice('{{ room|echapJS }}', '{{ occupant.nick|echapJS }}', this.checked);">
<label for="voice"></label>
</div>
</span>
<div>
<p class="all">{{ __('room.allowed_send_messages') }}</p>
</div>
</li>
<hr />
<li onclick="RoomsUtils_ajaxKick('{{ room|echapJS }}', '{{ occupant.nick|echapJS }}'); Dialog_ajaxClear();">
<span class="primary icon gray"><i class="material-symbols">person_remove</i></span>
<div><p class="line">{{ __('room.kick') }}</p></div>
</li>
{% if occupant.jid %}
<li onclick="RoomsUtils_ajaxChangeAffiliation('{{ room|echapJS }}', '{{ occupant.jid|echapJS }}', 'outcast'); Dialog_ajaxClear();">
<span class="primary icon red"><i class="material-symbols">block</i></span>
<div><p class="line">{{ __('room.ban') }}</p></div>
</li>
{% endif %}
</ul>
</section>
<footer>
<button class="button flat oppose" onclick="Dialog_ajaxClear()">
{{ __('button.close') }}
</button>
</footer>
+18
View File
@@ -0,0 +1,18 @@
<section>
<h3>{{ __('chatrooms.destroy_title') }}</h3>
<br />
<h4 class="gray">{{ __('chatrooms.destroy_text') }}</h4>
<br />
<h4 class="gray">{{ room }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat color red"
onclick="RoomsUtils_ajaxDestroy('{{ room|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.destroy') }}
</button>
</footer>
+155
View File
@@ -0,0 +1,155 @@
<section class="scroll">
<header class="big"
style="background-image: linear-gradient(to bottom, rgba(23,23,23,0.8) 0%, rgba(23,23,23,0.5) 100%), url('{{ c.picture }}');"
>
<ul class="list thick">
<li>
<span class="primary icon bubble active"
style="background-image: url({{ c.picture }});">
</span>
<span title="{{ __('chatrooms.config') }}"
class="control icon active"
onclick="RoomsUtils_ajaxAdd('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">edit</i>
</span>
<span title="{{ __('button.delete') }}"
class="control icon active"
onclick="RoomsUtils_ajaxRemove('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">delete</i>
</span>
<div>
<p class="line" title="{{ room }}">
{{ c.title }}
</p>
<p class="line">{{ room }}</p>
</div>
</li>
</ul>
</header>
<ul class="list middle">
{% if c.group %}
<li>
<span class="primary icon gray">
<i class="material-symbols">people_alt</i>
</span>
<div>
<p class="line">{{ __('room.group_chat') }}</p>
<p class="all">{{ __('room.group_chat_text') }}</p>
</div>
</li>
{% else %}
<li>
<span class="primary icon gray">
<i class="material-symbols">wifi_tethering</i>
</span>
<div>
<p class="line">{{ __('room.channel') }}</p>
<p class="all">{{ __('room.channel_text') }}</p>
</div>
</li>
{% endif %}
</ul>
<ul class="list">
{% if c.subject %}
<li>
<span class="primary icon gray">
<i class="material-symbols">info_i</i>
</span>
<div>
<p class="line">{{ __('page.about') }}</p>
<p class="all">{{ subject_html|safe }}</p>
</div>
</li>
{% endif %}
{% if c.description %}
<li>
<span class="primary icon gray">
<i class="material-symbols">short_text</i>
</span>
<div>
<p class="line">{{ __('information.description') }}</p>
<p class="all">{{ c.description }}</p>
</div>
</li>
{% endif %}
{% if c.public %}
<li>
<span class="primary icon gray">
<i class="material-symbols">explore</i>
</span>
<div>
<p class="line">{{ __('room.public_muc') }}</p>
<p class="all">{{ __('room.public_muc_text') }}</p>
</div>
</li>
{% endif %}
{% if c.mam %}
<li>
<span class="primary icon gray">
<i class="material-symbols">archive</i>
</span>
<div>
<p class="line">{{ __('room.archived') }}</p>
<p class="all">{{ __('room.archived_text') }}</p>
</div>
</li>
{% endif %}
<li class="subheader">
<div>
<p>{{ __('room.notify_title') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">{% if c.notify == 0 %}notifications_off{% elif c.notify == 2 %}notifications_active{% else %}notifications{% endif %}</i>
</span>
<span class="control icon gray active"
onclick="RoomsUtils_ajaxAdd('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">settings</i>
</span>
<div>
<p class="line">{{ __('room.notify_title') }}</p>
<p class="line">{% if c.notify == 0 %}{{ __('room.notify_never') }}{% elif c.notify == 2 %}{{ __('room.notify_always') }}{% else %}{{ __('room.notify_mentioned') }}{% endif %}</p>
</div>
</li>
</ul>
<ul class="list">
<li class="subheader">
<div>
<p>{{ __('chatrooms.members') }} <span class="second">{{ c.count }}</span></p>
</div>
</li>
<li class="active" onclick="RoomsUtils_ajaxAskInvite('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">person_add</i>
</span>
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('room.group_chat_add') }}</p>
</div>
</li>
</ul>
<ul class="list thin" id="room_presences_list">
{{ presences|safe }}
</ul>
{% if c.affiliation == 'owner' %}
<ul class="list active">
<hr />
<li onclick="RoomsUtils_ajaxGetConfig('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon gray"><i class="material-symbols">settings</i></span>
<div><p class="line">{{ __('chatrooms.config') }}</p></div>
</li>
<li onclick="RoomsUtils_ajaxAskDestroy('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon red"><i class="material-symbols">delete_forever</i></span>
<div><p class="line">{{ __('button.destroy') }}</p></div>
</li>
</ul>
{% endif %}
</section>
+44
View File
@@ -0,0 +1,44 @@
<section>
<form name="invite">
<h3>{{ __('room.invite') }}</h3>
<h4>{{ room }}</h4>
<div>
<input type="hidden" value="{{ room }}" name="to" id="to"/>
<datalist id="contact_list">
{% for value in contacts %}
<option value="{{ value }}"/>
{% endfor %}
</datalist>
<input
name="invite"
list="contact_list"
id="invite"
required
placeholder="user@server.tld"/>
<label>{{ __('roster.add_contact_info1') }}</label>
</div>
<div>
<ul class="list">
<li>
<span class="control icon gray active" onclick="Preview.copyToClipboard('xmpp:{{ room|echapJS }}?join')">
<i class="material-symbols">content_copy</i>
</span>
<div>
<input readonly value="xmpp:{{ room }}?join">
<label>{{ __('room.invite_code') }}</label>
</div>
</li>
</ul>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.cancel') }}
</button>
<button
class="button flat"
onclick="RoomsUtils_ajaxInvite(MovimUtils.formToJson('invite'));">
{{ __('button.invite') }}
</button>
</footer>
@@ -0,0 +1,58 @@
{% set ns = namespace(affiliation=none) %}
{% for value in presences %}
{% if ns.affiliation != value.affiliation_txt and page == 1 and not compact %}
<li class="subheader sticky">
{% if value.affiliation == 'owner' %}
<span class="control icon tiny yellow" title="{{ __('affiliation.owner') }}">
<i class="material-symbols fill">star</i>
</span>
{% elif value.affiliation == 'admin' %}
<span class="control icon tiny gray" title="{{ __('affiliation.admin') }}">
<i class="material-symbols fill">star</i>
</span>
{% endif %}
<div>
<p>
{{ value.affiliation_txt }}
</p>
</div>
</li>
{% endif %}
<li title="{{ value.nick }}" name="{{ value.jid|default('')|cleanupId }}-{{ value.role|cleanupId }}-{{ value.nick|cleanupId }}"
{% if compact %}onclick="Chat.quoteMUC('{{ value.nick|echapJS }}', true);"{% endif %}>
<span class="primary icon bubble small status {{ value.presence }} {% if value.jid %}active{% endif %}"
{% if value.jid and not compact %}onclick="ChatActions_ajaxGetContact('{{ value.jid|echapJS }}'); Drawer.clear();"{% endif %}>
<img loading="lazy" src="{{ value.picture }}">
</span>
{% if not compact %}
{% if value.jid and value.jid != me %}
<span class="control icon active gray divided" onclick="Chats_ajaxOpen('{{ value.jid|echapJS }}', true); Drawer.clear();">
<i class="material-symbols">comment</i>
</span>
{% elif not value.jid and not value.self %}
<span class="control icon active gray divided" onclick="Chats_ajaxOpen('{{ (room ~ '/' ~ value.nick)|echapJS }}', true); Drawer.clear();">
<i class="material-symbols">comment</i>
</span>
{% endif %}
{% if can_moderate and not value.self %}
<span class="control icon active gray divided" onclick="RoomsUtils_ajaxConfigureUser('{{ room|echapJS }}', '{{ value.nick|echapJS }}'); Drawer.clear();">
<i class="material-symbols">manage_accounts</i>
</span>
{% endif %}
{% endif %}
<div>
<p class="line">
{{ value.nick }}
{% if value.role == 'visitor' %}
<span class="second gray" title="{{ __('room.visitor') }}">
<i class="material-symbols">voice_selection_off</i>
</span>
{% endif %}
</p>
{% if value.status and not compact %}
<p class="line" title="{{ value.status }}">{{ value.status }}</p>
{% endif %}
</div>
</li>
{% set ns.affiliation = value.affiliation_txt %}
{% endfor %}
+18
View File
@@ -0,0 +1,18 @@
<section>
<h3>{{ __('chatrooms.remove_title') }}</h3>
<br />
<h4 class="gray">{{ __('chatrooms.remove_text') }}</h4>
<br />
<h4 class="gray">{{ room }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat"
onclick="Rooms_ajaxExit('{{ room|echapJS }}'); RoomsUtils_ajaxRemoveConfirm('{{ room|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.remove') }}
</button>
</footer>
@@ -0,0 +1,56 @@
<section>
{% if room %}
<ul class="list thick">
<li>
<div>
<p>{{ __('chatrooms.discover') }}</p>
<p class="line">{{ room }}</p>
</div>
</li>
</ul>
{% else %}
<h3>{{ __('chatrooms.discover') }}</h3>
{% endif %}
<form name="rooms_discover">
{% if not room %}
<datalist id="suggestions">
</datalist>
<div id="bookmarkmucadd_jid">
<ul class="list">
<li>
<span class="control icon divided gray active" >
<i class="material-symbols">search</i>
</span>
<div>
<input
name="jid"
placeholder="chatroom@{% if mucservice %}{{ mucservice }}{% else %}server.com{% endif %}"
type="email"
list="suggestions"
oninput="Rooms.cleanId(this); Rooms.suggest(); MovimUtils.addClass('#rooms_discover_add', 'disabled')"
onblur="RoomsUtils_ajaxDiscoRoom(this.value)"
required />
<label>{{ __('chatrooms.id') }}</label>
</div>
</li>
</ul>
</div>
{% else %}
<input type="hidden" name="jid" value="{{ room }}">
{% endif %}
</form>
<div id="rooms_discover_result"></div>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button id="rooms_discover_add"
onclick="RoomsUtils_ajaxAdd(document.querySelector('form[name=rooms_discover] input[name=jid]').value);"
class="button color green disabled">
{{ __('button.add') }}
</button>
</footer>
@@ -0,0 +1,11 @@
<ul class="list thick">
<li>
<span class="primary icon red">
<i class="material-symbols">error</i>
</span>
<div>
<p></p>
<p>{{ __('chatrooms.disco_error') }}</p>
</div>
</li>
</ul>
@@ -0,0 +1,35 @@
{% if muc %}
<ul class="list thick flex card">
<li class="block large">
<div>
<p class="line">
{% if occupants %}
<span class="info">{{ occupants }} <i class="material-symbols">people</i></span>
{% endif %}
{{ name }}
<span class="second">
{% if group %}
<i class="material-symbols">people_alt</i> {{ __('room.group_chat') }}
{% else %}
<i class="material-symbols">wifi_tethering</i> {{ __('room.channel') }}
{% endif %}
</span>
</p>
<p>{{ description }}</p>
<p></p>
</div>
</li>
</ul>
{% else %}
<ul class="list">
<li>
<span class="primary icon red">
<i class="material-symbols">error</i>
</span>
<div>
<p></p>
<p>{{ __('chatrooms.disco_not_muc') }}</p>
</div>
</li>
</ul>
{% endif %}
+20
View File
@@ -0,0 +1,20 @@
<section>
<form name="changesubject">
<h3>{{ __('chatrooms.subject') }}</h3>
<div>
<textarea name="subject" placeholder="{{ __('chatrooms.subject') }}">{% if subject %}{{ subject }}{% endif %}</textarea>
<label for="subject">{{ __('chatrooms.subject') }}</label>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.close') }}
</button>
<button
class="button flat"
onclick="RoomsUtils_ajaxSetSubject('{{ room|echapJS }}', MovimUtils.formToJson('changesubject')); Dialog_ajaxClear();">
{{ __('button.save') }}
</button>
</footer>
+55
View File
@@ -0,0 +1,55 @@
<section id="search">
{% if chatroomactions %}
<ul class="list flex active card shadow thick">
<li class="block color" onclick="RoomsUtils_ajaxHttpRoomDiscover(); Drawer.clear()">
<i class="main material-symbols">chat</i>
<span class="primary icon">
<i class="material-symbols">groups</i>
</span>
<div>
<p class="line two">
{{ __('chatrooms.join') }}
</p>
<p></p>
</div>
</li>
<li class="block" onclick="RoomsUtils_ajaxAdd(false, null, true); Drawer.clear()">
<i class="main material-symbols">star</i>
<span class="primary icon transparent">
<i class="material-symbols">group_add</i>
</span>
<div>
<p class="line two">
{{ __('chatrooms.create') }}
</p>
<p></p>
</div>
</li>
</ul>
{% endif %}
<ul id="roster" class="list spin"></ul>
<div id="results">
<div class="placeholder">
<i class="material-symbols">search</i>
<h4>{{ __('input.open_me_using') }} <span class="chip outline">Ctrl</span> + <span class="chip outline">M</span></h4>
</div>
</div>
<br />
</section>
<footer id="searchbar">
<ul class="list">
<li class="search">
<form name="search" onsubmit="return false;">
<div>
<input name="keyword" autocomplete="off"
title="{{ __('search.keyword') }}"
placeholder="{{ __('search.placeholder') }}"
oninput="Search.searchSomething(this.value)"
type="text">
</div>
</form>
</li>
</ul>
</footer>
+37
View File
@@ -0,0 +1,37 @@
{% if jid %}
<ul class="list middle active">
<li class="subheader">
<div>
<p>{{ __('search.keyword') }}</p>
</div>
</li>
<li onclick="Search.chat('{{ jid|echapJS }}', false)">
<span class="primary icon bubble">
<img src="{{ picture }}">
</span>
<span class="control icon gray">
<i class="material-symbols">comment</i>
</span>
<div>
<p class="line">{{ jid }}</p>
<p class="line">{{ __('chats.add') }}</p>
</div>
</li>
<li onclick="Notifications_ajaxAddAsk('{{ jid|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">person_add</i>
</span>
<div>
<p class="line">{{ __('roster.add_title') }}</p>
</div>
</li>
<li onclick="RoomsUtils_ajaxHttpRoomDiscover('{{ jid|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">groups</i>
</span>
<div>
<p class="line">{{ __('chatrooms.join') }}</p>
</div>
</li>
</ul>
{% endif %}
+97
View File
@@ -0,0 +1,97 @@
{% if contacts %}
<li class="subheader">
<div>
<p>{{ __('page.contacts') }}</p>
</div>
</li>
{% for value in contacts %}
<li
id="{{ value.jid|cleanupId }}"
title="{{ value.jid }}"
name="{{ value.jid|cleanupId }}-{{ value.truename|cleanupId }}-{% if value.groups %}{{ value.groups[0]|cleanupId }}{% endif %}{% if value.presence %}-{{ value.presence|cleanupId }}{% endif %}"
class="{% if not value.presence %}faded{% endif %}"
>
<span class="primary icon bubble active {% if not value.presence %}faded{% else %}status {{ value.presence }}{% endif %}"
onclick="ChatActions_ajaxGetContact('{{ value.jid|echapJS }}'); Drawer.clear();">
<a href="#" onclick="listIconClick(event)">
<img loading="lazy" src="{{ value.picture }}">
</a>
</span>
{% if value.call_audio %}
<span title="{{ __('button.audio_call') }}" class="control icon active gray"
onclick="Visio_ajaxGetLobby('{{ value.call_audio|echapJS }}', true); Drawer.clear();">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">phone</i>
</a>
</span>
{% endif %}
{% if value.call_video %}
<span title="{{ __('button.video_call') }}" class="control icon active gray"
onclick="Visio_ajaxGetLobby('{{ value.call_video|echapJS }}', true, true); Drawer.clear();">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">videocam</i>
</a>
</span>
{% endif %}
<span class="control icon active gray divided" onclick="Search.chat('{{ value.jid|echapJS }}', false)">
<a href="#" onclick="listIconClick(event)">
<i class="material-symbols">comment</i>
</a>
</span>
<div>
<p class="line">
{{ value.truename }}
{% for g in value.groups %}
<span class="tag color {{ g|stringToColor }}">
{{ g }}
</span>
{% endfor %}
{% if value.subscription and value.subscription != 'both' %}
<span class="second">
{% if value.subscription == 'to' %}
<i class="material-symbols">arrow_upward</i>
{% elif value.subscription == 'from' %}
<i class="material-symbols">arrow_downward</i>
{% else %}
<i class="material-symbols">block</i>
{% endif %}
</span>
{% endif %}
</p>
{% if value.status %}
<p>{{ value.status }}</p>
{% elif value.presence_text %}
<p>{{ value.presence_text }}</p>
{% endif %}
</div>
</li>
{% endfor %}
{% if contacts|length > 7 %}
<li class="showall active" onclick="Search.showCompleteRoster(this)">
<span class="primary icon gray">
<i class="material-symbols">expand_more</i>
</span>
<div>
<p class="line">
{{ __('search.show_complete_roster') }}
<span class="second">{{ contacts|length }} <i class="material-symbols">people</i></span>
</p>
</div>
</li>
{% endif %}
{% else %}
<ul class="list thick">
<li>
<span class="primary icon blue">
<i class="material-symbols">help</i>
</span>
<div>
<p>{{ __('search.no_contacts_title') }}</p>
<p>{{ __('search.no_contacts_text') }}</p>
</div>
</li>
</ul>
{% endif %}
+15
View File
@@ -0,0 +1,15 @@
{% for value in shortcuts %}
<li onclick="Shortcuts.clear('{{ value.jid|echapJS }}'); Search.chat('{{ value.jid|echapJS }}', {% if value.muc %}true{% else %}false{% endif %})" data-jid="{{ value.jid }}">
<span class="primary icon bubble{% if value.muc %} symbol{% endif %}" data-counter="{% if value.muc %}notifications{% else %}{{ value.counter }}{% endif %}">
<a href="#" onclick="listIconClick(event)">
<img src="{{ value.picture }}">
</a>
</span>
<span class="control icon gray">
<i class="material-symbols">chat_paste_go</i>
</span>
<div>
<p class="line">{{ value.name }}</p>
</div>
</li>
{% endfor %}
+16
View File
@@ -0,0 +1,16 @@
<ul class="list navigation active" id="shortcuts_widget" dir="ltr"></ul>
<ul class="navigation list active" dir="ltr">
<li onclick="{% if page == 'chat' %}Rooms.toggleScroll(){% else %}MovimUtils.reload('{{ route('chat') }}'){% endif %}"
class="{% if page == 'chat' %}active{% endif %}"
title="{{ __('page.chats') }}"
>
<span class="primary icon" id="chatcounter" {% if counter > 0 %}data-counter="{{ counter }}"{% endif %}>
<a href="#" onclick="listIconClick(event);">
<i class="material-symbols">chat_bubble</i>
</a>
</span>
<div>
<p>{{ __('page.chats') }}</p>
</div>
</li>
</ul>
+34
View File
@@ -0,0 +1,34 @@
<div id="snap">
<video autoplay poster="{{ base_uri }}theme/img/empty.png"></video>
<canvas id="snapcanvas"></canvas>
<select id="snapsource"></select>
<div class="bottom_center">
<button id="snapswitch" class="button action color transparent">
<i class="material-symbols">switch_camera</i>
</button>
<button id="snapshoot" class="button action color green">
<i class="material-symbols">camera</i>
</button>
<button id="snapclose" class="button action color transparent">
<i class="material-symbols">close</i>
</button>
<button id="snapupload" class="button action color blue">
<i class="material-symbols">publish</i>
</button>
<button id="snapdraw" class="button action color transparent">
<i class="material-symbols">gesture</i>
</button>
<button id="snapwait" class="button action color gray">
<i class="material-symbols">more_horiz</i>
</button>
</div>
<ul class="list controls middle">
<li>
<span id="snapback" class="primary icon active">
<i class="material-symbols">arrow_back</i>
</span>
<div></div>
</li>
</ul>
</div>
+112
View File
@@ -0,0 +1,112 @@
<section>
<div class="emojis_grid results"></div>
{% if suggested %}
<div class="emojis_grid main">
{% for value in suggested %}
<img title="{{ value.emoji }}" data-emoji="{{ value.emoji }}" class="emoji large" src="{{ value.url }}">
{% endfor %}
</div>
{% endif %}
<div class="emojis_grid">
<img data-emoji="♥" alt=":hearts:" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/2665.svg">
<img data-emoji="👍" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44d.svg">
<img data-emoji="👎" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44e.svg">
<img data-emoji="😂" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f602.svg">
<img data-emoji="😊" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60a.svg">
<img data-emoji="😉" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f609.svg">
<img data-emoji="😀" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f600.svg">
<img data-emoji="😁" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f601.svg">
<img data-emoji="😃" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f603.svg">
<img data-emoji="😄" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f604.svg">
<img data-emoji="😅" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f605.svg">
<img data-emoji="🤭" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f92d.svg">
<img data-emoji="🧐" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f9d0.svg">
<img data-emoji="🤯" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f92f.svg">
<img data-emoji="🤑" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f911.svg">
<img data-emoji="🤤" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f924.svg">
<img data-emoji="🙄" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f644.svg">
<img data-emoji="🤔" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f914.svg">
<img data-emoji="🤗" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f917.svg">
<img data-emoji="🤩" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f929.svg">
<img data-emoji="🤨" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f928.svg">
<img data-emoji="🤪" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f92a.svg">
<img data-emoji="🤢" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f922.svg">
<img data-emoji="😆" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f606.svg">
<img data-emoji="😇" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f607.svg">
<img data-emoji="😈" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f608.svg">
<img data-emoji="😋" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60b.svg">
<img data-emoji="😌" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60c.svg">
<img data-emoji="😍" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60d.svg">
<img data-emoji="😎" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60e.svg">
<img data-emoji="😏" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f60f.svg">
<img data-emoji="😐" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f610.svg">
<img data-emoji="😑" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f611.svg">
<img data-emoji="😒" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f612.svg">
<img data-emoji="😓" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f613.svg">
<img data-emoji="😔" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f614.svg">
<img data-emoji="😕" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f615.svg">
<img data-emoji="😖" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f616.svg">
<img data-emoji="😗" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f617.svg">
<img data-emoji="😘" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f618.svg">
<img data-emoji="😙" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f619.svg">
<img data-emoji="😚" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61a.svg">
<img data-emoji="😛" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61b.svg">
<img data-emoji="😜" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61c.svg">
<img data-emoji="😝" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61d.svg">
<img data-emoji="😞" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61e.svg">
<img data-emoji="😟" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f61f.svg">
<img data-emoji="😠" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f620.svg">
<img data-emoji="😡" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f621.svg">
<img data-emoji="😢" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f622.svg">
<img data-emoji="😣" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f623.svg">
<img data-emoji="😤" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f624.svg">
<img data-emoji="😥" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f625.svg">
<img data-emoji="😦" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f626.svg">
<img data-emoji="😧" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f627.svg">
<img data-emoji="😨" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f628.svg">
<img data-emoji="😩" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f629.svg">
<img data-emoji="😪" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62a.svg">
<img data-emoji="😫" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62b.svg">
<img data-emoji="😬" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62c.svg">
<img data-emoji="😭" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62d.svg">
<img data-emoji="😮" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62e.svg">
<img data-emoji="😯" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f62f.svg">
<img data-emoji="😰" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f630.svg">
<img data-emoji="😱" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f631.svg">
<img data-emoji="😲" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f632.svg">
<img data-emoji="😳" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f633.svg">
<img data-emoji="😴" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f634.svg">
<img data-emoji="👊" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44a.svg">
<img data-emoji="👋" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44b.svg">
<img data-emoji="👌" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44c.svg">
<img data-emoji="👏" class="emoji large" src="{{ base_uri }}theme/img/emojis/svg/1f44f.svg">
</div>
</section>
<ul class="list">
<li class="search">
<form name="search" onsubmit="return false;">
<div>
<input name="keyword" autocomplete="off"
title="{{ __('message.emoji_help') }}"
placeholder="{{ __('message.emoji_help') }}"
oninput="Chat.checkEmojis(this.value, true, true);
Stickers.setEmojisEvent({% if mid %}{{ mid }}{% endif %});"
type="text">
</div>
</form>
</li>
</ul>
+25
View File
@@ -0,0 +1,25 @@
<div id="subscribe">
<div class="placeholder">
<i class="material-symbols">how_to_reg</i>
<h1>{{ __('subscribe.title') }}</h1>
<h4>{{ __('subscribe.info') }}</h4>
</div>
<ul class="list card active flex thick">
{% for server in servers %}
<li class="block large color {{ server|stringToColor }}"
onclick="MovimUtils.redirect('{{ route('register', server)|echapJS }}')">
<i class="material-symbols main">person</i>
<span class="primary icon bubble color transparent">
{{ server|firstLetter }}
</span>
<span class="control icon">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p>{{ server }}</p>
</div>
</li>
{% endfor %}
</ul>
</div>
+1
View File
@@ -0,0 +1 @@
<div role="status" id="toast" class="toast"></div>
+82
View File
@@ -0,0 +1,82 @@
<section id="upload">
<h3>{{ __('upload.title') }}</h3>
<ul class="list thick">
<li>
<span class="control icon active divided" onclick="Upload.openImage()">
<i class="material-symbols">image</i>
</span>
<span class="control icon active" onclick="Upload.openFile()">
<i class="material-symbols">insert_drive_file</i>
</span>
<div>
<p>{{ __('upload.choose') }}</p>
{% if max_size %}
<p class="limit" data-limit="{{ max_size }}">{{ __('upload.max_size', max_size_human) }}</p>
{% endif %}
<input type="file" id="file" onchange="Upload.preview()"/>
<input type="file" id="image" accept="image/*" onchange="Upload.preview()"/>
</div>
</li>
</ul>
<ul class="list">
<div class="drop">
<img class="preview_picture transparent" />
<li>
<span class="primary icon gray">
<i class="material-symbols on_desktop">system_update_alt</i>
<i class="material-symbols on_mobile">photo_size_select_large</i>
</span>
<div>
<p class="on_desktop">
{{ __('upload.drag_drop') }}
</p>
<p>
{{ __('upload.info') }}
</p>
</div>
</li>
<li class="file">
<div>
<p class="name line center"></p>
<p class="desc line center"></p>
</div>
<span class="primary active bubble color icon green">
<i class="material-symbols">gesture</i>
</span>
</li>
</div>
</ul>
<ul class="list thick" id="encrypted_warning">
<li>
<span class="primary icon red">
<i class="material-symbols">warning</i>
</span>
<div>
<p></p>
<p class="all">{{ __('upload.encrypted_warning') }}</p>
</div>
</li>
</ul>
</section>
<footer>
<ul id="upload_progress" class="list">
<li>
<span class="primary icon compress">
<i class="material-symbols"></i>
</span>
<span class="primary icon upload">
<i class="material-symbols"></i>
</span>
<div>
<p class="line"></p>
</div>
</li>
</ul>
<button onclick="Dialog_ajaxClear(); Upload.abort();" class="button flat">
{{ __('button.close') }}
</button>
<button id="upload_button" onclick="Upload.init();" class="button color disabled">
{{ __('button.upload') }}
</button>
</footer>
+61
View File
@@ -0,0 +1,61 @@
<form name="vcard4" id="vcard4form">
<div>
<ul class="list">
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">face</i>
</span>
<div>
<input dir="auto" type="text" name="fn" value="{{ contact.fn or '' }}" placeholder="{{ __('general.name') }}">
<label for="fn">{{ __('general.name') }}</label>
</div>
</li>
<li>
<span class="primary" aria-hidden="true"></span>
<div>
<input dir="auto" type="text" name="name" value="{{ contact.nickname or '' }}" placeholder="{{ __('general.nickname') }}">
<label for="name">{{ __('general.nickname') }}</label>
<span class="supporting"><i class="material-symbols">lightbulb</i> {{ __('vcard.nickname_info') }}</span>
</div>
</li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">email</i>
</span>
<div>
<input type="email" name="email" value="{{ contact.email or '' }}" placeholder="{{ __('general.email') }}">
<label for="email">{{ __('general.email') }}</label>
</div>
</li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">link</i>
</span>
<div>
<input type="url" name="url" value="{{ contact.url or '' }}" placeholder="https://mywebsite.com/">
<label for="url">{{ __('general.website') }}</label>
</div>
</li>
<li>
<span class="primary icon gray" aria-hidden="true">
<i class="material-symbols">short_text</i>
</span>
<div>
<textarea dir="auto" name="desc" id="desctext" placeholder="{{ __('general.about') }}" style="min-height: 3rem;">{{ contact.description or '' }}</textarea>
<label for="desc">{{ __('general.about') }}</label>
</div>
</li>
</ul>
</div>
<div class="block large">
<button
onclick="Vcard4_ajaxVcardSubmit(MovimUtils.formToJson('vcard4')); this.className='button oppose inactive';"
class="button color oppose" type="button" id="vcard4validate">
{{ __('button.save') }}
</button>
<button onclick="document.querySelector('#vcard4form').reset();" type="button" class="button flat oppose">
{{ __('button.reset') }}
</button>
</div>
</form>
+6
View File
@@ -0,0 +1,6 @@
<div class="tabelem" title="{{ __('vcard.title') }}" data-mobileicon="face" id="vcard4" >
<div id="avatar" class="spin"></div>
<div id="vcard_form">
{{ form|safe }}
</div>
</div>
@@ -0,0 +1,6 @@
<div class="placeholder show">
<i class="material-symbols">adaptive_audio_mic</i>
<h1>{{ conference.title }}</h1>
<h4 class="line">{{ __('visio.waiting_participants') }}</h4>
</div>
+7
View File
@@ -0,0 +1,7 @@
<div id="remote_level">
<div class="avatar">
<img src="{{ contact.picture }}">
</div>
</div>
<p class="center">{{ contact.truename }}</p>
<p class="state center"></p>
+126
View File
@@ -0,0 +1,126 @@
<section id="visio_lobby">
<ul class="list thick">
<li>
{% if contact %}
<span class="primary icon bubble">
<img src="{{ contact.picture }}">
</span>
<div>
<p class="line">
{% if calling %}
<i class="material-symbols icon blue">call</i>
{{ __('visiolobby.calling', contact.truename) }}
{% else %}
<i class="material-symbols icon blue">phone_callback</i>
{{ __('visiolobby.called', contact.truename) }}
{% endif %}
</p>
<p>{{ __('visiolobby.setup') }}</p>
</div>
{% else %}
<span class="primary icon bubble">
<img src="{{ conference.picture }}">
</span>
<div>
<p class="line">
{% if calling %}
<i class="material-symbols icon blue">call</i>
{{ __('visiolobby.muji_create', conference.title) }}
{% else %}
<i class="material-symbols icon blue">phone_callback</i>
{{ __('visiolobby.muji_join', conference.title) }}
{% endif %}
</p>
<p>{{ __('visiolobby.setup') }}</p>
</div>
{% endif %}
</li>
</ul>
<div class="placeholder">
<i class="material-symbols">camera_video</i>
<h4>{{ __('visiolobby.devices_disco') }}</h4>
</div>
<form>
<div>
<ul class="list">
<li id="default_microphone" class="muted">
<span class="primary icon gray">
<i class="material-symbols enabled">settings_voice</i>
<i class="material-symbols disabled">mic_off</i>
</span>
<div>
<div class="select">
<select name="default_microphone"></select>
</div>
<label for="default_microphone">{{ __('visiolobby.microphone_label') }}</label>
<span class="supporting">
{{ __('visiolobby.no_mic_sound') }}<br />
{{ __('visiolobby.no_mic_sound2') }}
</span>
</div>
</li>
<li>
<div id="mic_preview">
<div class="level">
<span class="disabled color green"></span>
<span class="disabled color green"></span>
<span class="disabled color green"></span>
<span class="disabled color green"></span>
<span class="disabled color green"></span>
<span class="disabled color yellow"></span>
<span class="disabled color yellow"></span>
<span class="disabled color yellow"></span>
<span class="disabled color yellow"></span>
<span class="disabled color red"></span>
</div>
</div>
</li>
{% if withvideo %}
<li>
<span class="primary icon gray">
<i class="material-symbols">video_camera_back</i>
</span>
<div>
<div class="select">
<select name="default_camera"></select>
</div>
<label for="default_camera">{{ __('visiolobby.camera_label') }}</label>
</div>
</li>
<li>
<span class="primary"></span>
<div><video id="camera_preview" muted></video></div>
</li>
{% endif %}
</ul>
</div>
</form>
</section>
<footer>
{% if not contact %}
<button onclick="VisioUtils.cancelLobby();" class="button flat red">
{{ __('button.cancel') }}
</button>
<button id="lobby_start" onclick="Visio_ajaxMujiPrepare('{% if calling %}{{ conference.jid|echapJS }}{% else %}{{ id|echapJS }}{% endif %}', {% if withvideo %}true{% else %}false{% endif %});" class="button color green disabled">
<i class="material-symbols">{% if withvideo %}videocam{% else %}call{% endif %}</i>
{% if calling %}{{ __('button.create') }}{% else %}{{ __('button.join') }}{% endif %}
</button>
{% elif calling %}
<button onclick="VisioUtils.cancelLobby();" class="button flat red">
{{ __('button.cancel') }}
</button>
<button id="lobby_start" onclick="MovimVisio.init('{{ fullJid|echapJS }}', '{{ contact.id|echapJS }}', null, {% if withvideo %}true{% else %}false{% endif %}, false, null, '{{ contact.truename|echapJS }}', '{{ contact.picture|echapJS }}');" class="button color green disabled">
<i class="material-symbols">{% if withvideo %}videocam{% else %}call{% endif %}</i>
{{ __('button.call') }}
</button>
{% else %}
<button onclick="VisioUtils.cancelLobby('{{ fullJid|echapJS }}', '{{ id|echapJS }}');" class="button color red">
<i class="material-symbols">call_end</i>
{{ __('button.refuse') }}
</button>
<button id="lobby_start" onclick="MovimVisio.init('{{ fullJid|echapJS }}', '{{ contact.id|echapJS }}', '{{ id|echapJS }}', {% if withvideo %}true{% else %}false{% endif %}, false, null, '{{ contact.truename|echapJS }}', '{{ contact.picture|echapJS }}');" class="button color green disabled">
<i class="material-symbols">{% if withvideo %}videocam{% else %}call{% endif %}</i>
{{ __('button.reply') }}
</button>
{% endif %}
</footer>

Some files were not shown because too many files have changed in this diff Show More