This commit is contained in:
nnduc
2026-10-24 14:03:52 +07:00
commit 4fe046de58
4790 changed files with 311146 additions and 0 deletions
+219
View File
@@ -0,0 +1,219 @@
<section>
{% if id %}
<ul class="list thick">
<li>
{% if conference %}
<span class="primary icon bubble">
<img src="{{ conference.picture }}">
</span>
<span class="control icon gray divided active" onclick="RoomsUtils_ajaxRemove('{{ conference.jid|echapJS }}');">
<i class="material-symbols">delete</i>
</span>
{% endif %}
<div>
<p class="line">{% if conference %}{{ conference.title }}{% else %}{{ id }}{% endif %}</p>
<p>{{ __('chatrooms.edit') }}</p>
</div>
</li>
</ul>
{% else %}
<h3>{{ __('chatrooms.create') }}</h3>
{% endif %}
<form name="bookmarkmucadd">
{% if create %}
<div>
<ul class="list middle">
<li>
<span class="primary icon gray">
<i class="material-symbols">people_alt</i>
</span>
<span class="control">
<div class="radio">
<input name="type" value="groupchat"
id="type_groupchat" type="radio"
checked>
<label for="type_groupchat"></label>
</div>
</span>
<div>
<p>{{ __('room.group_chat') }}</p>
<p>{{ __('room.group_chat_text') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">wifi_tethering</i>
</span>
<span class="control">
<div class="radio">
<input name="type" value="channel"
id="type_channel" type="radio">
<label for="type_channel"></label>
</div>
</span>
<div>
<p>{{ __('room.channel') }}</p>
<p>{{ __('room.channel_text') }}</p>
</div>
</li>
</ul>
</div>
<div>
<input
{% if conference %}
value="{{ conference.name }}"
{% elif info %}
value="{{ info.name }}"
{% elif name %}
value="{{ name }}"
{% endif %}
name="name"
placeholder="{{ __('chatrooms.name_placeholder') }}"
onblur="RoomsUtils_ajaxResolveSlug(this.value)"
required />
<label>{{ __('general.name') }}</label>
</div>
{% endif %}
{% if id and not create %}
<input type="hidden" value="{{ id }}" name="jid"/>
{% else %}
<div id="bookmarkmucadd_jid">
<input
name="jid"
{% if mucservice %}
placeholder="chatroom@{{ mucservice.server }}"
{% else %}
placeholder="chatroom@server.com"
{% endif %}
type="email"
list="suggestions"
oninput="Rooms.cleanId(this); Rooms.suggest()"
required />
<label>{{ __('chatrooms.id') }}</label>
</div>
{% endif %}
<div>
<ul class="list">
{% if not create %}
<li>
<div>
<input
{% if conference %}
value="{{ conference.name }}"
{% elif info %}
value="{{ info.name }}"
{% elif name %}
value="{{ name }}"
{% endif %}
name="name"
type="hidden"
required />
</div>
</li>
{% endif %}
<li>
<span class="primary icon gray">
<i class="material-symbols">person_book</i>
</span>
<div>
<input
{% if conference and conference.nick %}
value="{{ conference.nick }}"
{% else %}
value="{{ username }}"
{% endif %}
name="nick"
placeholder="{{ username }}"/>
<label>{{ __('general.nickname') }}</label>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">edit_notifications</i>
</span>
<div>
<div class="select">
<select name="notify">
<option value="never" {% if conference and conference.notify == 0 %}selected{% endif %}>
{{ __('room.notify_never') }}
</option>
<option value="on-mention" {% if conference and conference.notify == 1 %}selected{% endif %}
{% if not conference %}selected{% endif %}>
{{ __('room.notify_mentioned') }}
</option>
<option value="always" {% if conference and conference.notify == 2 %}selected{% endif %}>
{{ __('room.notify_always') }}
</option>
</select>
</div>
<label>{{ __('room.notify_title') }}</label>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">login</i>
</span>
<span class="control">
<div class="checkbox">
<input
{% if conference and conference.autojoin %}
checked
{% endif %}
type="checkbox"
id="autojoin"
name="autojoin"/>
<label for="autojoin"></label>
</div>
</span>
<div>
<p class="all">{{ __('chatrooms.autojoin') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">push_pin</i>
</span>
<span class="control">
<div class="checkbox">
<input
{% if conference and conference.pinned %}
checked
{% endif %}
type="checkbox"
id="pinned"
name="pinned"/>
<label for="pinned"></label>
</div>
</span>
<div>
<p>{{ __('chatrooms.pinned') }}</p>
</div>
</li>
</ul>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.cancel') }}
</button>
<button
class="button flat"
{% if create %}
onclick="RoomsUtils_ajaxAddCreate(MovimUtils.formToJson('bookmarkmucadd'));"
{% else %}
onclick="RoomsUtils_ajaxAddConfirm(MovimUtils.formToJson('bookmarkmucadd'));"
{% endif %}
>
{% if conference %}
{{ __('button.edit') }}
{% else %}
{{ __('button.add') }}
{% endif %}
</button>
</footer>
+31
View File
@@ -0,0 +1,31 @@
<section class="scroll">
<ul class="list thick">
<li>
{% if owner %}
<span class="control icon divided active"
title="{{ __('button.destroy') }}"
onclick="RoomsUtils_ajaxAskDestroy('{{ room|echapJS }}');">
<i class="material-symbols">delete</i>
</span>
{% endif %}
<span class="primary icon bubble">
<img src="{{ picture }}">
</span>
<div>
<p class="line">{{ title }}</p>
<p>{{ __('chatrooms.configure') }}</p>
</div>
</li>
</ul>
<form name="config">
{{ form|safe }}
</form>
</section>
<footer>
<a onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.close') }}
</a>
<a onclick="RoomsUtils_ajaxSetConfig(MovimUtils.formToJson('config'), '{{ room|echapJS }}'); Dialog_ajaxClear();" class="button flat green color">
{{ __('button.save') }}
</a>
</footer>
@@ -0,0 +1,75 @@
<section>
<h3>{{ __('room.configure_user') }}</h3>
<ul class="list thick">
<li>
<span class="primary icon bubble small status {{ occupant.presence }}">
<img loading="lazy" src="{{ occupant.picture }}">
</span>
<div>
<p>{{ occupant.nick }}</p>
<p>{% if occupant.jid %}{{ occupant.jid }}{% endif %}</p>
</div>
</li>
</ul>
<ul class="list active">
{% if occupant.jid %}
<li>
<span class="primary icon gray">
<i class="material-symbols">assignment_ind</i>
</span>
<div>
<div class="select">
<select name="affiliation"
onchange="RoomsUtils_ajaxChangeAffiliation('{{ room|echapJS }}', '{{ occupant.jid|echapJS }}', this.value);">
<option value="owner" {% if occupant.affiliation == 'owner' %}selected{% endif %} {% if my_affiliation != 'owner' %}disabled{% endif %}>
{{ __('affiliation.owner') }}
</option>
<option value="admin" {% if occupant.affiliation == 'admin' %}selected{% endif %} {% if my_affiliation != 'owner' %}disabled{% endif %}>
{{ __('affiliation.admin') }}
</option>
<option value="member" {% if occupant.affiliation == 'member' %}selected{% endif %}>
{{ __('affiliation.member') }}
</option>
<option value="none" {% if occupant.affiliation == 'none' %}selected{% endif %}>
{{ __('affiliation.no') }}
</option>
</select>
</div>
<label>{{ __('room.role') }}</label>
</div>
</li>
{% endif %}
<li>
<span class="primary icon gray">
<i class="material-symbols">voice_selection</i>
</span>
<span class="control">
<div class="checkbox">
<input type="checkbox" id="voice" name="voice" {% if occupant.role != 'visitor' %}checked{% endif %}
onchange="RoomsUtils_ajaxChangeVoice('{{ room|echapJS }}', '{{ occupant.nick|echapJS }}', this.checked);">
<label for="voice"></label>
</div>
</span>
<div>
<p class="all">{{ __('room.allowed_send_messages') }}</p>
</div>
</li>
<hr />
<li onclick="RoomsUtils_ajaxKick('{{ room|echapJS }}', '{{ occupant.nick|echapJS }}'); Dialog_ajaxClear();">
<span class="primary icon gray"><i class="material-symbols">person_remove</i></span>
<div><p class="line">{{ __('room.kick') }}</p></div>
</li>
{% if occupant.jid %}
<li onclick="RoomsUtils_ajaxChangeAffiliation('{{ room|echapJS }}', '{{ occupant.jid|echapJS }}', 'outcast'); Dialog_ajaxClear();">
<span class="primary icon red"><i class="material-symbols">block</i></span>
<div><p class="line">{{ __('room.ban') }}</p></div>
</li>
{% endif %}
</ul>
</section>
<footer>
<button class="button flat oppose" onclick="Dialog_ajaxClear()">
{{ __('button.close') }}
</button>
</footer>
+18
View File
@@ -0,0 +1,18 @@
<section>
<h3>{{ __('chatrooms.destroy_title') }}</h3>
<br />
<h4 class="gray">{{ __('chatrooms.destroy_text') }}</h4>
<br />
<h4 class="gray">{{ room }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat color red"
onclick="RoomsUtils_ajaxDestroy('{{ room|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.destroy') }}
</button>
</footer>
+155
View File
@@ -0,0 +1,155 @@
<section class="scroll">
<header class="big"
style="background-image: linear-gradient(to bottom, rgba(23,23,23,0.8) 0%, rgba(23,23,23,0.5) 100%), url('{{ c.picture }}');"
>
<ul class="list thick">
<li>
<span class="primary icon bubble active"
style="background-image: url({{ c.picture }});">
</span>
<span title="{{ __('chatrooms.config') }}"
class="control icon active"
onclick="RoomsUtils_ajaxAdd('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">edit</i>
</span>
<span title="{{ __('button.delete') }}"
class="control icon active"
onclick="RoomsUtils_ajaxRemove('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">delete</i>
</span>
<div>
<p class="line" title="{{ room }}">
{{ c.title }}
</p>
<p class="line">{{ room }}</p>
</div>
</li>
</ul>
</header>
<ul class="list middle">
{% if c.group %}
<li>
<span class="primary icon gray">
<i class="material-symbols">people_alt</i>
</span>
<div>
<p class="line">{{ __('room.group_chat') }}</p>
<p class="all">{{ __('room.group_chat_text') }}</p>
</div>
</li>
{% else %}
<li>
<span class="primary icon gray">
<i class="material-symbols">wifi_tethering</i>
</span>
<div>
<p class="line">{{ __('room.channel') }}</p>
<p class="all">{{ __('room.channel_text') }}</p>
</div>
</li>
{% endif %}
</ul>
<ul class="list">
{% if c.subject %}
<li>
<span class="primary icon gray">
<i class="material-symbols">info_i</i>
</span>
<div>
<p class="line">{{ __('page.about') }}</p>
<p class="all">{{ subject_html|safe }}</p>
</div>
</li>
{% endif %}
{% if c.description %}
<li>
<span class="primary icon gray">
<i class="material-symbols">short_text</i>
</span>
<div>
<p class="line">{{ __('information.description') }}</p>
<p class="all">{{ c.description }}</p>
</div>
</li>
{% endif %}
{% if c.public %}
<li>
<span class="primary icon gray">
<i class="material-symbols">explore</i>
</span>
<div>
<p class="line">{{ __('room.public_muc') }}</p>
<p class="all">{{ __('room.public_muc_text') }}</p>
</div>
</li>
{% endif %}
{% if c.mam %}
<li>
<span class="primary icon gray">
<i class="material-symbols">archive</i>
</span>
<div>
<p class="line">{{ __('room.archived') }}</p>
<p class="all">{{ __('room.archived_text') }}</p>
</div>
</li>
{% endif %}
<li class="subheader">
<div>
<p>{{ __('room.notify_title') }}</p>
</div>
</li>
<li>
<span class="primary icon gray">
<i class="material-symbols">{% if c.notify == 0 %}notifications_off{% elif c.notify == 2 %}notifications_active{% else %}notifications{% endif %}</i>
</span>
<span class="control icon gray active"
onclick="RoomsUtils_ajaxAdd('{{ room|echapJS }}'); Drawer.clear()">
<i class="material-symbols">settings</i>
</span>
<div>
<p class="line">{{ __('room.notify_title') }}</p>
<p class="line">{% if c.notify == 0 %}{{ __('room.notify_never') }}{% elif c.notify == 2 %}{{ __('room.notify_always') }}{% else %}{{ __('room.notify_mentioned') }}{% endif %}</p>
</div>
</li>
</ul>
<ul class="list">
<li class="subheader">
<div>
<p>{{ __('chatrooms.members') }} <span class="second">{{ c.count }}</span></p>
</div>
</li>
<li class="active" onclick="RoomsUtils_ajaxAskInvite('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon gray">
<i class="material-symbols">person_add</i>
</span>
<span class="control icon gray">
<i class="material-symbols">chevron_right</i>
</span>
<div>
<p class="line">{{ __('room.group_chat_add') }}</p>
</div>
</li>
</ul>
<ul class="list thin" id="room_presences_list">
{{ presences|safe }}
</ul>
{% if c.affiliation == 'owner' %}
<ul class="list active">
<hr />
<li onclick="RoomsUtils_ajaxGetConfig('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon gray"><i class="material-symbols">settings</i></span>
<div><p class="line">{{ __('chatrooms.config') }}</p></div>
</li>
<li onclick="RoomsUtils_ajaxAskDestroy('{{ room|echapJS }}'); Drawer.clear();">
<span class="primary icon red"><i class="material-symbols">delete_forever</i></span>
<div><p class="line">{{ __('button.destroy') }}</p></div>
</li>
</ul>
{% endif %}
</section>
+44
View File
@@ -0,0 +1,44 @@
<section>
<form name="invite">
<h3>{{ __('room.invite') }}</h3>
<h4>{{ room }}</h4>
<div>
<input type="hidden" value="{{ room }}" name="to" id="to"/>
<datalist id="contact_list">
{% for value in contacts %}
<option value="{{ value }}"/>
{% endfor %}
</datalist>
<input
name="invite"
list="contact_list"
id="invite"
required
placeholder="user@server.tld"/>
<label>{{ __('roster.add_contact_info1') }}</label>
</div>
<div>
<ul class="list">
<li>
<span class="control icon gray active" onclick="Preview.copyToClipboard('xmpp:{{ room|echapJS }}?join')">
<i class="material-symbols">content_copy</i>
</span>
<div>
<input readonly value="xmpp:{{ room }}?join">
<label>{{ __('room.invite_code') }}</label>
</div>
</li>
</ul>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.cancel') }}
</button>
<button
class="button flat"
onclick="RoomsUtils_ajaxInvite(MovimUtils.formToJson('invite'));">
{{ __('button.invite') }}
</button>
</footer>
@@ -0,0 +1,58 @@
{% set ns = namespace(affiliation=none) %}
{% for value in presences %}
{% if ns.affiliation != value.affiliation_txt and page == 1 and not compact %}
<li class="subheader sticky">
{% if value.affiliation == 'owner' %}
<span class="control icon tiny yellow" title="{{ __('affiliation.owner') }}">
<i class="material-symbols fill">star</i>
</span>
{% elif value.affiliation == 'admin' %}
<span class="control icon tiny gray" title="{{ __('affiliation.admin') }}">
<i class="material-symbols fill">star</i>
</span>
{% endif %}
<div>
<p>
{{ value.affiliation_txt }}
</p>
</div>
</li>
{% endif %}
<li title="{{ value.nick }}" name="{{ value.jid|default('')|cleanupId }}-{{ value.role|cleanupId }}-{{ value.nick|cleanupId }}"
{% if compact %}onclick="Chat.quoteMUC('{{ value.nick|echapJS }}', true);"{% endif %}>
<span class="primary icon bubble small status {{ value.presence }} {% if value.jid %}active{% endif %}"
{% if value.jid and not compact %}onclick="ChatActions_ajaxGetContact('{{ value.jid|echapJS }}'); Drawer.clear();"{% endif %}>
<img loading="lazy" src="{{ value.picture }}">
</span>
{% if not compact %}
{% if value.jid and value.jid != me %}
<span class="control icon active gray divided" onclick="Chats_ajaxOpen('{{ value.jid|echapJS }}', true); Drawer.clear();">
<i class="material-symbols">comment</i>
</span>
{% elif not value.jid and not value.self %}
<span class="control icon active gray divided" onclick="Chats_ajaxOpen('{{ (room ~ '/' ~ value.nick)|echapJS }}', true); Drawer.clear();">
<i class="material-symbols">comment</i>
</span>
{% endif %}
{% if can_moderate and not value.self %}
<span class="control icon active gray divided" onclick="RoomsUtils_ajaxConfigureUser('{{ room|echapJS }}', '{{ value.nick|echapJS }}'); Drawer.clear();">
<i class="material-symbols">manage_accounts</i>
</span>
{% endif %}
{% endif %}
<div>
<p class="line">
{{ value.nick }}
{% if value.role == 'visitor' %}
<span class="second gray" title="{{ __('room.visitor') }}">
<i class="material-symbols">voice_selection_off</i>
</span>
{% endif %}
</p>
{% if value.status and not compact %}
<p class="line" title="{{ value.status }}">{{ value.status }}</p>
{% endif %}
</div>
</li>
{% set ns.affiliation = value.affiliation_txt %}
{% endfor %}
+18
View File
@@ -0,0 +1,18 @@
<section>
<h3>{{ __('chatrooms.remove_title') }}</h3>
<br />
<h4 class="gray">{{ __('chatrooms.remove_text') }}</h4>
<br />
<h4 class="gray">{{ room }}</h4>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button
name="submit"
class="button flat"
onclick="Rooms_ajaxExit('{{ room|echapJS }}'); RoomsUtils_ajaxRemoveConfirm('{{ room|echapJS }}'); Dialog_ajaxClear()">
{{ __('button.remove') }}
</button>
</footer>
@@ -0,0 +1,56 @@
<section>
{% if room %}
<ul class="list thick">
<li>
<div>
<p>{{ __('chatrooms.discover') }}</p>
<p class="line">{{ room }}</p>
</div>
</li>
</ul>
{% else %}
<h3>{{ __('chatrooms.discover') }}</h3>
{% endif %}
<form name="rooms_discover">
{% if not room %}
<datalist id="suggestions">
</datalist>
<div id="bookmarkmucadd_jid">
<ul class="list">
<li>
<span class="control icon divided gray active" >
<i class="material-symbols">search</i>
</span>
<div>
<input
name="jid"
placeholder="chatroom@{% if mucservice %}{{ mucservice }}{% else %}server.com{% endif %}"
type="email"
list="suggestions"
oninput="Rooms.cleanId(this); Rooms.suggest(); MovimUtils.addClass('#rooms_discover_add', 'disabled')"
onblur="RoomsUtils_ajaxDiscoRoom(this.value)"
required />
<label>{{ __('chatrooms.id') }}</label>
</div>
</li>
</ul>
</div>
{% else %}
<input type="hidden" name="jid" value="{{ room }}">
{% endif %}
</form>
<div id="rooms_discover_result"></div>
</section>
<footer>
<button onclick="Dialog_ajaxClear()" class="button flat">
{{ __('button.cancel') }}
</button>
<button id="rooms_discover_add"
onclick="RoomsUtils_ajaxAdd(document.querySelector('form[name=rooms_discover] input[name=jid]').value);"
class="button color green disabled">
{{ __('button.add') }}
</button>
</footer>
@@ -0,0 +1,11 @@
<ul class="list thick">
<li>
<span class="primary icon red">
<i class="material-symbols">error</i>
</span>
<div>
<p></p>
<p>{{ __('chatrooms.disco_error') }}</p>
</div>
</li>
</ul>
@@ -0,0 +1,35 @@
{% if muc %}
<ul class="list thick flex card">
<li class="block large">
<div>
<p class="line">
{% if occupants %}
<span class="info">{{ occupants }} <i class="material-symbols">people</i></span>
{% endif %}
{{ name }}
<span class="second">
{% if group %}
<i class="material-symbols">people_alt</i> {{ __('room.group_chat') }}
{% else %}
<i class="material-symbols">wifi_tethering</i> {{ __('room.channel') }}
{% endif %}
</span>
</p>
<p>{{ description }}</p>
<p></p>
</div>
</li>
</ul>
{% else %}
<ul class="list">
<li>
<span class="primary icon red">
<i class="material-symbols">error</i>
</span>
<div>
<p></p>
<p>{{ __('chatrooms.disco_not_muc') }}</p>
</div>
</li>
</ul>
{% endif %}
+20
View File
@@ -0,0 +1,20 @@
<section>
<form name="changesubject">
<h3>{{ __('chatrooms.subject') }}</h3>
<div>
<textarea name="subject" placeholder="{{ __('chatrooms.subject') }}">{% if subject %}{{ subject }}{% endif %}</textarea>
<label for="subject">{{ __('chatrooms.subject') }}</label>
</div>
</form>
</section>
<footer>
<button class="button flat" onclick="Dialog_ajaxClear()">
{{ __('button.close') }}
</button>
<button
class="button flat"
onclick="RoomsUtils_ajaxSetSubject('{{ room|echapJS }}', MovimUtils.formToJson('changesubject')); Dialog_ajaxClear();">
{{ __('button.save') }}
</button>
</footer>