Merge branch 'dev' into websocket_scopes
This commit is contained in:
commit
3ddbe2e370
29 changed files with 389 additions and 540 deletions
24
README.md
vendored
24
README.md
vendored
|
@ -167,18 +167,18 @@ If you'd like to add translations, take a look at the [English translation file]
|
||||||
|
|
||||||
lang | done | missing
|
lang | done | missing
|
||||||
---- | ---- | -------
|
---- | ---- | -------
|
||||||
ca | 100% | old
|
ca | 99% | old,time,action
|
||||||
de | 87% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
de | 87% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
fa | 73% | cross_post,subscribed_to_communities,trending_communities,create_private_message,send_secure_message,send_message,message,mod,mods,moderates,remove_as_mod,appoint_as_mod,modlog,stickied,ban,ban_from_site,unban,unban_from_site,banned,number_of_subscribers,subscribers,both,saved,unsubscribe,subscribe,subscribed,old,api,docs,inbox,inbox_for,message_sent,notifications_error,messages,no_email_setup,matrix_user_id,private_message_disclaimer,url,body,copy_suggested_title,community,expand_here,subscribe_to_communities,theme,sponsor_message,general_sponsors,joined,by,to,from,landing_0,logged_in,community_moderator_already_exists,community_follower_already_exists,community_user_already_banned,no_slurs,admin_already_created,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
fa | 72% | cross_post,subscribed_to_communities,trending_communities,create_private_message,send_secure_message,send_message,message,mod,mods,moderates,remove_as_mod,appoint_as_mod,modlog,stickied,ban,ban_from_site,unban,unban_from_site,banned,number_of_subscribers,subscribers,both,saved,unsubscribe,subscribe,subscribed,old,api,docs,inbox,inbox_for,message_sent,notifications_error,messages,no_email_setup,matrix_user_id,private_message_disclaimer,url,body,copy_suggested_title,community,expand_here,subscribe_to_communities,theme,sponsor_message,general_sponsors,joined,by,to,from,landing_0,logged_in,community_moderator_already_exists,community_follower_already_exists,community_user_already_banned,no_slurs,admin_already_created,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
eo | 75% | number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
eo | 75% | number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
es | 100% | old
|
es | 99% | old,time,action
|
||||||
fi | 100% | old
|
fi | 99% | old,time,action
|
||||||
fr | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
fr | 82% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
it | 84% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
it | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
nl | 100% |
|
nl | 99% | time,action
|
||||||
ru | 72% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
ru | 71% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
sv | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
sv | 82% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
zh | 70% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
zh | 69% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action
|
||||||
<!-- translationsstop -->
|
<!-- translationsstop -->
|
||||||
|
|
||||||
If you'd like to update this report, run:
|
If you'd like to update this report, run:
|
||||||
|
|
2
ansible/templates/docker-compose.yml
vendored
2
ansible/templates/docker-compose.yml
vendored
|
@ -2,7 +2,7 @@ version: '3.3'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
lemmy:
|
lemmy:
|
||||||
image: dessalines/lemmy:v0.6.5
|
image: dessalines/lemmy:v0.6.8
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:8536:8536"
|
- "127.0.0.1:8536:8536"
|
||||||
restart: always
|
restart: always
|
||||||
|
|
9
ui/src/components/comment-form.tsx
vendored
9
ui/src/components/comment-form.tsx
vendored
|
@ -15,7 +15,6 @@ import { WebSocketService, UserService } from '../services';
|
||||||
import autosize from 'autosize';
|
import autosize from 'autosize';
|
||||||
import Tribute from 'tributejs/src/Tribute.js';
|
import Tribute from 'tributejs/src/Tribute.js';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface CommentFormProps {
|
interface CommentFormProps {
|
||||||
postId?: number;
|
postId?: number;
|
||||||
|
@ -127,7 +126,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
|
||||||
.previewMode && 'active'}`}
|
.previewMode && 'active'}`}
|
||||||
onClick={linkEvent(this, this.handlePreviewToggle)}
|
onClick={linkEvent(this, this.handlePreviewToggle)}
|
||||||
>
|
>
|
||||||
<T i18nKey="preview">#</T>
|
{i18n.t('preview')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{this.props.node && (
|
{this.props.node && (
|
||||||
|
@ -136,7 +135,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
|
||||||
class="btn btn-sm btn-secondary mr-2"
|
class="btn btn-sm btn-secondary mr-2"
|
||||||
onClick={linkEvent(this, this.handleReplyCancel)}
|
onClick={linkEvent(this, this.handleReplyCancel)}
|
||||||
>
|
>
|
||||||
<T i18nKey="cancel">#</T>
|
{i18n.t('cancel')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<a
|
<a
|
||||||
|
@ -144,14 +143,14 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="d-inline-block float-right text-muted small font-weight-bold"
|
class="d-inline-block float-right text-muted small font-weight-bold"
|
||||||
>
|
>
|
||||||
<T i18nKey="formatting_help">#</T>
|
{i18n.t('formatting_help')}
|
||||||
</a>
|
</a>
|
||||||
<form class="d-inline-block mr-2 float-right text-muted small font-weight-bold">
|
<form class="d-inline-block mr-2 float-right text-muted small font-weight-bold">
|
||||||
<label
|
<label
|
||||||
htmlFor={`file-upload-${this.id}`}
|
htmlFor={`file-upload-${this.id}`}
|
||||||
className={`${UserService.Instance.user && 'pointer'}`}
|
className={`${UserService.Instance.user && 'pointer'}`}
|
||||||
>
|
>
|
||||||
<T i18nKey="upload_image">#</T>
|
{i18n.t('upload_image')}
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
id={`file-upload-${this.id}`}
|
id={`file-upload-${this.id}`}
|
||||||
|
|
63
ui/src/components/comment-node.tsx
vendored
63
ui/src/components/comment-node.tsx
vendored
|
@ -30,7 +30,6 @@ import { MomentTime } from './moment-time';
|
||||||
import { CommentForm } from './comment-form';
|
import { CommentForm } from './comment-form';
|
||||||
import { CommentNodes } from './comment-nodes';
|
import { CommentNodes } from './comment-nodes';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface CommentNodeState {
|
interface CommentNodeState {
|
||||||
showReply: boolean;
|
showReply: boolean;
|
||||||
|
@ -180,22 +179,22 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
</li>
|
</li>
|
||||||
{this.isMod && (
|
{this.isMod && (
|
||||||
<li className="list-inline-item badge badge-light">
|
<li className="list-inline-item badge badge-light">
|
||||||
<T i18nKey="mod">#</T>
|
{i18n.t('mod')}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
{this.isAdmin && (
|
{this.isAdmin && (
|
||||||
<li className="list-inline-item badge badge-light">
|
<li className="list-inline-item badge badge-light">
|
||||||
<T i18nKey="admin">#</T>
|
{i18n.t('admin')}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
{this.isPostCreator && (
|
{this.isPostCreator && (
|
||||||
<li className="list-inline-item badge badge-light">
|
<li className="list-inline-item badge badge-light">
|
||||||
<T i18nKey="creator">#</T>
|
{i18n.t('creator')}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
{(node.comment.banned_from_community || node.comment.banned) && (
|
{(node.comment.banned_from_community || node.comment.banned) && (
|
||||||
<li className="list-inline-item badge badge-danger">
|
<li className="list-inline-item badge badge-danger">
|
||||||
<T i18nKey="banned">#</T>
|
{i18n.t('banned')}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
|
@ -258,7 +257,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleReplyClick)}
|
onClick={linkEvent(this, this.handleReplyClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="reply">#</T>
|
{i18n.t('reply')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item mr-2">
|
<li className="list-inline-item mr-2">
|
||||||
|
@ -276,7 +275,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleEditClick)}
|
onClick={linkEvent(this, this.handleEditClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="edit">#</T>
|
{i18n.t('edit')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
|
@ -307,7 +306,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
className="pointer"
|
className="pointer"
|
||||||
onClick={linkEvent(this, this.handleViewSource)}
|
onClick={linkEvent(this, this.handleViewSource)}
|
||||||
>
|
>
|
||||||
<T i18nKey="view_source">#</T>
|
{i18n.t('view_source')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
|
@ -315,7 +314,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
className="text-muted"
|
className="text-muted"
|
||||||
to={`/post/${node.comment.post_id}/comment/${node.comment.id}`}
|
to={`/post/${node.comment.post_id}/comment/${node.comment.id}`}
|
||||||
>
|
>
|
||||||
<T i18nKey="link">#</T>
|
{i18n.t('link')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
{/* Admins and mods can remove comments */}
|
{/* Admins and mods can remove comments */}
|
||||||
|
@ -331,7 +330,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleModRemoveShow
|
this.handleModRemoveShow
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="remove">#</T>
|
{i18n.t('remove')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
|
@ -341,7 +340,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleModRemoveSubmit
|
this.handleModRemoveSubmit
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="restore">#</T>
|
{i18n.t('restore')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -360,7 +359,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleModBanFromCommunityShow
|
this.handleModBanFromCommunityShow
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="ban">#</T>
|
{i18n.t('ban')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
|
@ -370,7 +369,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleModBanFromCommunitySubmit
|
this.handleModBanFromCommunitySubmit
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unban">#</T>
|
{i18n.t('unban')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -392,7 +391,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
|
@ -401,7 +400,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleAddModToCommunity
|
this.handleAddModToCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -410,7 +409,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleCancelConfirmAppointAsMod
|
this.handleCancelConfirmAppointAsMod
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -429,12 +428,12 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleShowConfirmTransferCommunity
|
this.handleShowConfirmTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="transfer_community">#</T>
|
{i18n.t('transfer_community')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
|
@ -443,7 +442,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleTransferCommunity
|
this.handleTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -452,7 +451,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleCancelShowConfirmTransferCommunity
|
this.handleCancelShowConfirmTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -468,7 +467,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModBanShow)}
|
onClick={linkEvent(this, this.handleModBanShow)}
|
||||||
>
|
>
|
||||||
<T i18nKey="ban_from_site">#</T>
|
{i18n.t('ban_from_site')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
|
@ -478,7 +477,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleModBanSubmit
|
this.handleModBanSubmit
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unban_from_site">#</T>
|
{i18n.t('unban_from_site')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -500,13 +499,13 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
onClick={linkEvent(this, this.handleAddAdmin)}
|
onClick={linkEvent(this, this.handleAddAdmin)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -515,7 +514,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleCancelConfirmAppointAsAdmin
|
this.handleCancelConfirmAppointAsAdmin
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -534,18 +533,18 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleShowConfirmTransferSite
|
this.handleShowConfirmTransferSite
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="transfer_site">#</T>
|
{i18n.t('transfer_site')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
onClick={linkEvent(this, this.handleTransferSite)}
|
onClick={linkEvent(this, this.handleTransferSite)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -554,7 +553,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
this.handleCancelShowConfirmTransferSite
|
this.handleCancelShowConfirmTransferSite
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -579,16 +578,14 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
||||||
onInput={linkEvent(this, this.handleModRemoveReasonChange)}
|
onInput={linkEvent(this, this.handleModRemoveReasonChange)}
|
||||||
/>
|
/>
|
||||||
<button type="submit" class="btn btn-secondary">
|
<button type="submit" class="btn btn-secondary">
|
||||||
<T i18nKey="remove_comment">#</T>
|
{i18n.t('remove_comment')}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
{this.state.showBanDialog && (
|
{this.state.showBanDialog && (
|
||||||
<form onSubmit={linkEvent(this, this.handleModBanBothSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleModBanBothSubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-form-label">
|
<label class="col-form-label">{i18n.t('reason')}</label>
|
||||||
<T i18nKey="reason">#</T>
|
|
||||||
</label>
|
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control mr-2"
|
class="form-control mr-2"
|
||||||
|
|
36
ui/src/components/communities.tsx
vendored
36
ui/src/components/communities.tsx
vendored
|
@ -15,7 +15,6 @@ import {
|
||||||
import { WebSocketService } from '../services';
|
import { WebSocketService } from '../services';
|
||||||
import { wsJsonToRes, toast } from '../utils';
|
import { wsJsonToRes, toast } from '../utils';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
declare const Sortable: any;
|
declare const Sortable: any;
|
||||||
|
|
||||||
|
@ -83,30 +82,20 @@ export class Communities extends Component<any, CommunitiesState> {
|
||||||
</h5>
|
</h5>
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
<h5>
|
<h5>{i18n.t('list_of_communities')}</h5>
|
||||||
<T i18nKey="list_of_communities">#</T>
|
|
||||||
</h5>
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table id="community_table" class="table table-sm table-hover">
|
<table id="community_table" class="table table-sm table-hover">
|
||||||
<thead class="pointer">
|
<thead class="pointer">
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th>{i18n.t('name')}</th>
|
||||||
<T i18nKey="name">#</T>
|
<th class="d-none d-lg-table-cell">{i18n.t('title')}</th>
|
||||||
</th>
|
<th>{i18n.t('category')}</th>
|
||||||
<th class="d-none d-lg-table-cell">
|
<th class="text-right">{i18n.t('subscribers')}</th>
|
||||||
<T i18nKey="title">#</T>
|
<th class="text-right d-none d-lg-table-cell">
|
||||||
</th>
|
{i18n.t('posts')}
|
||||||
<th>
|
|
||||||
<T i18nKey="category">#</T>
|
|
||||||
</th>
|
|
||||||
<th class="text-right">
|
|
||||||
<T i18nKey="subscribers">#</T>
|
|
||||||
</th>
|
</th>
|
||||||
<th class="text-right d-none d-lg-table-cell">
|
<th class="text-right d-none d-lg-table-cell">
|
||||||
<T i18nKey="posts">#</T>
|
{i18n.t('comments')}
|
||||||
</th>
|
|
||||||
<th class="text-right d-none d-lg-table-cell">
|
|
||||||
<T i18nKey="comments">#</T>
|
|
||||||
</th>
|
</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -139,7 +128,7 @@ export class Communities extends Component<any, CommunitiesState> {
|
||||||
this.handleUnsubscribe
|
this.handleUnsubscribe
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unsubscribe">#</T>
|
{i18n.t('unsubscribe')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
|
@ -149,7 +138,7 @@ export class Communities extends Component<any, CommunitiesState> {
|
||||||
this.handleSubscribe
|
this.handleSubscribe
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="subscribe">#</T>
|
{i18n.t('subscribe')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
|
@ -173,15 +162,16 @@ export class Communities extends Component<any, CommunitiesState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{this.state.communities.length == communityLimit && (
|
{this.state.communities.length == communityLimit && (
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
28
ui/src/components/community-form.tsx
vendored
28
ui/src/components/community-form.tsx
vendored
|
@ -21,7 +21,6 @@ import {
|
||||||
import Tribute from 'tributejs/src/Tribute.js';
|
import Tribute from 'tributejs/src/Tribute.js';
|
||||||
import autosize from 'autosize';
|
import autosize from 'autosize';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
import { Community } from '../interfaces';
|
import { Community } from '../interfaces';
|
||||||
|
|
||||||
|
@ -108,12 +107,13 @@ export class CommunityForm extends Component<
|
||||||
return (
|
return (
|
||||||
<form onSubmit={linkEvent(this, this.handleCreateCommunitySubmit)}>
|
<form onSubmit={linkEvent(this, this.handleCreateCommunitySubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor="community-name">
|
||||||
<T i18nKey="name">#</T>
|
{i18n.t('name')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="community-name"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.communityForm.name}
|
value={this.state.communityForm.name}
|
||||||
onInput={linkEvent(this, this.handleCommunityNameChange)}
|
onInput={linkEvent(this, this.handleCommunityNameChange)}
|
||||||
|
@ -125,13 +125,15 @@ export class CommunityForm extends Component<
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor="community-title">
|
||||||
<T i18nKey="title">#</T>
|
{i18n.t('title')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="community-title"
|
||||||
value={this.state.communityForm.title}
|
value={this.state.communityForm.title}
|
||||||
onInput={linkEvent(this, this.handleCommunityTitleChange)}
|
onInput={linkEvent(this, this.handleCommunityTitleChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -142,8 +144,8 @@ export class CommunityForm extends Component<
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor={this.id}>
|
||||||
<T i18nKey="sidebar">#</T>
|
{i18n.t('sidebar')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<textarea
|
<textarea
|
||||||
|
@ -157,12 +159,13 @@ export class CommunityForm extends Component<
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor="community-category">
|
||||||
<T i18nKey="category">#</T>
|
{i18n.t('category')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<select
|
<select
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
id="community-category"
|
||||||
value={this.state.communityForm.category_id}
|
value={this.state.communityForm.category_id}
|
||||||
onInput={linkEvent(this, this.handleCommunityCategoryChange)}
|
onInput={linkEvent(this, this.handleCommunityCategoryChange)}
|
||||||
>
|
>
|
||||||
|
@ -179,12 +182,13 @@ export class CommunityForm extends Component<
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="community-nsfw"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.communityForm.nsfw}
|
checked={this.state.communityForm.nsfw}
|
||||||
onChange={linkEvent(this, this.handleCommunityNsfwChange)}
|
onChange={linkEvent(this, this.handleCommunityNsfwChange)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="community-nsfw">
|
||||||
<T i18nKey="nsfw">#</T>
|
{i18n.t('nsfw')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -209,7 +213,7 @@ export class CommunityForm extends Component<
|
||||||
class="btn btn-secondary"
|
class="btn btn-secondary"
|
||||||
onClick={linkEvent(this, this.handleCancel)}
|
onClick={linkEvent(this, this.handleCancel)}
|
||||||
>
|
>
|
||||||
<T i18nKey="cancel">#</T>
|
{i18n.t('cancel')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
9
ui/src/components/community.tsx
vendored
9
ui/src/components/community.tsx
vendored
|
@ -24,7 +24,6 @@ import { PostListings } from './post-listings';
|
||||||
import { SortSelect } from './sort-select';
|
import { SortSelect } from './sort-select';
|
||||||
import { Sidebar } from './sidebar';
|
import { Sidebar } from './sidebar';
|
||||||
import { wsJsonToRes, routeSortTypeToEnum, fetchLimit, toast } from '../utils';
|
import { wsJsonToRes, routeSortTypeToEnum, fetchLimit, toast } from '../utils';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
|
@ -136,12 +135,12 @@ export class Community extends Component<any, State> {
|
||||||
{this.state.community.title}
|
{this.state.community.title}
|
||||||
{this.state.community.removed && (
|
{this.state.community.removed && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="removed">#</T>
|
{i18n.t('removed')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{this.state.community.nsfw && (
|
{this.state.community.nsfw && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="nsfw">#</T>
|
{i18n.t('nsfw')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
</h5>
|
</h5>
|
||||||
|
@ -189,7 +188,7 @@ export class Community extends Component<any, State> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{this.state.posts.length == fetchLimit && (
|
{this.state.posts.length == fetchLimit && (
|
||||||
|
@ -197,7 +196,7 @@ export class Community extends Component<any, State> {
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
5
ui/src/components/create-community.tsx
vendored
5
ui/src/components/create-community.tsx
vendored
|
@ -3,7 +3,6 @@ import { CommunityForm } from './community-form';
|
||||||
import { Community } from '../interfaces';
|
import { Community } from '../interfaces';
|
||||||
import { WebSocketService } from '../services';
|
import { WebSocketService } from '../services';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
export class CreateCommunity extends Component<any, any> {
|
export class CreateCommunity extends Component<any, any> {
|
||||||
constructor(props: any, context: any) {
|
constructor(props: any, context: any) {
|
||||||
|
@ -22,9 +21,7 @@ export class CreateCommunity extends Component<any, any> {
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
||||||
<h5>
|
<h5>{i18n.t('create_community')}</h5>
|
||||||
<T i18nKey="create_community">#</T>
|
|
||||||
</h5>
|
|
||||||
<CommunityForm onCreate={this.handleCommunityCreate} />
|
<CommunityForm onCreate={this.handleCommunityCreate} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
5
ui/src/components/create-post.tsx
vendored
5
ui/src/components/create-post.tsx
vendored
|
@ -3,7 +3,6 @@ import { PostForm } from './post-form';
|
||||||
import { WebSocketService } from '../services';
|
import { WebSocketService } from '../services';
|
||||||
import { PostFormParams } from '../interfaces';
|
import { PostFormParams } from '../interfaces';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
export class CreatePost extends Component<any, any> {
|
export class CreatePost extends Component<any, any> {
|
||||||
constructor(props: any, context: any) {
|
constructor(props: any, context: any) {
|
||||||
|
@ -22,9 +21,7 @@ export class CreatePost extends Component<any, any> {
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
||||||
<h5>
|
<h5>{i18n.t('create_post')}</h5>
|
||||||
<T i18nKey="create_post">#</T>
|
|
||||||
</h5>
|
|
||||||
<PostForm onCreate={this.handlePostCreate} params={this.params} />
|
<PostForm onCreate={this.handlePostCreate} params={this.params} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
10
ui/src/components/footer.tsx
vendored
10
ui/src/components/footer.tsx
vendored
|
@ -2,7 +2,7 @@ import { Component } from 'inferno';
|
||||||
import { Link } from 'inferno-router';
|
import { Link } from 'inferno-router';
|
||||||
import { repoUrl } from '../utils';
|
import { repoUrl } from '../utils';
|
||||||
import { version } from '../version';
|
import { version } from '../version';
|
||||||
import { T } from 'inferno-i18next';
|
import { i18n } from '../i18next';
|
||||||
|
|
||||||
export class Footer extends Component<any, any> {
|
export class Footer extends Component<any, any> {
|
||||||
constructor(props: any, context: any) {
|
constructor(props: any, context: any) {
|
||||||
|
@ -19,22 +19,22 @@ export class Footer extends Component<any, any> {
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<Link class="nav-link" to="/modlog">
|
<Link class="nav-link" to="/modlog">
|
||||||
<T i18nKey="modlog">#</T>
|
{i18n.t('modlog')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href={'/docs/index.html'}>
|
<a class="nav-link" href={'/docs/index.html'}>
|
||||||
<T i18nKey="docs">#</T>
|
{i18n.t('docs')}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<Link class="nav-link" to="/sponsors">
|
<Link class="nav-link" to="/sponsors">
|
||||||
<T i18nKey="donate">#</T>
|
{i18n.t('donate')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href={repoUrl}>
|
<a class="nav-link" href={repoUrl}>
|
||||||
<T i18nKey="code">#</T>
|
{i18n.t('code')}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
38
ui/src/components/inbox.tsx
vendored
38
ui/src/components/inbox.tsx
vendored
|
@ -122,7 +122,7 @@ export class Inbox extends Component<any, InboxState> {
|
||||||
<ul class="list-inline mb-1 text-muted small font-weight-bold">
|
<ul class="list-inline mb-1 text-muted small font-weight-bold">
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
<span class="pointer" onClick={this.markAllAsRead}>
|
<span class="pointer" onClick={this.markAllAsRead}>
|
||||||
<T i18nKey="mark_all_as_read">#</T>
|
{i18n.t('mark_all_as_read')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -147,36 +147,20 @@ export class Inbox extends Component<any, InboxState> {
|
||||||
onChange={linkEvent(this, this.handleUnreadOrAllChange)}
|
onChange={linkEvent(this, this.handleUnreadOrAllChange)}
|
||||||
class="custom-select custom-select-sm w-auto mr-2"
|
class="custom-select custom-select-sm w-auto mr-2"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('type')}</option>
|
||||||
<T i18nKey="type">#</T>
|
<option value={UnreadOrAll.Unread}>{i18n.t('unread')}</option>
|
||||||
</option>
|
<option value={UnreadOrAll.All}>{i18n.t('all')}</option>
|
||||||
<option value={UnreadOrAll.Unread}>
|
|
||||||
<T i18nKey="unread">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={UnreadOrAll.All}>
|
|
||||||
<T i18nKey="all">#</T>
|
|
||||||
</option>
|
|
||||||
</select>
|
</select>
|
||||||
<select
|
<select
|
||||||
value={this.state.unreadType}
|
value={this.state.unreadType}
|
||||||
onChange={linkEvent(this, this.handleUnreadTypeChange)}
|
onChange={linkEvent(this, this.handleUnreadTypeChange)}
|
||||||
class="custom-select custom-select-sm w-auto mr-2"
|
class="custom-select custom-select-sm w-auto mr-2"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('type')}</option>
|
||||||
<T i18nKey="type">#</T>
|
<option value={UnreadType.All}>{i18n.t('all')}</option>
|
||||||
</option>
|
<option value={UnreadType.Replies}>{i18n.t('replies')}</option>
|
||||||
<option value={UnreadType.All}>
|
<option value={UnreadType.Mentions}>{i18n.t('mentions')}</option>
|
||||||
<T i18nKey="all">#</T>
|
<option value={UnreadType.Messages}>{i18n.t('messages')}</option>
|
||||||
</option>
|
|
||||||
<option value={UnreadType.Replies}>
|
|
||||||
<T i18nKey="replies">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={UnreadType.Mentions}>
|
|
||||||
<T i18nKey="mentions">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={UnreadType.Messages}>
|
|
||||||
<T i18nKey="messages">#</T>
|
|
||||||
</option>
|
|
||||||
</select>
|
</select>
|
||||||
<SortSelect
|
<SortSelect
|
||||||
sort={this.state.sort}
|
sort={this.state.sort}
|
||||||
|
@ -248,14 +232,14 @@ export class Inbox extends Component<any, InboxState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
55
ui/src/components/login.tsx
vendored
55
ui/src/components/login.tsx
vendored
|
@ -13,7 +13,6 @@ import {
|
||||||
import { WebSocketService, UserService } from '../services';
|
import { WebSocketService, UserService } from '../services';
|
||||||
import { wsJsonToRes, validEmail, toast } from '../utils';
|
import { wsJsonToRes, validEmail, toast } from '../utils';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
loginForm: LoginForm;
|
loginForm: LoginForm;
|
||||||
|
@ -78,15 +77,19 @@ export class Login extends Component<any, State> {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<form onSubmit={linkEvent(this, this.handleLoginSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleLoginSubmit)}>
|
||||||
<h5>Login</h5>
|
<h5>{i18n.t('login')}</h5>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label
|
||||||
<T i18nKey="email_or_username">#</T>
|
class="col-sm-2 col-form-label"
|
||||||
|
htmlFor="login-email-or-username"
|
||||||
|
>
|
||||||
|
{i18n.t('email_or_username')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
id="login-email-or-username"
|
||||||
value={this.state.loginForm.username_or_email}
|
value={this.state.loginForm.username_or_email}
|
||||||
onInput={linkEvent(this, this.handleLoginUsernameChange)}
|
onInput={linkEvent(this, this.handleLoginUsernameChange)}
|
||||||
required
|
required
|
||||||
|
@ -95,12 +98,13 @@ export class Login extends Component<any, State> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="login-password">
|
||||||
<T i18nKey="password">#</T>
|
{i18n.t('password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="login-password"
|
||||||
value={this.state.loginForm.password}
|
value={this.state.loginForm.password}
|
||||||
onInput={linkEvent(this, this.handleLoginPasswordChange)}
|
onInput={linkEvent(this, this.handleLoginPasswordChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -111,7 +115,7 @@ export class Login extends Component<any, State> {
|
||||||
onClick={linkEvent(this, this.handlePasswordReset)}
|
onClick={linkEvent(this, this.handlePasswordReset)}
|
||||||
className="btn p-0 btn-link d-inline-block float-right text-muted small font-weight-bold"
|
className="btn p-0 btn-link d-inline-block float-right text-muted small font-weight-bold"
|
||||||
>
|
>
|
||||||
<T i18nKey="forgot_password">#</T>
|
{i18n.t('forgot_password')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -135,16 +139,17 @@ export class Login extends Component<any, State> {
|
||||||
registerForm() {
|
registerForm() {
|
||||||
return (
|
return (
|
||||||
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
|
||||||
<h5>
|
<h5>{i18n.t('sign_up')}</h5>
|
||||||
<T i18nKey="sign_up">#</T>
|
|
||||||
</h5>
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="register-username">
|
||||||
<T i18nKey="username">#</T>
|
{i18n.t('username')}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="register-username"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.registerForm.username}
|
value={this.state.registerForm.username}
|
||||||
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
|
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
|
||||||
|
@ -155,13 +160,15 @@ export class Login extends Component<any, State> {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="register-email">
|
||||||
<T i18nKey="email">#</T>
|
{i18n.t('email')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
|
id="register-email"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
placeholder={i18n.t('optional')}
|
placeholder={i18n.t('optional')}
|
||||||
value={this.state.registerForm.email}
|
value={this.state.registerForm.email}
|
||||||
|
@ -170,13 +177,15 @@ export class Login extends Component<any, State> {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="register-password">
|
||||||
<T i18nKey="password">#</T>
|
{i18n.t('password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="register-password"
|
||||||
value={this.state.registerForm.password}
|
value={this.state.registerForm.password}
|
||||||
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -184,13 +193,18 @@ export class Login extends Component<any, State> {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label
|
||||||
<T i18nKey="verify_password">#</T>
|
class="col-sm-2 col-form-label"
|
||||||
|
htmlFor="register-verify-password"
|
||||||
|
>
|
||||||
|
{i18n.t('verify_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="register-verify-password"
|
||||||
value={this.state.registerForm.password_verify}
|
value={this.state.registerForm.password_verify}
|
||||||
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
|
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -204,12 +218,13 @@ export class Login extends Component<any, State> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="register-show-nsfw"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.registerForm.show_nsfw}
|
checked={this.state.registerForm.show_nsfw}
|
||||||
onChange={linkEvent(this, this.handleRegisterShowNsfwChange)}
|
onChange={linkEvent(this, this.handleRegisterShowNsfwChange)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="register-show-nsfw">
|
||||||
<T i18nKey="show_nsfw">#</T>
|
{i18n.t('show_nsfw')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
80
ui/src/components/main.tsx
vendored
80
ui/src/components/main.tsx
vendored
|
@ -158,8 +158,10 @@ export class Main extends Component<any, MainState> {
|
||||||
return (
|
return (
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-md-8">{this.posts()}</div>
|
<main role="main" class="col-12 col-md-8">
|
||||||
<div class="col-12 col-md-4">{this.my_sidebar()}</div>
|
{this.posts()}
|
||||||
|
</main>
|
||||||
|
<aside class="col-12 col-md-4">{this.my_sidebar()}</aside>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -199,7 +201,7 @@ export class Main extends Component<any, MainState> {
|
||||||
class="btn btn-sm btn-secondary btn-block"
|
class="btn btn-sm btn-secondary btn-block"
|
||||||
to="/create_community"
|
to="/create_community"
|
||||||
>
|
>
|
||||||
<T i18nKey="create_a_community">#</T>
|
{i18n.t('create_a_community')}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -269,73 +271,43 @@ export class Main extends Component<any, MainState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleEditClick)}
|
onClick={linkEvent(this, this.handleEditClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="edit">#</T>
|
{i18n.t('edit')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
)}
|
)}
|
||||||
<ul class="my-2 list-inline">
|
<ul class="my-2 list-inline">
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_online', { count: this.state.siteRes.online })}
|
||||||
i18nKey="number_online"
|
|
||||||
interpolation={{ count: this.state.siteRes.online }}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_users', {
|
||||||
i18nKey="number_of_users"
|
count: this.state.siteRes.site.number_of_users,
|
||||||
interpolation={{
|
})}
|
||||||
count: this.state.siteRes.site.number_of_users,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_communities', {
|
||||||
i18nKey="number_of_communities"
|
count: this.state.siteRes.site.number_of_communities,
|
||||||
interpolation={{
|
})}
|
||||||
count: this.state.siteRes.site.number_of_communities,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_posts', {
|
||||||
i18nKey="number_of_posts"
|
count: this.state.siteRes.site.number_of_posts,
|
||||||
interpolation={{
|
})}
|
||||||
count: this.state.siteRes.site.number_of_posts,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_comments', {
|
||||||
i18nKey="number_of_comments"
|
count: this.state.siteRes.site.number_of_comments,
|
||||||
interpolation={{
|
})}
|
||||||
count: this.state.siteRes.site.number_of_comments,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
<Link className="badge badge-secondary" to="/modlog">
|
<Link className="badge badge-secondary" to="/modlog">
|
||||||
<T i18nKey="modlog">#</T>
|
{i18n.t('modlog')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="mt-1 list-inline small mb-0">
|
<ul class="mt-1 list-inline small mb-0">
|
||||||
<li class="list-inline-item">
|
<li class="list-inline-item">{i18n.t('admins')}:</li>
|
||||||
<T i18nKey="admins" class="d-inline">
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
:
|
|
||||||
</li>
|
|
||||||
{this.state.siteRes.admins.map(admin => (
|
{this.state.siteRes.admins.map(admin => (
|
||||||
<li class="list-inline-item">
|
<li class="list-inline-item">
|
||||||
<Link class="text-info" to={`/u/${admin.name}`}>
|
<Link class="text-info" to={`/u/${admin.name}`}>
|
||||||
|
@ -375,9 +347,7 @@ export class Main extends Component<any, MainState> {
|
||||||
<div class="card border-secondary">
|
<div class="card border-secondary">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>
|
<h5>
|
||||||
<T i18nKey="powered_by" class="d-inline">
|
{i18n.t('powered_by')}
|
||||||
#
|
|
||||||
</T>
|
|
||||||
<svg class="icon mx-2">
|
<svg class="icon mx-2">
|
||||||
<use xlinkHref="#icon-mouse">#</use>
|
<use xlinkHref="#icon-mouse">#</use>
|
||||||
</svg>
|
</svg>
|
||||||
|
@ -412,7 +382,7 @@ export class Main extends Component<any, MainState> {
|
||||||
|
|
||||||
posts() {
|
posts() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div class="main-content-wrapper">
|
||||||
{this.state.loading ? (
|
{this.state.loading ? (
|
||||||
<h5>
|
<h5>
|
||||||
<svg class="icon icon-spinner spin">
|
<svg class="icon icon-spinner spin">
|
||||||
|
@ -475,7 +445,7 @@ export class Main extends Component<any, MainState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{this.state.posts.length == fetchLimit && (
|
{this.state.posts.length == fetchLimit && (
|
||||||
|
@ -483,7 +453,7 @@ export class Main extends Component<any, MainState> {
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
13
ui/src/components/modlog.tsx
vendored
13
ui/src/components/modlog.tsx
vendored
|
@ -15,6 +15,7 @@ import {
|
||||||
ModBan,
|
ModBan,
|
||||||
ModAddCommunity,
|
ModAddCommunity,
|
||||||
ModAdd,
|
ModAdd,
|
||||||
|
WebSocketJsonResponse,
|
||||||
} from '../interfaces';
|
} from '../interfaces';
|
||||||
import { WebSocketService } from '../services';
|
import { WebSocketService } from '../services';
|
||||||
import { wsJsonToRes, addTypeInfo, fetchLimit, toast } from '../utils';
|
import { wsJsonToRes, addTypeInfo, fetchLimit, toast } from '../utils';
|
||||||
|
@ -359,15 +360,15 @@ export class Modlog extends Component<any, ModlogState> {
|
||||||
/c/{this.state.communityName}{' '}
|
/c/{this.state.communityName}{' '}
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
<span>Modlog</span>
|
<span>{i18n.t('modlog')}</span>
|
||||||
</h5>
|
</h5>
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table id="modlog_table" class="table table-sm table-hover">
|
<table id="modlog_table" class="table table-sm table-hover">
|
||||||
<thead class="pointer">
|
<thead class="pointer">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Time</th>
|
<th> {i18n.t('time')}</th>
|
||||||
<th>Mod</th>
|
<th>{i18n.t('mod')}</th>
|
||||||
<th>Action</th>
|
<th>{i18n.t('action')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{this.combined()}
|
{this.combined()}
|
||||||
|
@ -388,14 +389,14 @@ export class Modlog extends Component<any, ModlogState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
Prev
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
Next
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
12
ui/src/components/navbar.tsx
vendored
12
ui/src/components/navbar.tsx
vendored
|
@ -29,7 +29,6 @@ import {
|
||||||
} from '../utils';
|
} from '../utils';
|
||||||
import { version } from '../version';
|
import { version } from '../version';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface NavbarState {
|
interface NavbarState {
|
||||||
isLoggedIn: boolean;
|
isLoggedIn: boolean;
|
||||||
|
@ -102,6 +101,7 @@ export class Navbar extends Component<any, NavbarState> {
|
||||||
<button
|
<button
|
||||||
class="navbar-toggler"
|
class="navbar-toggler"
|
||||||
type="button"
|
type="button"
|
||||||
|
aria-label="menu"
|
||||||
onClick={linkEvent(this, this.expandNavbar)}
|
onClick={linkEvent(this, this.expandNavbar)}
|
||||||
>
|
>
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
@ -112,12 +112,12 @@ export class Navbar extends Component<any, NavbarState> {
|
||||||
<ul class="navbar-nav mr-auto">
|
<ul class="navbar-nav mr-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<Link class="nav-link" to="/communities">
|
<Link class="nav-link" to="/communities">
|
||||||
<T i18nKey="communities">#</T>
|
{i18n.t('communities')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<Link class="nav-link" to="/search">
|
<Link class="nav-link" to="/search">
|
||||||
<T i18nKey="search">#</T>
|
{i18n.t('search')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
|
@ -128,12 +128,12 @@ export class Navbar extends Component<any, NavbarState> {
|
||||||
state: { prevPath: this.currentLocation },
|
state: { prevPath: this.currentLocation },
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<T i18nKey="create_post">#</T>
|
{i18n.t('create_post')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<Link class="nav-link" to="/create_community">
|
<Link class="nav-link" to="/create_community">
|
||||||
<T i18nKey="create_community">#</T>
|
{i18n.t('create_community')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
|
@ -186,7 +186,7 @@ export class Navbar extends Component<any, NavbarState> {
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<Link class="nav-link" to="/login">
|
<Link class="nav-link" to="/login">
|
||||||
<T i18nKey="login_sign_up">#</T>
|
{i18n.t('login_sign_up')}
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
9
ui/src/components/password_change.tsx
vendored
9
ui/src/components/password_change.tsx
vendored
|
@ -10,7 +10,6 @@ import {
|
||||||
import { WebSocketService, UserService } from '../services';
|
import { WebSocketService, UserService } from '../services';
|
||||||
import { wsJsonToRes, capitalizeFirstLetter, toast } from '../utils';
|
import { wsJsonToRes, capitalizeFirstLetter, toast } from '../utils';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
passwordChangeForm: PasswordChangeForm;
|
passwordChangeForm: PasswordChangeForm;
|
||||||
|
@ -58,9 +57,7 @@ export class PasswordChange extends Component<any, State> {
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
|
||||||
<h5>
|
<h5>{i18n.t('password_change')}</h5>
|
||||||
<T i18nKey="password_change">#</T>
|
|
||||||
</h5>
|
|
||||||
{this.passwordChangeForm()}
|
{this.passwordChangeForm()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -73,7 +70,7 @@ export class PasswordChange extends Component<any, State> {
|
||||||
<form onSubmit={linkEvent(this, this.handlePasswordChangeSubmit)}>
|
<form onSubmit={linkEvent(this, this.handlePasswordChangeSubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label">
|
||||||
<T i18nKey="new_password">#</T>
|
{i18n.t('new_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
|
@ -87,7 +84,7 @@ export class PasswordChange extends Component<any, State> {
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label">
|
||||||
<T i18nKey="verify_password">#</T>
|
{i18n.t('verify_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
|
|
49
ui/src/components/post-form.tsx
vendored
49
ui/src/components/post-form.tsx
vendored
|
@ -36,7 +36,6 @@ import {
|
||||||
import autosize from 'autosize';
|
import autosize from 'autosize';
|
||||||
import Tribute from 'tributejs/src/Tribute.js';
|
import Tribute from 'tributejs/src/Tribute.js';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface PostFormProps {
|
interface PostFormProps {
|
||||||
post?: Post; // If a post is given, that means this is an edit
|
post?: Post; // If a post is given, that means this is an edit
|
||||||
|
@ -151,12 +150,13 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
<div>
|
<div>
|
||||||
<form onSubmit={linkEvent(this, this.handlePostSubmit)}>
|
<form onSubmit={linkEvent(this, this.handlePostSubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="post-url">
|
||||||
<T i18nKey="url">#</T>
|
{i18n.t('url')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="url"
|
type="url"
|
||||||
|
id="post-url"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.postForm.url}
|
value={this.state.postForm.url}
|
||||||
onInput={linkEvent(this, this.handlePostUrlChange)}
|
onInput={linkEvent(this, this.handlePostUrlChange)}
|
||||||
|
@ -167,12 +167,9 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
class="mt-1 text-muted small font-weight-bold pointer"
|
class="mt-1 text-muted small font-weight-bold pointer"
|
||||||
onClick={linkEvent(this, this.copySuggestedTitle)}
|
onClick={linkEvent(this, this.copySuggestedTitle)}
|
||||||
>
|
>
|
||||||
<T
|
{i18n.t('copy_suggested_title', {
|
||||||
i18nKey="copy_suggested_title"
|
title: this.state.suggestedTitle,
|
||||||
interpolation={{ title: this.state.suggestedTitle }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<form>
|
<form>
|
||||||
|
@ -181,7 +178,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
className={`${UserService.Instance.user &&
|
className={`${UserService.Instance.user &&
|
||||||
'pointer'} d-inline-block mr-2 float-right text-muted small font-weight-bold`}
|
'pointer'} d-inline-block mr-2 float-right text-muted small font-weight-bold`}
|
||||||
>
|
>
|
||||||
<T i18nKey="upload_image">#</T>
|
{i18n.t('upload_image')}
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
id="file-upload"
|
id="file-upload"
|
||||||
|
@ -201,7 +198,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
|
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
|
||||||
>
|
>
|
||||||
<T i18nKey="archive_link">#</T>
|
{i18n.t('archive_link')}
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
{this.state.imageLoading && (
|
{this.state.imageLoading && (
|
||||||
|
@ -215,7 +212,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
{this.state.crossPosts.length > 0 && (
|
{this.state.crossPosts.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<div class="my-1 text-muted small font-weight-bold">
|
<div class="my-1 text-muted small font-weight-bold">
|
||||||
<T i18nKey="cross_posts">#</T>
|
{i18n.t('cross_posts')}
|
||||||
</div>
|
</div>
|
||||||
<PostListings showCommunity posts={this.state.crossPosts} />
|
<PostListings showCommunity posts={this.state.crossPosts} />
|
||||||
</>
|
</>
|
||||||
|
@ -223,12 +220,13 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="post-title">
|
||||||
<T i18nKey="title">#</T>
|
{i18n.t('title')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<textarea
|
<textarea
|
||||||
value={this.state.postForm.name}
|
value={this.state.postForm.name}
|
||||||
|
id="post-title"
|
||||||
onInput={linkEvent(this, this.handlePostNameChange)}
|
onInput={linkEvent(this, this.handlePostNameChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
required
|
required
|
||||||
|
@ -239,16 +237,17 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
{this.state.suggestedPosts.length > 0 && (
|
{this.state.suggestedPosts.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<div class="my-1 text-muted small font-weight-bold">
|
<div class="my-1 text-muted small font-weight-bold">
|
||||||
<T i18nKey="related_posts">#</T>
|
{i18n.t('related_posts')}
|
||||||
</div>
|
</div>
|
||||||
<PostListings posts={this.state.suggestedPosts} />
|
<PostListings posts={this.state.suggestedPosts} />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor={this.id}>
|
||||||
<T i18nKey="body">#</T>
|
{i18n.t('body')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<textarea
|
<textarea
|
||||||
|
@ -271,7 +270,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
.previewMode && 'active'}`}
|
.previewMode && 'active'}`}
|
||||||
onClick={linkEvent(this, this.handlePreviewToggle)}
|
onClick={linkEvent(this, this.handlePreviewToggle)}
|
||||||
>
|
>
|
||||||
<T i18nKey="preview">#</T>
|
{i18n.t('preview')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<a
|
<a
|
||||||
|
@ -279,18 +278,19 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="d-inline-block float-right text-muted small font-weight-bold"
|
class="d-inline-block float-right text-muted small font-weight-bold"
|
||||||
>
|
>
|
||||||
<T i18nKey="formatting_help">#</T>
|
{i18n.t('formatting_help')}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{!this.props.post && (
|
{!this.props.post && (
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="post-community">
|
||||||
<T i18nKey="community">#</T>
|
{i18n.t('community')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<select
|
<select
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
id="post-community"
|
||||||
value={this.state.postForm.community_id}
|
value={this.state.postForm.community_id}
|
||||||
onInput={linkEvent(this, this.handlePostCommunityChange)}
|
onInput={linkEvent(this, this.handlePostCommunityChange)}
|
||||||
>
|
>
|
||||||
|
@ -307,12 +307,13 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="post-nsfw"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.postForm.nsfw}
|
checked={this.state.postForm.nsfw}
|
||||||
onChange={linkEvent(this, this.handlePostNsfwChange)}
|
onChange={linkEvent(this, this.handlePostNsfwChange)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="post-nsfw">
|
||||||
<T i18nKey="nsfw">#</T>
|
{i18n.t('nsfw')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -337,7 +338,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||||
class="btn btn-secondary"
|
class="btn btn-secondary"
|
||||||
onClick={linkEvent(this, this.handleCancel)}
|
onClick={linkEvent(this, this.handleCancel)}
|
||||||
>
|
>
|
||||||
<T i18nKey="cancel">#</T>
|
{i18n.t('cancel')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
69
ui/src/components/post-listing.tsx
vendored
69
ui/src/components/post-listing.tsx
vendored
|
@ -30,7 +30,6 @@ import {
|
||||||
imageThumbnailer,
|
imageThumbnailer,
|
||||||
} from '../utils';
|
} from '../utils';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface PostListingState {
|
interface PostListingState {
|
||||||
showEdit: boolean;
|
showEdit: boolean;
|
||||||
|
@ -247,27 +246,27 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
)}
|
)}
|
||||||
{post.removed && (
|
{post.removed && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="removed">#</T>
|
{i18n.t('removed')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{post.deleted && (
|
{post.deleted && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="deleted">#</T>
|
{i18n.t('deleted')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{post.locked && (
|
{post.locked && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="locked">#</T>
|
{i18n.t('locked')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{post.stickied && (
|
{post.stickied && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="stickied">#</T>
|
{i18n.t('stickied')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{post.nsfw && (
|
{post.nsfw && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="nsfw">#</T>
|
{i18n.t('nsfw')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -288,18 +287,16 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
<span>{post.creator_name}</span>
|
<span>{post.creator_name}</span>
|
||||||
</Link>
|
</Link>
|
||||||
{this.isMod && (
|
{this.isMod && (
|
||||||
<span className="mx-1 badge badge-light">
|
<span className="mx-1 badge badge-light">{i18n.t('mod')}</span>
|
||||||
<T i18nKey="mod">#</T>
|
|
||||||
</span>
|
|
||||||
)}
|
)}
|
||||||
{this.isAdmin && (
|
{this.isAdmin && (
|
||||||
<span className="mx-1 badge badge-light">
|
<span className="mx-1 badge badge-light">
|
||||||
<T i18nKey="admin">#</T>
|
{i18n.t('admin')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{(post.banned_from_community || post.banned) && (
|
{(post.banned_from_community || post.banned) && (
|
||||||
<span className="mx-1 badge badge-danger">
|
<span className="mx-1 badge badge-danger">
|
||||||
<T i18nKey="banned">#</T>
|
{i18n.t('banned')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{this.props.showCommunity && (
|
{this.props.showCommunity && (
|
||||||
|
@ -326,12 +323,9 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
<Link className="text-muted" to={`/post/${post.id}`}>
|
<Link className="text-muted" to={`/post/${post.id}`}>
|
||||||
<T
|
{i18n.t('number_of_comments', {
|
||||||
i18nKey="number_of_comments"
|
count: post.number_of_comments,
|
||||||
interpolation={{ count: post.number_of_comments }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -353,7 +347,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
className="text-muted"
|
className="text-muted"
|
||||||
to={`/create_post${this.crossPostParams}`}
|
to={`/create_post${this.crossPostParams}`}
|
||||||
>
|
>
|
||||||
<T i18nKey="cross_post">#</T>
|
{i18n.t('cross_post')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</>
|
</>
|
||||||
|
@ -365,7 +359,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleEditClick)}
|
onClick={linkEvent(this, this.handleEditClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="edit">#</T>
|
{i18n.t('edit')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item mr-2">
|
<li className="list-inline-item mr-2">
|
||||||
|
@ -406,14 +400,14 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModRemoveShow)}
|
onClick={linkEvent(this, this.handleModRemoveShow)}
|
||||||
>
|
>
|
||||||
<T i18nKey="remove">#</T>
|
{i18n.t('remove')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModRemoveSubmit)}
|
onClick={linkEvent(this, this.handleModRemoveSubmit)}
|
||||||
>
|
>
|
||||||
<T i18nKey="restore">#</T>
|
{i18n.t('restore')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -430,7 +424,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleModBanFromCommunityShow
|
this.handleModBanFromCommunityShow
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="ban">#</T>
|
{i18n.t('ban')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
|
@ -440,7 +434,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleModBanFromCommunitySubmit
|
this.handleModBanFromCommunitySubmit
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unban">#</T>
|
{i18n.t('unban')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -473,12 +467,12 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleShowConfirmTransferCommunity
|
this.handleShowConfirmTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="transfer_community">#</T>
|
{i18n.t('transfer_community')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
|
@ -487,7 +481,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleTransferCommunity
|
this.handleTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -496,7 +490,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleCancelShowConfirmTransferCommunity
|
this.handleCancelShowConfirmTransferCommunity
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -512,14 +506,14 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModBanShow)}
|
onClick={linkEvent(this, this.handleModBanShow)}
|
||||||
>
|
>
|
||||||
<T i18nKey="ban_from_site">#</T>
|
{i18n.t('ban_from_site')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModBanSubmit)}
|
onClick={linkEvent(this, this.handleModBanSubmit)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unban_from_site">#</T>
|
{i18n.t('unban_from_site')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -549,18 +543,18 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleShowConfirmTransferSite
|
this.handleShowConfirmTransferSite
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="transfer_site">#</T>
|
{i18n.t('transfer_site')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span class="d-inline-block mr-1">
|
<span class="d-inline-block mr-1">
|
||||||
<T i18nKey="are_you_sure">#</T>
|
{i18n.t('are_you_sure')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block mr-1"
|
class="pointer d-inline-block mr-1"
|
||||||
onClick={linkEvent(this, this.handleTransferSite)}
|
onClick={linkEvent(this, this.handleTransferSite)}
|
||||||
>
|
>
|
||||||
<T i18nKey="yes">#</T>
|
{i18n.t('yes')}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer d-inline-block"
|
class="pointer d-inline-block"
|
||||||
|
@ -569,7 +563,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
this.handleCancelShowConfirmTransferSite
|
this.handleCancelShowConfirmTransferSite
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="no">#</T>
|
{i18n.t('no')}
|
||||||
</span>
|
</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -583,7 +577,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
className="pointer"
|
className="pointer"
|
||||||
onClick={linkEvent(this, this.handleViewSource)}
|
onClick={linkEvent(this, this.handleViewSource)}
|
||||||
>
|
>
|
||||||
<T i18nKey="view_source">#</T>
|
{i18n.t('view_source')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
|
@ -601,18 +595,19 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
||||||
onInput={linkEvent(this, this.handleModRemoveReasonChange)}
|
onInput={linkEvent(this, this.handleModRemoveReasonChange)}
|
||||||
/>
|
/>
|
||||||
<button type="submit" class="btn btn-secondary">
|
<button type="submit" class="btn btn-secondary">
|
||||||
<T i18nKey="remove_post">#</T>
|
{i18n.t('remove_post')}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
{this.state.showBanDialog && (
|
{this.state.showBanDialog && (
|
||||||
<form onSubmit={linkEvent(this, this.handleModBanBothSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleModBanBothSubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-form-label">
|
<label class="col-form-label" htmlFor="post-listing-reason">
|
||||||
<T i18nKey="reason">#</T>
|
{i18n.t('reason')}
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="post-listing-reason"
|
||||||
class="form-control mr-2"
|
class="form-control mr-2"
|
||||||
placeholder={i18n.t('reason')}
|
placeholder={i18n.t('reason')}
|
||||||
value={this.state.banReason}
|
value={this.state.banReason}
|
||||||
|
|
12
ui/src/components/post-listings.tsx
vendored
12
ui/src/components/post-listings.tsx
vendored
|
@ -2,7 +2,7 @@ import { Component } from 'inferno';
|
||||||
import { Link } from 'inferno-router';
|
import { Link } from 'inferno-router';
|
||||||
import { Post } from '../interfaces';
|
import { Post } from '../interfaces';
|
||||||
import { PostListing } from './post-listing';
|
import { PostListing } from './post-listing';
|
||||||
import { T } from 'inferno-i18next';
|
import { i18n } from '../i18next';
|
||||||
|
|
||||||
interface PostListingsProps {
|
interface PostListingsProps {
|
||||||
posts: Array<Post>;
|
posts: Array<Post>;
|
||||||
|
@ -30,14 +30,12 @@ export class PostListings extends Component<PostListingsProps, any> {
|
||||||
))
|
))
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div>
|
<div>{i18n.t('no_posts')}</div>
|
||||||
<T i18nKey="no_posts">#</T>
|
|
||||||
</div>
|
|
||||||
{this.props.showCommunity !== undefined && (
|
{this.props.showCommunity !== undefined && (
|
||||||
<div>
|
<div>
|
||||||
<T i18nKey="subscribe_to_communities">
|
<Link to="/communities">
|
||||||
#<Link to="/communities">#</Link>
|
{i18n.t('subscribe_to_communities')}
|
||||||
</T>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|
7
ui/src/components/post.tsx
vendored
7
ui/src/components/post.tsx
vendored
|
@ -37,7 +37,6 @@ import { CommentForm } from './comment-form';
|
||||||
import { CommentNodes } from './comment-nodes';
|
import { CommentNodes } from './comment-nodes';
|
||||||
import autosize from 'autosize';
|
import autosize from 'autosize';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface PostState {
|
interface PostState {
|
||||||
post: PostI;
|
post: PostI;
|
||||||
|
@ -174,7 +173,7 @@ export class Post extends Component<any, PostState> {
|
||||||
{this.state.crossPosts.length > 0 && (
|
{this.state.crossPosts.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<div class="my-1 text-muted small font-weight-bold">
|
<div class="my-1 text-muted small font-weight-bold">
|
||||||
<T i18nKey="cross_posts">#</T>
|
{i18n.t('cross_posts')}
|
||||||
</div>
|
</div>
|
||||||
<PostListings showCommunity posts={this.state.crossPosts} />
|
<PostListings showCommunity posts={this.state.crossPosts} />
|
||||||
</>
|
</>
|
||||||
|
@ -256,9 +255,7 @@ export class Post extends Component<any, PostState> {
|
||||||
return (
|
return (
|
||||||
<div class="d-none d-md-block new-comments mb-3 card border-secondary">
|
<div class="d-none d-md-block new-comments mb-3 card border-secondary">
|
||||||
<div class="card-body small">
|
<div class="card-body small">
|
||||||
<h6>
|
<h6>{i18n.t('recent_comments')}</h6>
|
||||||
<T i18nKey="recent_comments">#</T>
|
|
||||||
</h6>
|
|
||||||
{this.state.comments.map(comment => (
|
{this.state.comments.map(comment => (
|
||||||
<CommentNodes
|
<CommentNodes
|
||||||
nodes={[{ comment: comment }]}
|
nodes={[{ comment: comment }]}
|
||||||
|
|
7
ui/src/components/private-message.tsx
vendored
7
ui/src/components/private-message.tsx
vendored
|
@ -14,7 +14,6 @@ import {
|
||||||
import { MomentTime } from './moment-time';
|
import { MomentTime } from './moment-time';
|
||||||
import { PrivateMessageForm } from './private-message-form';
|
import { PrivateMessageForm } from './private-message-form';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface PrivateMessageState {
|
interface PrivateMessageState {
|
||||||
showReply: boolean;
|
showReply: boolean;
|
||||||
|
@ -140,7 +139,7 @@ export class PrivateMessage extends Component<
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleReplyClick)}
|
onClick={linkEvent(this, this.handleReplyClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="reply">#</T>
|
{i18n.t('reply')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</>
|
</>
|
||||||
|
@ -152,7 +151,7 @@ export class PrivateMessage extends Component<
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleEditClick)}
|
onClick={linkEvent(this, this.handleEditClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="edit">#</T>
|
{i18n.t('edit')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
|
@ -173,7 +172,7 @@ export class PrivateMessage extends Component<
|
||||||
className="pointer"
|
className="pointer"
|
||||||
onClick={linkEvent(this, this.handleViewSource)}
|
onClick={linkEvent(this, this.handleViewSource)}
|
||||||
>
|
>
|
||||||
<T i18nKey="view_source">#</T>
|
{i18n.t('view_source')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
41
ui/src/components/search.tsx
vendored
41
ui/src/components/search.tsx
vendored
|
@ -30,7 +30,6 @@ import { PostListing } from './post-listing';
|
||||||
import { SortSelect } from './sort-select';
|
import { SortSelect } from './sort-select';
|
||||||
import { CommentNodes } from './comment-nodes';
|
import { CommentNodes } from './comment-nodes';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface SearchState {
|
interface SearchState {
|
||||||
q: string;
|
q: string;
|
||||||
|
@ -126,9 +125,7 @@ export class Search extends Component<any, SearchState> {
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h5>
|
<h5>{i18n.t('search')}</h5>
|
||||||
<T i18nKey="search">#</T>
|
|
||||||
</h5>
|
|
||||||
{this.selects()}
|
{this.selects()}
|
||||||
{this.searchForm()}
|
{this.searchForm()}
|
||||||
{this.state.type_ == SearchType.All && this.all()}
|
{this.state.type_ == SearchType.All && this.all()}
|
||||||
|
@ -163,9 +160,7 @@ export class Search extends Component<any, SearchState> {
|
||||||
<use xlinkHref="#icon-spinner"></use>
|
<use xlinkHref="#icon-spinner"></use>
|
||||||
</svg>
|
</svg>
|
||||||
) : (
|
) : (
|
||||||
<span>
|
<span>{i18n.t('search')}</span>
|
||||||
<T i18nKey="search">#</T>
|
|
||||||
</span>
|
|
||||||
)}
|
)}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -180,24 +175,14 @@ export class Search extends Component<any, SearchState> {
|
||||||
onChange={linkEvent(this, this.handleTypeChange)}
|
onChange={linkEvent(this, this.handleTypeChange)}
|
||||||
class="custom-select custom-select-sm w-auto"
|
class="custom-select custom-select-sm w-auto"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('type')}</option>
|
||||||
<T i18nKey="type">#</T>
|
<option value={SearchType.All}>{i18n.t('all')}</option>
|
||||||
</option>
|
<option value={SearchType.Comments}>{i18n.t('comments')}</option>
|
||||||
<option value={SearchType.All}>
|
<option value={SearchType.Posts}>{i18n.t('posts')}</option>
|
||||||
<T i18nKey="all">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={SearchType.Comments}>
|
|
||||||
<T i18nKey="comments">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={SearchType.Posts}>
|
|
||||||
<T i18nKey="posts">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={SearchType.Communities}>
|
<option value={SearchType.Communities}>
|
||||||
<T i18nKey="communities">#</T>
|
{i18n.t('communities')}
|
||||||
</option>
|
|
||||||
<option value={SearchType.Users}>
|
|
||||||
<T i18nKey="users">#</T>
|
|
||||||
</option>
|
</option>
|
||||||
|
<option value={SearchType.Users}>{i18n.t('users')}</option>
|
||||||
</select>
|
</select>
|
||||||
<span class="ml-2">
|
<span class="ml-2">
|
||||||
<SortSelect
|
<SortSelect
|
||||||
|
@ -383,14 +368,14 @@ export class Search extends Component<any, SearchState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -404,11 +389,7 @@ export class Search extends Component<any, SearchState> {
|
||||||
res.posts.length == 0 &&
|
res.posts.length == 0 &&
|
||||||
res.comments.length == 0 &&
|
res.comments.length == 0 &&
|
||||||
res.communities.length == 0 &&
|
res.communities.length == 0 &&
|
||||||
res.users.length == 0 && (
|
res.users.length == 0 && <span>{i18n.t('no_results')}</span>}
|
||||||
<span>
|
|
||||||
<T i18nKey="no_results">#</T>
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
30
ui/src/components/setup.tsx
vendored
30
ui/src/components/setup.tsx
vendored
|
@ -11,7 +11,6 @@ import { WebSocketService, UserService } from '../services';
|
||||||
import { wsJsonToRes, toast } from '../utils';
|
import { wsJsonToRes, toast } from '../utils';
|
||||||
import { SiteForm } from './site-form';
|
import { SiteForm } from './site-form';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
userForm: RegisterForm;
|
userForm: RegisterForm;
|
||||||
|
@ -61,9 +60,7 @@ export class Setup extends Component<any, State> {
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 offset-lg-3 col-lg-6">
|
<div class="col-12 offset-lg-3 col-lg-6">
|
||||||
<h3>
|
<h3>{i18n.t('lemmy_instance_setup')}</h3>
|
||||||
<T i18nKey="lemmy_instance_setup">#</T>
|
|
||||||
</h3>
|
|
||||||
{!this.state.doneRegisteringUser ? (
|
{!this.state.doneRegisteringUser ? (
|
||||||
this.registerUser()
|
this.registerUser()
|
||||||
) : (
|
) : (
|
||||||
|
@ -78,17 +75,16 @@ export class Setup extends Component<any, State> {
|
||||||
registerUser() {
|
registerUser() {
|
||||||
return (
|
return (
|
||||||
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
|
||||||
<h5>
|
<h5>{i18n.t('setup_admin')}</h5>
|
||||||
<T i18nKey="setup_admin">#</T>
|
|
||||||
</h5>
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="username">
|
||||||
<T i18nKey="username">#</T>
|
{i18n.t('username')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
id="username"
|
||||||
value={this.state.userForm.username}
|
value={this.state.userForm.username}
|
||||||
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
|
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
|
||||||
required
|
required
|
||||||
|
@ -99,12 +95,14 @@ export class Setup extends Component<any, State> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="email">
|
||||||
<T i18nKey="email">#</T>
|
{i18n.t('email')}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
|
id="email"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
placeholder={i18n.t('optional')}
|
placeholder={i18n.t('optional')}
|
||||||
value={this.state.userForm.email}
|
value={this.state.userForm.email}
|
||||||
|
@ -114,12 +112,13 @@ export class Setup extends Component<any, State> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="password">
|
||||||
<T i18nKey="password">#</T>
|
{i18n.t('password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="password"
|
||||||
value={this.state.userForm.password}
|
value={this.state.userForm.password}
|
||||||
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
@ -128,12 +127,13 @@ export class Setup extends Component<any, State> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-2 col-form-label">
|
<label class="col-sm-2 col-form-label" htmlFor="verify-password">
|
||||||
<T i18nKey="verify_password">#</T>
|
{i18n.t('verify_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="verify-password"
|
||||||
value={this.state.userForm.password_verify}
|
value={this.state.userForm.password_verify}
|
||||||
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
|
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
|
|
60
ui/src/components/sidebar.tsx
vendored
60
ui/src/components/sidebar.tsx
vendored
|
@ -16,7 +16,6 @@ import {
|
||||||
} from '../utils';
|
} from '../utils';
|
||||||
import { CommunityForm } from './community-form';
|
import { CommunityForm } from './community-form';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface SidebarProps {
|
interface SidebarProps {
|
||||||
community: Community;
|
community: Community;
|
||||||
|
@ -73,12 +72,12 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
<span>{community.title}</span>
|
<span>{community.title}</span>
|
||||||
{community.removed && (
|
{community.removed && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="removed">#</T>
|
{i18n.t('removed')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
{community.deleted && (
|
{community.deleted && (
|
||||||
<small className="ml-2 text-muted font-italic">
|
<small className="ml-2 text-muted font-italic">
|
||||||
<T i18nKey="deleted">#</T>
|
{i18n.t('deleted')}
|
||||||
</small>
|
</small>
|
||||||
)}
|
)}
|
||||||
</h5>
|
</h5>
|
||||||
|
@ -93,7 +92,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleEditClick)}
|
onClick={linkEvent(this, this.handleEditClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="edit">#</T>
|
{i18n.t('edit')}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
{this.amCreator && (
|
{this.amCreator && (
|
||||||
|
@ -117,14 +116,14 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModRemoveShow)}
|
onClick={linkEvent(this, this.handleModRemoveShow)}
|
||||||
>
|
>
|
||||||
<T i18nKey="remove">#</T>
|
{i18n.t('remove')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
class="pointer"
|
class="pointer"
|
||||||
onClick={linkEvent(this, this.handleModRemoveSubmit)}
|
onClick={linkEvent(this, this.handleModRemoveSubmit)}
|
||||||
>
|
>
|
||||||
<T i18nKey="restore">#</T>
|
{i18n.t('restore')}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
|
@ -133,11 +132,12 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
{this.state.showRemoveDialog && (
|
{this.state.showRemoveDialog && (
|
||||||
<form onSubmit={linkEvent(this, this.handleModRemoveSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleModRemoveSubmit)}>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-form-label">
|
<label class="col-form-label" htmlFor="remove-reason">
|
||||||
<T i18nKey="reason">#</T>
|
{i18n.t('reason')}
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="remove-reason"
|
||||||
class="form-control mr-2"
|
class="form-control mr-2"
|
||||||
placeholder={i18n.t('optional')}
|
placeholder={i18n.t('optional')}
|
||||||
value={this.state.removeReason}
|
value={this.state.removeReason}
|
||||||
|
@ -151,43 +151,29 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
{/* </div> */}
|
{/* </div> */}
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<button type="submit" class="btn btn-secondary">
|
<button type="submit" class="btn btn-secondary">
|
||||||
<T i18nKey="remove_community">#</T>
|
{i18n.t('remove_community')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
<ul class="my-1 list-inline">
|
<ul class="my-1 list-inline">
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_online', { count: this.props.online })}
|
||||||
i18nKey="number_online"
|
|
||||||
interpolation={{ count: this.props.online }}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_subscribers', {
|
||||||
i18nKey="number_of_subscribers"
|
count: community.number_of_subscribers,
|
||||||
interpolation={{ count: community.number_of_subscribers }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_posts', {
|
||||||
i18nKey="number_of_posts"
|
count: community.number_of_posts,
|
||||||
interpolation={{ count: community.number_of_posts }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item badge badge-secondary">
|
<li className="list-inline-item badge badge-secondary">
|
||||||
<T
|
{i18n.t('number_of_comments', {
|
||||||
i18nKey="number_of_comments"
|
count: community.number_of_comments,
|
||||||
interpolation={{ count: community.number_of_comments }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</li>
|
</li>
|
||||||
<li className="list-inline-item">
|
<li className="list-inline-item">
|
||||||
<Link className="badge badge-secondary" to="/communities">
|
<Link className="badge badge-secondary" to="/communities">
|
||||||
|
@ -199,7 +185,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
className="badge badge-secondary"
|
className="badge badge-secondary"
|
||||||
to={`/modlog/community/${this.props.community.id}`}
|
to={`/modlog/community/${this.props.community.id}`}
|
||||||
>
|
>
|
||||||
<T i18nKey="modlog">#</T>
|
{i18n.t('modlog')}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -227,7 +213,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
'no-click'}`}
|
'no-click'}`}
|
||||||
to={`/create_post?community=${community.name}`}
|
to={`/create_post?community=${community.name}`}
|
||||||
>
|
>
|
||||||
<T i18nKey="create_a_post">#</T>
|
{i18n.t('create_a_post')}
|
||||||
</Link>
|
</Link>
|
||||||
<div>
|
<div>
|
||||||
{community.subscribed ? (
|
{community.subscribed ? (
|
||||||
|
@ -235,14 +221,14 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
|
||||||
class="btn btn-sm btn-secondary btn-block"
|
class="btn btn-sm btn-secondary btn-block"
|
||||||
onClick={linkEvent(community.id, this.handleUnsubscribe)}
|
onClick={linkEvent(community.id, this.handleUnsubscribe)}
|
||||||
>
|
>
|
||||||
<T i18nKey="unsubscribe">#</T>
|
{i18n.t('unsubscribe')}
|
||||||
</button>
|
</button>
|
||||||
) : (
|
) : (
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary btn-block"
|
class="btn btn-sm btn-secondary btn-block"
|
||||||
onClick={linkEvent(community.id, this.handleSubscribe)}
|
onClick={linkEvent(community.id, this.handleSubscribe)}
|
||||||
>
|
>
|
||||||
<T i18nKey="subscribe">#</T>
|
{i18n.t('subscribe')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
30
ui/src/components/site-form.tsx
vendored
30
ui/src/components/site-form.tsx
vendored
|
@ -5,7 +5,6 @@ import { capitalizeFirstLetter, randomStr, setupTribute } from '../utils';
|
||||||
import autosize from 'autosize';
|
import autosize from 'autosize';
|
||||||
import Tribute from 'tributejs/src/Tribute.js';
|
import Tribute from 'tributejs/src/Tribute.js';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface SiteFormProps {
|
interface SiteFormProps {
|
||||||
site?: Site; // If a site is given, that means this is an edit
|
site?: Site; // If a site is given, that means this is an edit
|
||||||
|
@ -67,12 +66,13 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
: capitalizeFirstLetter(i18n.t('name'))
|
: capitalizeFirstLetter(i18n.t('name'))
|
||||||
} ${i18n.t('your_site')}`}</h5>
|
} ${i18n.t('your_site')}`}</h5>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor="create-site-name">
|
||||||
<T i18nKey="name">#</T>
|
{i18n.t('name')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="create-site-name"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.siteForm.name}
|
value={this.state.siteForm.name}
|
||||||
onInput={linkEvent(this, this.handleSiteNameChange)}
|
onInput={linkEvent(this, this.handleSiteNameChange)}
|
||||||
|
@ -83,8 +83,8 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-12 col-form-label">
|
<label class="col-12 col-form-label" htmlFor={this.id}>
|
||||||
<T i18nKey="sidebar">#</T>
|
{i18n.t('sidebar')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<textarea
|
<textarea
|
||||||
|
@ -102,12 +102,13 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="create-site-downvotes"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.siteForm.enable_downvotes}
|
checked={this.state.siteForm.enable_downvotes}
|
||||||
onChange={linkEvent(this, this.handleSiteEnableDownvotesChange)}
|
onChange={linkEvent(this, this.handleSiteEnableDownvotesChange)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="create-site-downvotes">
|
||||||
<T i18nKey="enable_downvotes">#</T>
|
{i18n.t('enable_downvotes')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -117,12 +118,13 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="create-site-enable-nsfw"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.siteForm.enable_nsfw}
|
checked={this.state.siteForm.enable_nsfw}
|
||||||
onChange={linkEvent(this, this.handleSiteEnableNsfwChange)}
|
onChange={linkEvent(this, this.handleSiteEnableNsfwChange)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="create-site-enable-nsfw">
|
||||||
<T i18nKey="enable_nsfw">#</T>
|
{i18n.t('enable_nsfw')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -132,6 +134,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="create-site-open-registration"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.siteForm.open_registration}
|
checked={this.state.siteForm.open_registration}
|
||||||
onChange={linkEvent(
|
onChange={linkEvent(
|
||||||
|
@ -139,8 +142,11 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
this.handleSiteOpenRegistrationChange
|
this.handleSiteOpenRegistrationChange
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label
|
||||||
<T i18nKey="open_registration">#</T>
|
class="form-check-label"
|
||||||
|
htmlFor="create-site-open-registration"
|
||||||
|
>
|
||||||
|
{i18n.t('open_registration')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -164,7 +170,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
|
||||||
class="btn btn-secondary"
|
class="btn btn-secondary"
|
||||||
onClick={linkEvent(this, this.handleCancel)}
|
onClick={linkEvent(this, this.handleCancel)}
|
||||||
>
|
>
|
||||||
<T i18nKey="cancel">#</T>
|
{i18n.t('cancel')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
35
ui/src/components/sort-select.tsx
vendored
35
ui/src/components/sort-select.tsx
vendored
|
@ -1,7 +1,6 @@
|
||||||
import { Component, linkEvent } from 'inferno';
|
import { Component, linkEvent } from 'inferno';
|
||||||
import { SortType } from '../interfaces';
|
import { SortType } from '../interfaces';
|
||||||
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
interface SortSelectProps {
|
interface SortSelectProps {
|
||||||
sort: SortType;
|
sort: SortType;
|
||||||
|
@ -30,33 +29,17 @@ export class SortSelect extends Component<SortSelectProps, SortSelectState> {
|
||||||
onChange={linkEvent(this, this.handleSortChange)}
|
onChange={linkEvent(this, this.handleSortChange)}
|
||||||
class="custom-select custom-select-sm w-auto"
|
class="custom-select custom-select-sm w-auto"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('sort_type')}</option>
|
||||||
<T i18nKey="sort_type">#</T>
|
|
||||||
</option>
|
|
||||||
{!this.props.hideHot && (
|
{!this.props.hideHot && (
|
||||||
<option value={SortType.Hot}>
|
<option value={SortType.Hot}>{i18n.t('hot')}</option>
|
||||||
<T i18nKey="hot">#</T>
|
|
||||||
</option>
|
|
||||||
)}
|
)}
|
||||||
<option value={SortType.New}>
|
<option value={SortType.New}>{i18n.t('new')}</option>
|
||||||
<T i18nKey="new">#</T>
|
|
||||||
</option>
|
|
||||||
<option disabled>─────</option>
|
<option disabled>─────</option>
|
||||||
<option value={SortType.TopDay}>
|
<option value={SortType.TopDay}>{i18n.t('top_day')}</option>
|
||||||
<T i18nKey="top_day">#</T>
|
<option value={SortType.TopWeek}>{i18n.t('week')}</option>
|
||||||
</option>
|
<option value={SortType.TopMonth}>{i18n.t('month')}</option>
|
||||||
<option value={SortType.TopWeek}>
|
<option value={SortType.TopYear}>{i18n.t('year')}</option>
|
||||||
<T i18nKey="week">#</T>
|
<option value={SortType.TopAll}>{i18n.t('all')}</option>
|
||||||
</option>
|
|
||||||
<option value={SortType.TopMonth}>
|
|
||||||
<T i18nKey="month">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={SortType.TopYear}>
|
|
||||||
<T i18nKey="year">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={SortType.TopAll}>
|
|
||||||
<T i18nKey="all">#</T>
|
|
||||||
</option>
|
|
||||||
</select>
|
</select>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
30
ui/src/components/sponsors.tsx
vendored
30
ui/src/components/sponsors.tsx
vendored
|
@ -36,16 +36,14 @@ export class Sponsors extends Component<any, any> {
|
||||||
topMessage() {
|
topMessage() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h5>
|
<h5>{i18n.t('donate_to_lemmy')}</h5>
|
||||||
<T i18nKey="donate_to_lemmy">#</T>
|
|
||||||
</h5>
|
|
||||||
<p>
|
<p>
|
||||||
<T i18nKey="sponsor_message">
|
<T i18nKey="sponsor_message">
|
||||||
#<a href="https://github.com/dessalines/lemmy">#</a>
|
#<a href="https://github.com/dessalines/lemmy">#</a>
|
||||||
</T>
|
</T>
|
||||||
</p>
|
</p>
|
||||||
<a class="btn btn-secondary" href="https://www.patreon.com/dessalines">
|
<a class="btn btn-secondary" href="https://www.patreon.com/dessalines">
|
||||||
<T i18nKey="support_on_patreon">#</T>
|
{i18n.t('support_on_patreon')}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -53,12 +51,8 @@ export class Sponsors extends Component<any, any> {
|
||||||
sponsors() {
|
sponsors() {
|
||||||
return (
|
return (
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h5>
|
<h5>{i18n.t('sponsors')}</h5>
|
||||||
<T i18nKey="sponsors">#</T>
|
<p>{i18n.t('general_sponsors')}</p>
|
||||||
</h5>
|
|
||||||
<p>
|
|
||||||
<T i18nKey="general_sponsors">#</T>
|
|
||||||
</p>
|
|
||||||
<div class="row card-columns">
|
<div class="row card-columns">
|
||||||
{highlighted.map(s => (
|
{highlighted.map(s => (
|
||||||
<div class="card bg-primary col-12 col-md-2 font-weight-bold">
|
<div class="card bg-primary col-12 col-md-2 font-weight-bold">
|
||||||
|
@ -78,32 +72,24 @@ export class Sponsors extends Component<any, any> {
|
||||||
bitcoin() {
|
bitcoin() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h5>
|
<h5>{i18n.t('crypto')}</h5>
|
||||||
<T i18nKey="crypto">#</T>
|
|
||||||
</h5>
|
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-hover text-center">
|
<table class="table table-hover text-center">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>{i18n.t('bitcoin')}</td>
|
||||||
<T i18nKey="bitcoin">#</T>
|
|
||||||
</td>
|
|
||||||
<td>
|
<td>
|
||||||
<code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code>
|
<code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>{i18n.t('ethereum')}</td>
|
||||||
<T i18nKey="ethereum">#</T>
|
|
||||||
</td>
|
|
||||||
<td>
|
<td>
|
||||||
<code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code>
|
<code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>{i18n.t('monero')}</td>
|
||||||
<T i18nKey="monero">#</T>
|
|
||||||
</td>
|
|
||||||
<td>
|
<td>
|
||||||
<code>
|
<code>
|
||||||
41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV
|
41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV
|
||||||
|
|
159
ui/src/components/user.tsx
vendored
159
ui/src/components/user.tsx
vendored
|
@ -18,7 +18,7 @@ import {
|
||||||
BanUserResponse,
|
BanUserResponse,
|
||||||
AddAdminResponse,
|
AddAdminResponse,
|
||||||
DeleteAccountForm,
|
DeleteAccountForm,
|
||||||
CreatePostLikeResponse,
|
PostResponse,
|
||||||
WebSocketJsonResponse,
|
WebSocketJsonResponse,
|
||||||
} from '../interfaces';
|
} from '../interfaces';
|
||||||
import { WebSocketService, UserService } from '../services';
|
import { WebSocketService, UserService } from '../services';
|
||||||
|
@ -39,7 +39,6 @@ import { ListingTypeSelect } from './listing-type-select';
|
||||||
import { CommentNodes } from './comment-nodes';
|
import { CommentNodes } from './comment-nodes';
|
||||||
import { MomentTime } from './moment-time';
|
import { MomentTime } from './moment-time';
|
||||||
import { i18n } from '../i18next';
|
import { i18n } from '../i18next';
|
||||||
import { T } from 'inferno-i18next';
|
|
||||||
|
|
||||||
enum View {
|
enum View {
|
||||||
Overview,
|
Overview,
|
||||||
|
@ -245,21 +244,11 @@ export class User extends Component<any, UserState> {
|
||||||
onChange={linkEvent(this, this.handleViewChange)}
|
onChange={linkEvent(this, this.handleViewChange)}
|
||||||
class="custom-select custom-select-sm w-auto"
|
class="custom-select custom-select-sm w-auto"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('view')}</option>
|
||||||
<T i18nKey="view">#</T>
|
<option value={View.Overview}>{i18n.t('overview')}</option>
|
||||||
</option>
|
<option value={View.Comments}>{i18n.t('comments')}</option>
|
||||||
<option value={View.Overview}>
|
<option value={View.Posts}>{i18n.t('posts')}</option>
|
||||||
<T i18nKey="overview">#</T>
|
<option value={View.Saved}>{i18n.t('saved')}</option>
|
||||||
</option>
|
|
||||||
<option value={View.Comments}>
|
|
||||||
<T i18nKey="comments">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={View.Posts}>
|
|
||||||
<T i18nKey="posts">#</T>
|
|
||||||
</option>
|
|
||||||
<option value={View.Saved}>
|
|
||||||
<T i18nKey="saved">#</T>
|
|
||||||
</option>
|
|
||||||
</select>
|
</select>
|
||||||
<span class="ml-2">
|
<span class="ml-2">
|
||||||
<SortSelect
|
<SortSelect
|
||||||
|
@ -359,7 +348,7 @@ export class User extends Component<any, UserState> {
|
||||||
<li className="list-inline-item">{user.name}</li>
|
<li className="list-inline-item">{user.name}</li>
|
||||||
{user.banned && (
|
{user.banned && (
|
||||||
<li className="list-inline-item badge badge-danger">
|
<li className="list-inline-item badge badge-danger">
|
||||||
<T i18nKey="banned">#</T>
|
{i18n.t('banned')}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -371,38 +360,20 @@ export class User extends Component<any, UserState> {
|
||||||
<table class="table table-bordered table-sm mt-2 mb-0">
|
<table class="table table-bordered table-sm mt-2 mb-0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<T
|
{i18n.t('number_of_points', { count: user.post_score })}
|
||||||
i18nKey="number_of_points"
|
|
||||||
interpolation={{ count: user.post_score }}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<T
|
{i18n.t('number_of_posts', { count: user.number_of_posts })}
|
||||||
i18nKey="number_of_posts"
|
|
||||||
interpolation={{ count: user.number_of_posts }}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<T
|
{i18n.t('number_of_points', { count: user.comment_score })}
|
||||||
i18nKey="number_of_points"
|
|
||||||
interpolation={{ count: user.comment_score }}
|
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<T
|
{i18n.t('number_of_comments', {
|
||||||
i18nKey="number_of_comments"
|
count: user.number_of_comments,
|
||||||
interpolation={{ count: user.number_of_comments }}
|
})}
|
||||||
>
|
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -412,7 +383,7 @@ export class User extends Component<any, UserState> {
|
||||||
class="btn btn-block btn-secondary mt-3"
|
class="btn btn-block btn-secondary mt-3"
|
||||||
onClick={linkEvent(this, this.handleLogoutClick)}
|
onClick={linkEvent(this, this.handleLogoutClick)}
|
||||||
>
|
>
|
||||||
<T i18nKey="logout">#</T>
|
{i18n.t('logout')}
|
||||||
</button>
|
</button>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
|
@ -443,14 +414,10 @@ export class User extends Component<any, UserState> {
|
||||||
<div>
|
<div>
|
||||||
<div class="card border-secondary mb-3">
|
<div class="card border-secondary mb-3">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>
|
<h5>{i18n.t('settings')}</h5>
|
||||||
<T i18nKey="settings">#</T>
|
|
||||||
</h5>
|
|
||||||
<form onSubmit={linkEvent(this, this.handleUserSettingsSubmit)}>
|
<form onSubmit={linkEvent(this, this.handleUserSettingsSubmit)}>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>
|
<label>{i18n.t('avatar')}</label>
|
||||||
<T i18nKey="avatar">#</T>
|
|
||||||
</label>
|
|
||||||
<form class="d-inline">
|
<form class="d-inline">
|
||||||
<label
|
<label
|
||||||
htmlFor="file-upload"
|
htmlFor="file-upload"
|
||||||
|
@ -458,7 +425,7 @@ export class User extends Component<any, UserState> {
|
||||||
>
|
>
|
||||||
{!this.state.userSettingsForm.avatar ? (
|
{!this.state.userSettingsForm.avatar ? (
|
||||||
<span class="btn btn-sm btn-secondary">
|
<span class="btn btn-sm btn-secondary">
|
||||||
<T i18nKey="upload_avatar">#</T>
|
{i18n.t('upload_avatar')}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<img
|
<img
|
||||||
|
@ -481,20 +448,14 @@ export class User extends Component<any, UserState> {
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>
|
<label>{i18n.t('language')}</label>
|
||||||
<T i18nKey="language">#</T>
|
|
||||||
</label>
|
|
||||||
<select
|
<select
|
||||||
value={this.state.userSettingsForm.lang}
|
value={this.state.userSettingsForm.lang}
|
||||||
onChange={linkEvent(this, this.handleUserSettingsLangChange)}
|
onChange={linkEvent(this, this.handleUserSettingsLangChange)}
|
||||||
class="ml-2 custom-select custom-select-sm w-auto"
|
class="ml-2 custom-select custom-select-sm w-auto"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('language')}</option>
|
||||||
<T i18nKey="language">#</T>
|
<option value="browser">{i18n.t('browser_default')}</option>
|
||||||
</option>
|
|
||||||
<option value="browser">
|
|
||||||
<T i18nKey="browser_default">#</T>
|
|
||||||
</option>
|
|
||||||
<option disabled>──</option>
|
<option disabled>──</option>
|
||||||
{languages.map(lang => (
|
{languages.map(lang => (
|
||||||
<option value={lang.code}>{lang.name}</option>
|
<option value={lang.code}>{lang.name}</option>
|
||||||
|
@ -502,17 +463,13 @@ export class User extends Component<any, UserState> {
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>
|
<label>{i18n.t('theme')}</label>
|
||||||
<T i18nKey="theme">#</T>
|
|
||||||
</label>
|
|
||||||
<select
|
<select
|
||||||
value={this.state.userSettingsForm.theme}
|
value={this.state.userSettingsForm.theme}
|
||||||
onChange={linkEvent(this, this.handleUserSettingsThemeChange)}
|
onChange={linkEvent(this, this.handleUserSettingsThemeChange)}
|
||||||
class="ml-2 custom-select custom-select-sm w-auto"
|
class="ml-2 custom-select custom-select-sm w-auto"
|
||||||
>
|
>
|
||||||
<option disabled>
|
<option disabled>{i18n.t('theme')}</option>
|
||||||
<T i18nKey="theme">#</T>
|
|
||||||
</option>
|
|
||||||
{themes.map(theme => (
|
{themes.map(theme => (
|
||||||
<option value={theme}>{theme}</option>
|
<option value={theme}>{theme}</option>
|
||||||
))}
|
))}
|
||||||
|
@ -520,9 +477,7 @@ export class User extends Component<any, UserState> {
|
||||||
</div>
|
</div>
|
||||||
<form className="form-group">
|
<form className="form-group">
|
||||||
<label>
|
<label>
|
||||||
<T i18nKey="sort_type" class="mr-2">
|
<div class="mr-2">{i18n.t('sort_type')}</div>
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</label>
|
</label>
|
||||||
<ListingTypeSelect
|
<ListingTypeSelect
|
||||||
type_={this.state.userSettingsForm.default_listing_type}
|
type_={this.state.userSettingsForm.default_listing_type}
|
||||||
|
@ -531,9 +486,7 @@ export class User extends Component<any, UserState> {
|
||||||
</form>
|
</form>
|
||||||
<form className="form-group">
|
<form className="form-group">
|
||||||
<label>
|
<label>
|
||||||
<T i18nKey="type" class="mr-2">
|
<div class="mr-2">{i18n.t('type')}</div>
|
||||||
#
|
|
||||||
</T>
|
|
||||||
</label>
|
</label>
|
||||||
<SortSelect
|
<SortSelect
|
||||||
sort={this.state.userSettingsForm.default_sort_type}
|
sort={this.state.userSettingsForm.default_sort_type}
|
||||||
|
@ -541,12 +494,13 @@ export class User extends Component<any, UserState> {
|
||||||
/>
|
/>
|
||||||
</form>
|
</form>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-lg-3 col-form-label">
|
<label class="col-lg-3 col-form-label" htmlFor="user-email">
|
||||||
<T i18nKey="email">#</T>
|
{i18n.t('email')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-lg-9">
|
<div class="col-lg-9">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
|
id="user-email"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
placeholder={i18n.t('optional')}
|
placeholder={i18n.t('optional')}
|
||||||
value={this.state.userSettingsForm.email}
|
value={this.state.userSettingsForm.email}
|
||||||
|
@ -579,12 +533,13 @@ export class User extends Component<any, UserState> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-lg-5 col-form-label">
|
<label class="col-lg-5 col-form-label" htmlFor="user-password">
|
||||||
<T i18nKey="new_password">#</T>
|
{i18n.t('new_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-lg-7">
|
<div class="col-lg-7">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="user-password"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.userSettingsForm.new_password}
|
value={this.state.userSettingsForm.new_password}
|
||||||
onInput={linkEvent(
|
onInput={linkEvent(
|
||||||
|
@ -595,12 +550,16 @@ export class User extends Component<any, UserState> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-lg-5 col-form-label">
|
<label
|
||||||
<T i18nKey="verify_password">#</T>
|
class="col-lg-5 col-form-label"
|
||||||
|
htmlFor="user-verify-password"
|
||||||
|
>
|
||||||
|
{i18n.t('verify_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-lg-7">
|
<div class="col-lg-7">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="user-verify-password"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.userSettingsForm.new_password_verify}
|
value={this.state.userSettingsForm.new_password_verify}
|
||||||
onInput={linkEvent(
|
onInput={linkEvent(
|
||||||
|
@ -611,12 +570,16 @@ export class User extends Component<any, UserState> {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-lg-5 col-form-label">
|
<label
|
||||||
<T i18nKey="old_password">#</T>
|
class="col-lg-5 col-form-label"
|
||||||
|
htmlFor="user-old-password"
|
||||||
|
>
|
||||||
|
{i18n.t('old_password')}
|
||||||
</label>
|
</label>
|
||||||
<div class="col-lg-7">
|
<div class="col-lg-7">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
id="user-old-password"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
value={this.state.userSettingsForm.old_password}
|
value={this.state.userSettingsForm.old_password}
|
||||||
onInput={linkEvent(
|
onInput={linkEvent(
|
||||||
|
@ -631,6 +594,7 @@ export class User extends Component<any, UserState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="user-show-nsfw"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.userSettingsForm.show_nsfw}
|
checked={this.state.userSettingsForm.show_nsfw}
|
||||||
onChange={linkEvent(
|
onChange={linkEvent(
|
||||||
|
@ -638,8 +602,8 @@ export class User extends Component<any, UserState> {
|
||||||
this.handleUserSettingsShowNsfwChange
|
this.handleUserSettingsShowNsfwChange
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="user-show-nsfw">
|
||||||
<T i18nKey="show_nsfw">#</T>
|
{i18n.t('show_nsfw')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -648,6 +612,7 @@ export class User extends Component<any, UserState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="user-show-avatars"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={this.state.userSettingsForm.show_avatars}
|
checked={this.state.userSettingsForm.show_avatars}
|
||||||
onChange={linkEvent(
|
onChange={linkEvent(
|
||||||
|
@ -655,8 +620,8 @@ export class User extends Component<any, UserState> {
|
||||||
this.handleUserSettingsShowAvatarsChange
|
this.handleUserSettingsShowAvatarsChange
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label class="form-check-label" htmlFor="user-show-avatars">
|
||||||
<T i18nKey="show_avatars">#</T>
|
{i18n.t('show_avatars')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -664,6 +629,7 @@ export class User extends Component<any, UserState> {
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
|
id="user-send-notifications-to-email"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
disabled={!this.state.user.email}
|
disabled={!this.state.user.email}
|
||||||
checked={
|
checked={
|
||||||
|
@ -674,8 +640,11 @@ export class User extends Component<any, UserState> {
|
||||||
this.handleUserSettingsSendNotificationsToEmailChange
|
this.handleUserSettingsSendNotificationsToEmailChange
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<label class="form-check-label">
|
<label
|
||||||
<T i18nKey="send_notifications_to_email">#</T>
|
class="form-check-label"
|
||||||
|
htmlFor="user-send-notifications-to-email"
|
||||||
|
>
|
||||||
|
{i18n.t('send_notifications_to_email')}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -699,12 +668,12 @@ export class User extends Component<any, UserState> {
|
||||||
this.handleDeleteAccountShowConfirmToggle
|
this.handleDeleteAccountShowConfirmToggle
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="delete_account">#</T>
|
{i18n.t('delete_account')}
|
||||||
</button>
|
</button>
|
||||||
{this.state.deleteAccountShowConfirm && (
|
{this.state.deleteAccountShowConfirm && (
|
||||||
<>
|
<>
|
||||||
<div class="my-2 alert alert-danger" role="alert">
|
<div class="my-2 alert alert-danger" role="alert">
|
||||||
<T i18nKey="delete_account_confirm">#</T>
|
{i18n.t('delete_account_confirm')}
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
|
@ -735,7 +704,7 @@ export class User extends Component<any, UserState> {
|
||||||
this.handleDeleteAccountShowConfirmToggle
|
this.handleDeleteAccountShowConfirmToggle
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<T i18nKey="cancel">#</T>
|
{i18n.t('cancel')}
|
||||||
</button>
|
</button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -753,9 +722,7 @@ export class User extends Component<any, UserState> {
|
||||||
{this.state.moderates.length > 0 && (
|
{this.state.moderates.length > 0 && (
|
||||||
<div class="card border-secondary mb-3">
|
<div class="card border-secondary mb-3">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>
|
<h5>{i18n.t('moderates')}</h5>
|
||||||
<T i18nKey="moderates">#</T>
|
|
||||||
</h5>
|
|
||||||
<ul class="list-unstyled mb-0">
|
<ul class="list-unstyled mb-0">
|
||||||
{this.state.moderates.map(community => (
|
{this.state.moderates.map(community => (
|
||||||
<li>
|
<li>
|
||||||
|
@ -778,9 +745,7 @@ export class User extends Component<any, UserState> {
|
||||||
{this.state.follows.length > 0 && (
|
{this.state.follows.length > 0 && (
|
||||||
<div class="card border-secondary mb-3">
|
<div class="card border-secondary mb-3">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>
|
<h5>{i18n.t('subscribed')}</h5>
|
||||||
<T i18nKey="subscribed">#</T>
|
|
||||||
</h5>
|
|
||||||
<ul class="list-unstyled mb-0">
|
<ul class="list-unstyled mb-0">
|
||||||
{this.state.follows.map(community => (
|
{this.state.follows.map(community => (
|
||||||
<li>
|
<li>
|
||||||
|
@ -805,14 +770,14 @@ export class User extends Component<any, UserState> {
|
||||||
class="btn btn-sm btn-secondary mr-1"
|
class="btn btn-sm btn-secondary mr-1"
|
||||||
onClick={linkEvent(this, this.prevPage)}
|
onClick={linkEvent(this, this.prevPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="prev">#</T>
|
{i18n.t('prev')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-secondary"
|
class="btn btn-sm btn-secondary"
|
||||||
onClick={linkEvent(this, this.nextPage)}
|
onClick={linkEvent(this, this.nextPage)}
|
||||||
>
|
>
|
||||||
<T i18nKey="next">#</T>
|
{i18n.t('next')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1090,7 +1055,7 @@ export class User extends Component<any, UserState> {
|
||||||
if (data.comment.my_vote !== null) found.my_vote = data.comment.my_vote;
|
if (data.comment.my_vote !== null) found.my_vote = data.comment.my_vote;
|
||||||
this.setState(this.state);
|
this.setState(this.state);
|
||||||
} else if (res.op == UserOperation.CreatePostLike) {
|
} else if (res.op == UserOperation.CreatePostLike) {
|
||||||
let data = res.data as CreatePostLikeResponse;
|
let data = res.data as PostResponse;
|
||||||
let found = this.state.posts.find(c => c.id == data.post.id);
|
let found = this.state.posts.find(c => c.id == data.post.id);
|
||||||
found.my_vote = data.post.my_vote;
|
found.my_vote = data.post.my_vote;
|
||||||
found.score = data.post.score;
|
found.score = data.post.score;
|
||||||
|
|
2
ui/src/translations/en.ts
vendored
2
ui/src/translations/en.ts
vendored
|
@ -230,5 +230,7 @@ export const en = {
|
||||||
couldnt_create_private_message: "Couldn't create private message.",
|
couldnt_create_private_message: "Couldn't create private message.",
|
||||||
no_private_message_edit_allowed: 'Not allowed to edit private message.',
|
no_private_message_edit_allowed: 'Not allowed to edit private message.',
|
||||||
couldnt_update_private_message: "Couldn't update private message.",
|
couldnt_update_private_message: "Couldn't update private message.",
|
||||||
|
time: 'Time',
|
||||||
|
action: 'Action',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue