init
This commit is contained in:
@@ -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 %}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,5 @@
|
||||
<li class="date">
|
||||
<div>
|
||||
<p>Date</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -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>
|
||||
@@ -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"/>
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
<li class="separator"></li>
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
{% 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
@@ -0,0 +1 @@
|
||||
<div role="dialog" id="dialog" class="dialog actions"></div>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<div id="draw"></div>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<div role="modal" id="drawer" class="drawer empty"></div>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
<div id="preview" role="dialog" aria-label="{{ __('publish.preview') }}"></div>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
<div role="status" id="toast" class="toast"></div>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
Reference in New Issue
Block a user