Merge branch 'master' into glitch-soc/merge-upstream
commit
2b97d9d780
|
@ -65,7 +65,7 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
|
|
||||||
RemovalWorker.perform_async(@status.id)
|
RemovalWorker.perform_async(@status.id)
|
||||||
|
|
||||||
render_empty
|
render json: @status, serializer: REST::StatusSerializer, source_requested: true
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -131,10 +131,11 @@ export function fetchStatusFail(id, error, skipLoading) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export function redraft(status) {
|
export function redraft(status, raw_text) {
|
||||||
return {
|
return {
|
||||||
type: REDRAFT,
|
type: REDRAFT,
|
||||||
status,
|
status,
|
||||||
|
raw_text,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -148,13 +149,13 @@ export function deleteStatus(id, router, withRedraft = false) {
|
||||||
|
|
||||||
dispatch(deleteStatusRequest(id));
|
dispatch(deleteStatusRequest(id));
|
||||||
|
|
||||||
api(getState).delete(`/api/v1/statuses/${id}`).then(() => {
|
api(getState).delete(`/api/v1/statuses/${id}`).then(response => {
|
||||||
evictStatus(id);
|
evictStatus(id);
|
||||||
dispatch(deleteStatusSuccess(id));
|
dispatch(deleteStatusSuccess(id));
|
||||||
dispatch(deleteFromTimelines(id));
|
dispatch(deleteFromTimelines(id));
|
||||||
|
|
||||||
if (withRedraft) {
|
if (withRedraft) {
|
||||||
dispatch(redraft(status));
|
dispatch(redraft(status, response.data.text));
|
||||||
|
|
||||||
if (!getState().getIn(['compose', 'mounted'])) {
|
if (!getState().getIn(['compose', 'mounted'])) {
|
||||||
router.push('/statuses/new');
|
router.push('/statuses/new');
|
||||||
|
|
|
@ -4,7 +4,6 @@ import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { changeComposeSensitivity } from 'mastodon/actions/compose';
|
import { changeComposeSensitivity } from 'mastodon/actions/compose';
|
||||||
import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
|
import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
|
||||||
import Icon from 'mastodon/components/icon';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },
|
marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },
|
||||||
|
@ -38,9 +37,19 @@ class SensitiveButton extends React.PureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='compose-form__sensitive-button'>
|
<div className='compose-form__sensitive-button'>
|
||||||
<button className={classNames('icon-button', { active })} onClick={onClick} disabled={disabled} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>
|
<label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>
|
||||||
<Icon id='eye-slash' /> <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />
|
<input
|
||||||
</button>
|
name='mark-sensitive'
|
||||||
|
type='checkbox'
|
||||||
|
checked={active}
|
||||||
|
onChange={onClick}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<span className={classNames('checkbox', { active })} />
|
||||||
|
|
||||||
|
<FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
"compose_form.poll.remove_option": "Toglie sta scelta",
|
"compose_form.poll.remove_option": "Toglie sta scelta",
|
||||||
"compose_form.publish": "Toot",
|
"compose_form.publish": "Toot",
|
||||||
"compose_form.publish_loud": "{publish}!",
|
"compose_form.publish_loud": "{publish}!",
|
||||||
|
"compose_form.sensitive.hide": "Indicà u media cum'è sensibile",
|
||||||
"compose_form.sensitive.marked": "Media indicatu cum'è sensibile",
|
"compose_form.sensitive.marked": "Media indicatu cum'è sensibile",
|
||||||
"compose_form.sensitive.unmarked": "Media micca indicatu cum'è sensibile",
|
"compose_form.sensitive.unmarked": "Media micca indicatu cum'è sensibile",
|
||||||
"compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu",
|
"compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu",
|
||||||
|
@ -209,6 +210,7 @@
|
||||||
"lightbox.close": "Chjudà",
|
"lightbox.close": "Chjudà",
|
||||||
"lightbox.next": "Siguente",
|
"lightbox.next": "Siguente",
|
||||||
"lightbox.previous": "Pricidente",
|
"lightbox.previous": "Pricidente",
|
||||||
|
"lightbox.view_context": "Vede u cuntestu",
|
||||||
"lists.account.add": "Aghjunghje à a lista",
|
"lists.account.add": "Aghjunghje à a lista",
|
||||||
"lists.account.remove": "Toglie di a lista",
|
"lists.account.remove": "Toglie di a lista",
|
||||||
"lists.delete": "Supprime a lista",
|
"lists.delete": "Supprime a lista",
|
||||||
|
@ -340,7 +342,6 @@
|
||||||
"status.reply": "Risponde",
|
"status.reply": "Risponde",
|
||||||
"status.replyAll": "Risponde à tutti",
|
"status.replyAll": "Risponde à tutti",
|
||||||
"status.report": "Palisà @{name}",
|
"status.report": "Palisà @{name}",
|
||||||
"status.sensitive_toggle": "Cliccate per vede",
|
|
||||||
"status.sensitive_warning": "Cuntinutu sensibile",
|
"status.sensitive_warning": "Cuntinutu sensibile",
|
||||||
"status.share": "Sparte",
|
"status.share": "Sparte",
|
||||||
"status.show_less": "Ripiegà",
|
"status.show_less": "Ripiegà",
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
"compose_form.poll.remove_option": "Supprimer ce choix",
|
"compose_form.poll.remove_option": "Supprimer ce choix",
|
||||||
"compose_form.publish": "Pouet",
|
"compose_form.publish": "Pouet",
|
||||||
"compose_form.publish_loud": "{publish} !",
|
"compose_form.publish_loud": "{publish} !",
|
||||||
|
"compose_form.sensitive.hide": "Marquer le média comme sensible",
|
||||||
"compose_form.sensitive.marked": "Média marqué comme sensible",
|
"compose_form.sensitive.marked": "Média marqué comme sensible",
|
||||||
"compose_form.sensitive.unmarked": "Média non marqué comme sensible",
|
"compose_form.sensitive.unmarked": "Média non marqué comme sensible",
|
||||||
"compose_form.spoiler.marked": "Le texte est caché derrière un avertissement",
|
"compose_form.spoiler.marked": "Le texte est caché derrière un avertissement",
|
||||||
|
@ -209,6 +210,7 @@
|
||||||
"lightbox.close": "Fermer",
|
"lightbox.close": "Fermer",
|
||||||
"lightbox.next": "Suivant",
|
"lightbox.next": "Suivant",
|
||||||
"lightbox.previous": "Précédent",
|
"lightbox.previous": "Précédent",
|
||||||
|
"lightbox.view_context": "Voir le contexte",
|
||||||
"lists.account.add": "Ajouter à la liste",
|
"lists.account.add": "Ajouter à la liste",
|
||||||
"lists.account.remove": "Supprimer de la liste",
|
"lists.account.remove": "Supprimer de la liste",
|
||||||
"lists.delete": "Effacer la liste",
|
"lists.delete": "Effacer la liste",
|
||||||
|
@ -340,7 +342,6 @@
|
||||||
"status.reply": "Répondre",
|
"status.reply": "Répondre",
|
||||||
"status.replyAll": "Répondre au fil",
|
"status.replyAll": "Répondre au fil",
|
||||||
"status.report": "Signaler @{name}",
|
"status.report": "Signaler @{name}",
|
||||||
"status.sensitive_toggle": "Cliquer pour afficher",
|
|
||||||
"status.sensitive_warning": "Contenu sensible",
|
"status.sensitive_warning": "Contenu sensible",
|
||||||
"status.share": "Partager",
|
"status.share": "Partager",
|
||||||
"status.show_less": "Replier",
|
"status.show_less": "Replier",
|
||||||
|
|
|
@ -331,7 +331,7 @@ export default function compose(state = initialState, action) {
|
||||||
}));
|
}));
|
||||||
case REDRAFT:
|
case REDRAFT:
|
||||||
return state.withMutations(map => {
|
return state.withMutations(map => {
|
||||||
map.set('text', unescapeHTML(expandMentions(action.status)));
|
map.set('text', action.raw_content || unescapeHTML(expandMentions(action.status)));
|
||||||
map.set('in_reply_to', action.status.get('in_reply_to_id'));
|
map.set('in_reply_to', action.status.get('in_reply_to_id'));
|
||||||
map.set('privacy', action.status.get('visibility'));
|
map.set('privacy', action.status.get('visibility'));
|
||||||
map.set('media_attachments', action.status.get('media_attachments'));
|
map.set('media_attachments', action.status.get('media_attachments'));
|
||||||
|
|
|
@ -268,9 +268,34 @@
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
|
|
||||||
.icon-button {
|
font-size: 14px;
|
||||||
font-size: 14px;
|
font-weight: 500;
|
||||||
font-weight: 500;
|
|
||||||
|
&.active {
|
||||||
|
color: $highlight-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid $ui-primary-color;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
margin-right: 10px;
|
||||||
|
top: -1px;
|
||||||
|
border-radius: 4px;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
border-color: $highlight-text-color;
|
||||||
|
background: $highlight-text-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class REST::StatusSerializer < ActiveModel::Serializer
|
class REST::StatusSerializer < ActiveModel::Serializer
|
||||||
attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
|
attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
|
||||||
:sensitive, :spoiler_text, :visibility, :language,
|
:sensitive, :spoiler_text, :visibility, :language,
|
||||||
:uri, :content, :url, :replies_count, :reblogs_count,
|
:uri, :url, :replies_count, :reblogs_count,
|
||||||
:favourites_count
|
:favourites_count
|
||||||
|
|
||||||
attribute :favourited, if: :current_user?
|
attribute :favourited, if: :current_user?
|
||||||
|
@ -13,6 +13,9 @@ class REST::StatusSerializer < ActiveModel::Serializer
|
||||||
attribute :pinned, if: :pinnable?
|
attribute :pinned, if: :pinnable?
|
||||||
attribute :local_only if :local?
|
attribute :local_only if :local?
|
||||||
|
|
||||||
|
attribute :content, unless: :source_requested?
|
||||||
|
attribute :text, if: :source_requested?
|
||||||
|
|
||||||
belongs_to :reblog, serializer: REST::StatusSerializer
|
belongs_to :reblog, serializer: REST::StatusSerializer
|
||||||
belongs_to :application, if: :show_application?
|
belongs_to :application, if: :show_application?
|
||||||
belongs_to :account, serializer: REST::AccountSerializer
|
belongs_to :account, serializer: REST::AccountSerializer
|
||||||
|
@ -115,6 +118,10 @@ class REST::StatusSerializer < ActiveModel::Serializer
|
||||||
%w(public unlisted).include?(object.visibility)
|
%w(public unlisted).include?(object.visibility)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def source_requested?
|
||||||
|
instance_options[:source_requested]
|
||||||
|
end
|
||||||
|
|
||||||
def ordered_mentions
|
def ordered_mentions
|
||||||
object.active_mentions.to_a.sort_by(&:id)
|
object.active_mentions.to_a.sort_by(&:id)
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
.log-entry__title
|
.log-entry__title
|
||||||
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
|
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
|
||||||
.log-entry__timestamp
|
.log-entry__timestamp
|
||||||
%time= l action_log.created_at
|
%time.formatted{ datetime: action_log.created_at.iso8601 }
|
||||||
.spacer
|
.spacer
|
||||||
.log-entry__icon
|
.log-entry__icon
|
||||||
= fa_icon icon_for_log(action_log)
|
= fa_icon icon_for_log(action_log)
|
||||||
|
|
|
@ -81,7 +81,7 @@ co:
|
||||||
destroyed_msg: Nota di muderazione sguassata!
|
destroyed_msg: Nota di muderazione sguassata!
|
||||||
accounts:
|
accounts:
|
||||||
approve: Appruvà
|
approve: Appruvà
|
||||||
approve_all: Appruvà tutti
|
approve_all: Appruvà tuttu
|
||||||
are_you_sure: Site sicuru·a?
|
are_you_sure: Site sicuru·a?
|
||||||
avatar: Ritrattu di prufile
|
avatar: Ritrattu di prufile
|
||||||
by_domain: Duminiu
|
by_domain: Duminiu
|
||||||
|
@ -877,6 +877,7 @@ co:
|
||||||
migrate: Migrazione di u contu
|
migrate: Migrazione di u contu
|
||||||
notifications: Nutificazione
|
notifications: Nutificazione
|
||||||
preferences: Priferenze
|
preferences: Priferenze
|
||||||
|
profile: Prufile
|
||||||
relationships: Abbunamenti è abbunati
|
relationships: Abbunamenti è abbunati
|
||||||
two_factor_authentication: Identificazione à dui fattori
|
two_factor_authentication: Identificazione à dui fattori
|
||||||
statuses:
|
statuses:
|
||||||
|
|
|
@ -26,6 +26,8 @@ fr:
|
||||||
hosted_on: Serveur Mastodon hébergée par %{domain}
|
hosted_on: Serveur Mastodon hébergée par %{domain}
|
||||||
learn_more: En savoir plus
|
learn_more: En savoir plus
|
||||||
privacy_policy: Politique de vie privée
|
privacy_policy: Politique de vie privée
|
||||||
|
see_whats_happening: Voir ce qui se passe
|
||||||
|
server_stats: 'Statistiques du serveur :'
|
||||||
source_code: Code source
|
source_code: Code source
|
||||||
status_count_after:
|
status_count_after:
|
||||||
one: Statut
|
one: Statut
|
||||||
|
@ -66,6 +68,7 @@ fr:
|
||||||
admin: Admin
|
admin: Admin
|
||||||
bot: Robot
|
bot: Robot
|
||||||
moderator: Modérateur·trice
|
moderator: Modérateur·trice
|
||||||
|
unavailable: Profil non disponible
|
||||||
unfollow: Ne plus suivre
|
unfollow: Ne plus suivre
|
||||||
admin:
|
admin:
|
||||||
account_actions:
|
account_actions:
|
||||||
|
@ -77,6 +80,8 @@ fr:
|
||||||
delete: Supprimer
|
delete: Supprimer
|
||||||
destroyed_msg: Note de modération supprimée avec succès !
|
destroyed_msg: Note de modération supprimée avec succès !
|
||||||
accounts:
|
accounts:
|
||||||
|
approve: Approuver
|
||||||
|
approve_all: Tout approuver
|
||||||
are_you_sure: Êtes-vous certain⋅e ?
|
are_you_sure: Êtes-vous certain⋅e ?
|
||||||
avatar: Avatar
|
avatar: Avatar
|
||||||
by_domain: Domaine
|
by_domain: Domaine
|
||||||
|
@ -868,6 +873,7 @@ fr:
|
||||||
featured_tags: Hashtags mis en avant
|
featured_tags: Hashtags mis en avant
|
||||||
identity_proofs: Preuves d’identité
|
identity_proofs: Preuves d’identité
|
||||||
import: Import de données
|
import: Import de données
|
||||||
|
import_and_export: Import et export
|
||||||
migrate: Migration de compte
|
migrate: Migration de compte
|
||||||
notifications: Notifications
|
notifications: Notifications
|
||||||
preferences: Préférences
|
preferences: Préférences
|
||||||
|
|
|
@ -128,6 +128,7 @@ fr:
|
||||||
follow: Envoyer un courriel lorsque quelqu’un me suit
|
follow: Envoyer un courriel lorsque quelqu’un me suit
|
||||||
follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre
|
follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre
|
||||||
mention: Envoyer un courriel lorsque quelqu’un me mentionne
|
mention: Envoyer un courriel lorsque quelqu’un me mentionne
|
||||||
|
pending_account: Envoyer un courriel lorsqu'un nouveau compte est en attente d'approbation
|
||||||
reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts
|
reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts
|
||||||
report: Envoyer un courriel lorsqu’un nouveau rapport est soumis
|
report: Envoyer un courriel lorsqu’un nouveau rapport est soumis
|
||||||
'no': Non
|
'no': Non
|
||||||
|
|
Loading…
Reference in New Issue