Improve Terms of Service

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2020-06-19 19:27:10 +02:00
parent 9cc5cb72b5
commit f5241954bd
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
56 changed files with 10908 additions and 3348 deletions

View File

@ -36,16 +36,16 @@
"ngeohash": "^0.6.3",
"phoenix": "^1.4.11",
"register-service-worker": "^1.7.1",
"tippy.js": "4.3.5",
"tippy.js": "^6.2.3",
"tiptap": "^1.26.0",
"tiptap-extensions": "^1.28.0",
"tiptap-extensions": "^1.29.1",
"v-tooltip": "2.0.2",
"vue": "^2.6.11",
"vue-apollo": "^3.0.3",
"vue-class-component": "^7.2.3",
"vue-i18n": "^8.14.0",
"vue-meta": "^2.3.1",
"vue-property-decorator": "^8.4.1",
"vue-property-decorator": "^9.0.0",
"vue-router": "^3.1.6",
"vue-scrollto": "^2.17.1",
"vue2-leaflet": "^2.0.3",
@ -90,7 +90,7 @@
"prettier-eslint": "^10.1.1",
"sass-loader": "^8.0.2",
"typescript": "~3.9.3",
"vue-cli-plugin-styleguidist": "~4.24.0",
"vue-cli-plugin-styleguidist": "^4.25.0",
"vue-cli-plugin-svg": "~0.1.3",
"vue-i18n-extract": "^1.0.2",
"vue-template-compiler": "^2.6.11",

View File

@ -156,14 +156,21 @@
<div
v-for="(actor, index) in filteredActors"
:key="actor.id"
class="suggestion-list__item"
class="media suggestion-list__item"
:class="{ 'is-selected': navigatedActorIndex === index }"
@click="selectActor(actor)"
>
{{ actor.name }}
<div class="media-left">
<figure class="image is-16x16" v-if="actor.avatar">
<img :src="actor.avatar.url" alt="" />
</figure>
</div>
<div class="media-content">
{{ actor.name }}
</div>
</div>
</template>
<div v-else class="suggestion-list__item is-empty">{{ $t("No actors found") }}</div>
<div v-else class="suggestion-list__item is-empty">{{ $t("No profiles found") }}</div>
</div>
</div>
</template>
@ -189,7 +196,7 @@ import {
Placeholder,
Mention,
} from "tiptap-extensions";
import tippy, { Instance } from "tippy.js";
import tippy, { Instance, sticky } from "tippy.js";
import { SEARCH_PERSONS } from "../graphql/search";
import { Actor, IActor, IPerson } from "../types/actor";
import Image from "./Editor/Image";
@ -226,7 +233,7 @@ export default class EditorComponent extends Vue {
navigatedActorIndex = 0;
popup!: Instance | null;
popup!: Instance[] | null;
get isDescriptionMode() {
return this.mode === "description";
@ -319,18 +326,15 @@ export default class EditorComponent extends Vue {
* is called on every keyDown event while a suggestion is active
*/
onKeyDown: ({ event }: { event: KeyboardEvent }) => {
// pressing up arrow
if (event.keyCode === 38) {
if (event.key === "ArrowUp") {
this.upHandler();
return true;
}
// pressing down arrow
if (event.keyCode === 40) {
if (event.key === "ArrowDown") {
this.downHandler();
return true;
}
// pressing enter
if (event.keyCode === 13) {
if (event.key === "Enter") {
this.enterHandler();
return true;
}
@ -440,6 +444,7 @@ export default class EditorComponent extends Vue {
this.editor.focus();
}
/** We use this to programatically insert an actor mention when creating a reply to comment */
replyToComment(comment: IComment) {
const actorModel = new Actor(comment.actor);
if (!this.editor) return;
@ -455,40 +460,31 @@ export default class EditorComponent extends Vue {
* tiptap provides a virtualNode object for using popper.js (or tippy.js) for popups
* @param node
*/
renderPopup(node: any) {
renderPopup(node: Element) {
if (this.popup) {
return;
}
this.popup = tippy(node, {
this.popup = tippy("#mobilizon", {
// @ts-ignore
getReferenceClientRect: node.getBoundingClientRect,
appendTo: () => document.body,
content: this.$refs.suggestions as HTMLElement,
trigger: "mouseenter",
interactive: true,
sticky: true, // make sure position of tippy is updated when content changes
plugins: [sticky],
showOnCreate: true,
theme: "dark",
placement: "top-start",
inertia: true,
duration: [400, 200],
showOnInit: true,
arrow: true,
arrowType: "round",
}) as Instance;
// we have to update tippy whenever the DOM is updated
if (MutationObserver) {
this.observer = new MutationObserver(() => {
if (this.popup != null && this.popup.popperInstance) {
this.popup.popperInstance.scheduleUpdate();
}
});
this.observer.observe(this.$refs.suggestions as HTMLElement, {
childList: true,
subtree: true,
characterData: true,
});
}
}) as Instance[];
}
destroyPopup() {
if (this.popup) {
this.popup.destroy();
// @ts-ignore
this.popup[0].destroy();
this.popup = null;
}
if (this.observer) {
@ -517,6 +513,7 @@ export default class EditorComponent extends Vue {
beforeDestroy() {
if (!this.editor) return;
this.destroyPopup();
this.editor.destroy();
}
}
@ -733,32 +730,19 @@ $color-white: #eee;
opacity: 0.5;
}
}
.media + .media {
margin-top: 0;
padding-top: 0;
}
}
.tippy-tooltip.dark-theme {
.tippy-box[data-theme~="dark"] {
background-color: $color-black;
padding: 0;
font-size: 1rem;
text-align: inherit;
color: $color-white;
border-radius: 5px;
.tippy-backdrop {
display: none;
}
.tippy-roundarrow {
fill: $color-black;
}
.tippy-popper[x-placement^="top"] & .tippy-arrow {
border-top-color: $color-black;
}
.tippy-popper[x-placement^="bottom"] & .tippy-arrow {
border-bottom-color: $color-black;
}
.tippy-popper[x-placement^="left"] & .tippy-arrow {
border-left-color: $color-black;
}
.tippy-popper[x-placement^="right"] & .tippy-arrow {
border-right-color: $color-black;
}
}
.visually-hidden {

View File

@ -1,7 +1,13 @@
<template>
<ul>
<SettingMenuSection v-for="section in menuValue" :key="section.title" :menu-section="section" />
</ul>
<aside>
<ul>
<SettingMenuSection
v-for="section in menuValue"
:key="section.title"
:menu-section="section"
/>
</ul>
</aside>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";

View File

@ -108,9 +108,14 @@ export const ADMIN_SETTINGS_FRAGMENT = gql`
fragment adminSettingsFragment on AdminSettings {
instanceName
instanceDescription
instanceLongDescription
contact
instanceTerms
instanceTermsType
instanceTermsUrl
instancePrivacyPolicy
instancePrivacyPolicyType
instancePrivacyPolicyUrl
instanceRules
registrationsOpen
}
@ -129,18 +134,28 @@ export const SAVE_ADMIN_SETTINGS = gql`
mutation SaveAdminSettings(
$instanceName: String
$instanceDescription: String
$instanceLongDescription: String
$contact: String
$instanceTerms: String
$instanceTermsType: InstanceTermsType
$instanceTermsUrl: String
$instancePrivacyPolicy: String
$instancePrivacyPolicyType: InstancePrivacyType
$instancePrivacyPolicyUrl: String
$instanceRules: String
$registrationsOpen: Boolean
) {
saveAdminSettings(
instanceName: $instanceName
instanceDescription: $instanceDescription
instanceLongDescription: $instanceLongDescription
contact: $contact
instanceTerms: $instanceTerms
instanceTermsType: $instanceTermsType
instanceTermsUrl: $instanceTermsUrl
instancePrivacyPolicy: $instancePrivacyPolicy
instancePrivacyPolicyType: $instancePrivacyPolicyType
instancePrivacyPolicyUrl: $instancePrivacyPolicyUrl
instanceRules: $instanceRules
registrationsOpen: $registrationsOpen
) {

View File

@ -78,6 +78,26 @@ export const TERMS = gql`
}
`;
export const ABOUT = gql`
query About {
config {
name
description
longDescription
contact
registrationsOpen
registrationsWhitelist
anonymous {
participation {
allowed
}
}
version
federating
}
}
`;
export const RULES = gql`
query Rules {
config {
@ -86,6 +106,18 @@ export const RULES = gql`
}
`;
export const PRIVACY = gql`
query Privacy($locale: String) {
config {
privacy(locale: $locale) {
type
url
bodyHtml
}
}
}
`;
export const TIMEZONES = gql`
query {
config {

View File

@ -0,0 +1,11 @@
import gql from "graphql-tag";
export const STATISTICS = gql`
query {
statistics {
numberOfUsers
numberOfEvents
numberOfComments
}
}
`;

View File

@ -87,7 +87,6 @@
"Date and time settings": "Date and time settings",
"Date parameters": "Date parameters",
"Date": "Date",
"Default Mobilizon.org terms": "Default Mobilizon.org terms",
"Default": "Default",
"Delete Comment": "Delete Comment",
"Delete Event": "Delete Event",
@ -120,7 +119,6 @@
"Email": "Email",
"Ends on…": "Ends on…",
"Enter the link URL": "Enter the link URL",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.",
"Error while changing email": "Error while changing email",
"Error while communicating with the server.": "Error while communicating with the server.",
"Error while saving report.": "Error while saving report.",
@ -184,7 +182,6 @@
"Impossible to login, your email or password seems incorrect.": "Impossible to login, your email or password seems incorrect.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.",
"Instance Description": "Instance Description",
"Instance Name": "Instance Name",
"Instance Terms Source": "Instance Terms Source",
"Instance Terms URL": "Instance Terms URL",
@ -227,7 +224,6 @@
"New password": "New password",
"New profile": "New profile",
"Next page": "Next page",
"No actors found": "No actors found",
"No address defined": "No address defined",
"No closed reports yet": "No closed reports yet",
"No comment": "No comment",
@ -651,5 +647,52 @@
"Forgot your password?": "Forgot your password?",
"Enter your email address below, and we'll email you instructions on how to change your password.": "Enter your email address below, and we'll email you instructions on how to change your password.",
"Submit": "Submit",
"Email address": "Email address"
"Email address": "Email address",
"Legal": "Legal",
"Terms of service": "Terms of service",
"Privacy policy": "Privacy policy",
"Instance rules": "Instance rules",
"Glossary": "Glossary",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:",
"Instance": "Instance",
"Mobilizon software": "Mobilizon software",
"Instance administrator": "Instance administrator",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "The instance administrator is the person or entity that runs this Mobilizon instance.",
"Application": "Application",
"In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.": "In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.",
"API": "API",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.",
"SSL/TLS": "SSL/TLS",
"Cookies and Local storage": "Cookies and Local storage",
"A cookie is a small file containing informations that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows to store more data.": "A cookie is a small file containing informations that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows to store more data.",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.",
"SSL and it's successor TLS are encryption technologies to secure data communications when using the service. You can recognize an encrypted connection in your browser's address line when the URL begins with {https} and the lock icon is displayed in your browser's address bar.": "SSL and it's successor TLS are encryption technologies to secure data communications when using the service. You can recognize an encrypted connection in your browser's address line when the URL begins with {https} and the lock icon is displayed in your browser's address bar.",
"Home to {number} users": "Home to {number} users",
"Who published {number} events": "Who published {number} events",
"And {number} comments": "And {number} comments",
"Instance configuration": "Instance configuration",
"Mobilizon version": "Mobilizon version",
"Registrations": "Registrations",
"Restricted": "Restricted",
"Enabled": "Enabled",
"If allowed by organizer": "If allowed by organizer",
"Instance Privacy Policy Source": "Instance Privacy Policy Source",
"default Mobilizon privacy policy": "default Mobilizon privacy policy",
"Set an URL to a page with your own privacy policy.": "Set an URL to a page with your own privacy policy.",
"Instance Privacy Policy URL": "Instance Privacy Policy URL",
"Instance Privacy Policy": "Instance Privacy Policy",
"The {default_privacy_policy} will be used. They will be translated in the user's language.": "The {default_privacy_policy} will be used. They will be translated in the user's language.",
"Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.",
"Default Mobilizon terms": "Default Mobilizon terms",
"Default Mobilizon privacy policy": "Default Mobilizon privacy policy",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.",
"Instance Short Description": "Instance Short Description",
"Instance Long Description": "Instance Long Description",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "A place to explain who you are and the things that set your instance apart. You can use HTML tags.",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "A place for your code of conduct, rules or guidelines. You can use HTML tags.",
"contact uninformed": "contact uninformed",
"Can be an email or a link, or just plain text.": "Can be an email or a link, or just plain text.",
"No profiles found": "No profiles found"
}

View File

@ -25,7 +25,6 @@
"Add to my calendar": "Ajouter à mon agenda",
"Additional comments": "Commentaires additionnels",
"Admin": "Admin",
"Admin settings": "Paramètres administrateur",
"Admin settings successfully saved.": "Les paramètres administrateur ont bien été sauvegardés.",
"Administration": "Administration",
"All group members and other eventual server admins will still be able to view this information.": "Tous les membres du groupes et les administrateur·ices d'éventuels autres serveurs seront toujours en capacité de voir cette information.",
@ -51,7 +50,6 @@
"Bold": "Gras",
"By @{group}": "Par @{group}",
"By @{username}": "Par @{username}",
"By @{username} and @{group}": "Par @{username} et @{group}",
"By {username} and {group}": "Par {username} et {group}",
"Cancel": "Annuler",
"Cancel anonymous participation": "Annuler ma participation anonyme",
@ -65,19 +63,16 @@
"Change my email": "Changer mon adresse e-mail",
"Change my identity…": "Changer mon identité…",
"Change my password": "Modifier mon mot de passe",
"Change password": "Modifier mot de passe",
"Clear": "Effacer",
"Click to select": "Cliquez pour sélectionner",
"Click to upload": "Cliquez pour uploader",
"Close": "Fermé",
"Close comments for all (except for admins)": "Fermer les commentaires à tout le monde (excepté les administrateur⋅ices)",
"Closed": "Fermé",
"Collections": "Collections",
"Comment deleted": "Commentaire supprimé",
"Comment from @{username} reported": "Commentaire de @{username} signalé",
"Comments": "Commentaires",
"Comments have been closed.": "Les commentaires sont fermés.",
"Comments on the event page": "Commentaires sur la page de l'événement",
"Confirm my participation": "Confirmer ma participation",
"Confirm my particpation": "Confirmer ma participation",
"Confirmed: Will happen": "Confirmé : aura lieu",
@ -92,11 +87,9 @@
"Create a new group": "Créer un nouveau groupe",
"Create a new identity": "Créer une nouvelle identité",
"Create a new list": "Créer une nouvelle liste",
"Create a new task list": "Créer une nouvelle liste de tâches",
"Create a pad": "Créer un pad",
"Create a visioconference": "Créer une visio-conférence",
"Create and manage several identities from the same account": "Créer et gérer plusieurs identités sur un même compte",
"Create folder": "Créer un dossier",
"Create group": "Créer un groupe",
"Create my event": "Créer mon évènement",
"Create my group": "Créer mon groupe",
@ -116,8 +109,7 @@
"Date and time settings": "Paramètres de date et d'heure",
"Date parameters": "Paramètres de date",
"Decline": "Refuser",
"Default": "Default",
"Default Mobilizon.org terms": "Conditions d'utilisation par défaut de Mobilizon.org",
"Default": "Défaut",
"Delete": "Supprimer",
"Delete Comment": "Supprimer le commentaire",
"Delete Event": "Supprimer l'évènement",
@ -153,9 +145,7 @@
"Either the participation has already been validated, either the validation token is incorrect.": "Soit la participation a déjà été validée, soit le jeton de validation est incorrect.",
"Email": "Email",
"Ends on…": "Se termine le…",
"Enjoy discovering Mobilizon!": "Amusez-vous bien en découvrant Mobilizon !",
"Enter the link URL": "Entrez l'URL du lien",
"Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Entrez vos propres conditions d'utilisations. Les balises HTML sont autorisées. Les conditions d'utilisation par défaut de Mobilizon.org sont fournies comme modèle.",
"Error while changing email": "Erreur lors de la modification de l'adresse email",
"Error while communicating with the server.": "Erreur de communication avec le serveur.",
"Error while saving report.": "Erreur lors de l'enregistrement du signalement.",
@ -222,11 +212,9 @@
"If an account with this email exists, we just sent another confirmation email to {email}": "Si un compte avec un tel email existe, nous venons juste d'envoyer un nouvel email de confirmation à {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si cette identité est la seule administratrice de certains groupes, vous devez les supprimer avant de pouvoir supprimer cette identité.",
"If you want, you may send a message to the event organizer here.": "Si vous le désirez, vous pouvez laisser un message pour l'organisateur⋅ice de l'événement ci-dessous.",
"Important event updates": "Mises à jour importantes des événements",
"Impossible to login, your email or password seems incorrect.": "Impossible de se connecter, votre email ou bien votre mot de passe semble incorrect.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "D'ici là, veuillez considérer que le logiciel n'est pas (encore) fini. Plus d'informations {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Installer Mobilizon permettra à des collectifs de sémanciper des outils des géants du web en créant <b>leur propre plateforme dévènements</b>.",
"Instance Description": "Description de l'instance",
"Instance Name": "Nom de l'instance",
"Instance Terms": "Conditions générales de l'instance",
"Instance Terms Source": "Source des conditions d'utilisation de l'instance",
@ -246,7 +234,6 @@
"Leaving event \"{title}\"": "Annuler ma participation à l'évènement",
"Let's create a new common": "Créons un nouveau Common",
"License": "Licence",
"Like title update, start or end date change, event being confirmed or cancelled.": "Comme le changement du titre de l'événement, de sa date de début ou de fin, ou bien qu'il soit confirmé ou bien annulé.",
"Limited number of places": "Nombre de places limité",
"List title": "Titre de la liste",
"Load more": "Voir plus",
@ -263,7 +250,6 @@
"Message": "Message",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon est un réseau fédéré. Vous pouvez interagir avec cet événement depuis un serveur différent.",
"Mobilizon is a free/libre software that will allow communities to create <b>their own spaces</b> to publish events in order to better emancipate themselves from tech giants.": "Mobilizon est un logiciel libre qui permettra à des communautés de <b>créer leurs propres espaces</b> de publication dévènements, afin de mieux sémanciper des géants du web.",
"Mobilizon is under development, we will add new features to this site during regular updates, until the release of <b>version 1 of the software in the first half of 2020</b>.": "Mobilizon est en cours de développement, nous ajouterons de nouvelles fonctionnalités à ce site lors de mises à jour régulières, jusqu'à la publication de <b>la version 1 du logiciel au premier semestre 2020</b>.",
"Mobilizons licence": "La licence de Mobilizon",
"Moderated comments (shown after approval)": "Commentaires modérés (affichés après validation)",
"Moderation": "Modération",
@ -282,7 +268,7 @@
"New password": "Nouveau mot de passe",
"New profile": "Nouveau profil",
"Next page": "Page suivante",
"No actors found": "Aucun acteur trouvé",
"No profiles found": "Aucun profil trouvé",
"No address defined": "Aucune adresse définie",
"No closed reports yet": "Aucun signalement fermé pour le moment",
"No comment": "Pas de commentaire",
@ -297,12 +283,10 @@
"No instance to remove|Remove instance|Remove {number} instances": "Pas d'instances à supprimer|Supprimer une instance|Supprimer {number} instances",
"No message": "Pas de message",
"No moderation logs yet": "Pas encore de journaux de modération",
"No notification settings yet": "Pas encore de paramètres de notification",
"No one is going to this event": "Personne n'a va encore|Une personne y va|{going} personnes y vont",
"No open reports yet": "Aucun signalement ouvert pour le moment",
"No participant to approve|Approve participant|Approve {number} participants": "Aucun⋅e participant⋅e à valider|Valider le ou la participant⋅e|Valider {number} participant⋅es",
"No participant to reject|Reject participant|Reject {number} participants": "Aucun⋅e participant⋅e à refuser|Refuser le ou la participant⋅e|Refuser {number} participant⋅es",
"No preferences yet": "Pas encore de préférences",
"No public upcoming events": "Aucun événement public à venir",
"No resolved reports yet": "Aucun signalement résolu pour le moment",
"No resources selected": "Aucune ressource sélectionnée|Une ressource sélectionnée|{count} ressources sélectionnées",
@ -319,7 +303,6 @@
"On {date} ending at {endTime}": "Le {date}, se terminant à {endTime}",
"On {date} from {startTime} to {endTime}": "Le {date} de {startTime} à {endTime}",
"On {date} starting at {startTime}": "Le {date} à partir de {startTime}",
"One person is going": "Personne n'y va | Une personne y va | {approved} personnes y vont",
"Ongoing tasks": "Tâches en cours",
"Only accessible through link (private)": "Uniquement accessible par lien (privé)",
"Only alphanumeric characters and underscores are supported.": "Seuls les caractères alphanumériques et les tirets bas sont acceptés.",
@ -347,7 +330,6 @@
"Participation requested!": "Participation demandée !",
"Password": "Mot de passe",
"Password (confirmation)": "Mot de passe (confirmation)",
"Password change": "Changement de mot de passe",
"Password reset": "Réinitialisation du mot de passe",
"Past events": "Événements passés",
"Pending": "En attente",
@ -357,9 +339,7 @@
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Veuillez contacter l'administrateur⋅ice de cette instance Mobilizon si vous pensez quil sagit dune erreur.",
"Please enter your password to confirm this action.": "Merci d'entrer votre mot de passe pour confirmer cette action.",
"Please make sure the address is correct and that the page hasn't been moved.": "Assurezvous que ladresse est correcte et que la page na pas été déplacée.",
"Please read the full rules": "Merci de lire les règles complètes",
"Please refresh the page and retry.": "Merci de rafraîchir la page puis réessayer.",
"Please type at least 5 characters": "Merci d'entrer au moins 5 caractères",
"Post a comment": "Ajouter un commentaire",
"Post a public message": "Poster un message public",
"Post a reply": "Envoyer une réponse",
@ -393,7 +373,6 @@
"Registrations are restricted by whitelisting.": "Les inscriptions sont restreintes par liste blanche.",
"Reject": "Rejeter",
"Rejected": "Rejetés",
"Rejected participations": "Participations rejetées",
"Rename": "Renommer",
"Rename resource": "Renommer la resource",
"Reopen": "Réouvrir",
@ -407,7 +386,6 @@
"Reported by {reporter}": "Signalé par {reporter}",
"Reported identity": "Identité signalée",
"Reports": "Signalements",
"Requests": "Requêtes",
"Resend confirmation email": "Envoyer à nouveau l'email de confirmation",
"Reset my password": "Réinitialiser mon mot de passe",
"Resolved": "Résolu",
@ -422,8 +400,6 @@
"Searching…": "Recherche en cours…",
"Select a timezone": "Selectionnez un fuseau horaire",
"Send email": "Envoyer un email",
"Send me an email to reset my password": "Envoyez-moi un email pour réinitialiser mon mot de passe",
"Send me the confirmation email once again": "Envoyez-moi l'email de confirmation encore une fois",
"Send the report": "Envoyer le signalement",
"Set an URL to a page with your own terms.": "Entrez une URL vers une page web avec vos propres conditions d'utilisation.",
"Settings": "Paramètres",
@ -482,7 +458,7 @@
"Title": "Titre",
"To achieve your registration, please create a first identity profile.": "Pour finir votre inscription, veuillez créer un premier profil.",
"To change the world, change the software": "Changer de logiciel pour changer le monde",
"To confirm, type your event title \"{eventTitle}\"": "Pour confirmer, entrez le titre de l'évènement « {eventTitle} »",
"To confirm, type your event title \"{eventTitle}\"": "Pour confirmer, entrez le titre de l'évènement « {eventTitle} »",
"To confirm, type your identity username \"{preferredUsername}\"": "Pour confirmer, entrez le nom de lidentité « {preferredUsername} »",
"Transfer to {outsideDomain}": "Transférer à {outsideDomain}",
"Type": "Type",
@ -511,7 +487,6 @@
"View page on {hostname} (in a new window)": "Voir la page sur {hostname} (dans une nouvelle fenêtre)",
"Visible everywhere on the web (public)": "Visible partout sur le web (public)",
"Waiting for organization team approval.": "En attente d'approbation par l'organisation.",
"Waiting list": "Liste d'attente",
"Warning": "Attention",
"We just sent an email to {email}": "Nous venons d'envoyer un email à {email}",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Nous voulons développer un <b>commun numérique</b>, que tout le monde pourra sapproprier, conçu dans <b>le respect de la vie privée et de laction militante</b>.",
@ -523,14 +498,11 @@
"Website / URL": "Site web / URL",
"Welcome back {username}!": "Bon retour {username} !",
"Welcome back!": "Bon retour !",
"Welcome on your administration panel": "Bienvenue sur votre espace d'administration",
"Welcome to Mobilizon, {username}!": "Bienvenue sur Mobilizon, {username} !",
"Who can view this event and participate": "Qui peut voir cet évènement et y participer",
"World map": "Carte mondiale",
"Write something…": "Écrivez quelque chose…",
"You and one other person are going to this event": "Vous êtes le ou la seul⋅e à vous rendre à cet évènement | Vous et une autre personne vous rendez à cet évènement | Vous et {approved} autres personnes vous rendez à cet évènement.",
"You are already a participant of this event.": "Vous participez déjà à cet évènement.",
"You are already logged-in.": "Vous êtes déjà connecté.",
"You are participating in this event anonymously": "Vous participez à cet événement anonymement",
"You are participating in this event anonymously but didn't confirm participation": "Vous participez à cet événement anonymement mais vous n'avez pas confirmé votre participation",
"You can add tags by hitting the Enter key or by adding a comma": "Vous pouvez ajouter des tags en appuyant sur la touche Entrée ou bien en ajoutant une virgule",
@ -561,8 +533,6 @@
"Your email is not whitelisted, you can't register.": "Votre email n'est pas sur la liste blanche, vous ne pouvez pas vous inscrire.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Votre email sera uniquement utilisé pour confirmer que vous êtes bien une personne réelle et vous envoyer des éventuelles mises à jour pour cet événement. Il ne sera PAS transmis à d'autres instances ou à l'organisateur de l'événement.",
"Your federated identity": "Votre identité fédérée",
"Your federated identity profile@instance": "Votre identité fédérée profil@instance",
"Your local administrator resumed its policy:": "Votre administrateur⋅ice local a résumé sa politique ainsi :",
"Your participation has been confirmed": "Votre participation a été confirmée",
"Your participation has been rejected": "Votre participation a été rejettée",
"Your participation has been requested": "Votre participation a été demandée",
@ -633,7 +603,6 @@
"Local": "Local·e",
"User": "Utilisateur·ice",
"{profile} (by default)": "{profile} (par défault)",
"Locale": "Locale",
"Confirmed": "Confirmé·e",
"Confirmed at": "Confirmé·e à",
"Language": "Langue",
@ -679,5 +648,51 @@
"Forgot your password?": "Mot de passe oublié ?",
"Enter your email address below, and we'll email you instructions on how to change your password.": "Indiquez votre adresse e-mail ci-dessous. Nous vous enverrons des instructions concernant la modification de votre mot de passe.",
"Submit": "Valider",
"Email address": "Adresse email"
"Email address": "Adresse email",
"Legal": "Légal",
"Terms of service": "Conditions d'utilisation",
"Privacy policy": "Politique de confidentialité",
"Instance rules": "Règles de l'instance",
"Glossary": "Glossaire",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Certains termes, techniques ou non, utilisés dans le texte ci-dessous peuvent recouvrir des concepts difficiles à appréhender. Nous proposons ici un glossaire qui pourra vous aider à mieux les comprendre :",
"Instance": "Instance",
"Mobilizon software": "logiciel Mobilizon",
"Instance administrator": "Administrateur·ice de l'instance",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "L'administrateur·ice de l'instance est la personne ou entité qui gère cette instance Mobilizon.",
"Application": "Application",
"In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.": "Dans le contexte suivant, une application est un logiciel, fourni par l'équipe Mobilizon ou bien une tierce partie, utilisé pour interagir avec votre instance.",
"API": "API",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "Une « interface de programmation d'application » ou « API » est un protocole de communication qui permet à des composants logiciels de communiquer entre eux. L'API de Mobilizon, par exemple, peut permettre à des outils logiciels tiers de communiquer avec des instances de Mobilizon pour effectuer certaines actions, comme la publication d'événements en votre nom, automatiquement et à distance.",
"SSL/TLS": "SSL/TLS",
"Cookies and Local storage": "Cookies et stockage local",
"A cookie is a small file containing informations that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows to store more data.": "Un cookie est un petit fichier contenant des informations qui est envoyé à votre ordinateur lorsque vous visitez un site web. Lorsque vous visitez le site à nouveau, le cookie permet à ce site de reconnaître votre navigateur. Les cookies peuvent stocker les préférences des utilisateur·ices et d'autres informations. Vous pouvez configurer votre navigateur pour qu'il refuse tous les cookies. Toutefois, cela peut entraîner le non-fonctionnement de certaines fonctions ou de certains services du site web. Le stockage local fonctionne de la même manière mais permet de stocker davantage de données.",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Une instance est une version du logiciel Mobilizon fonctionnant sur un serveur. Une instance peut être gérée par n'importe qui avec le {mobilizon_software} ou d'autres applications fédérées, correspondant au « fediverse ». Cette instance se nomme {instance_name}. Mobilizon est un réseau fédéré de multiples instances (tout comme des serveurs email), des utilisateur·ices inscrites sur différentes instances peuvent communiquer bien qu'iels ne se soient pas enregistré·es sur la même instance.",
"SSL and it's successor TLS are encryption technologies to secure data communications when using the service. You can recognize an encrypted connection in your browser's address line when the URL begins with {https} and the lock icon is displayed in your browser's address bar.": "SSL et son successeur TLS sont des technologies de chiffrement qui permettent de sécuriser les communications de données lors de l'utilisation du service. Vous pouvez reconnaître une connexion chiffrée dans la barre d'adresse de votre navigateur lorsque l'URL commence par {https} et que l'icône du cadenas est affichée dans la barre d'adresse de votre navigateur.",
"Home to {number} users": "Abrite {number} utilisateur·ices",
"Who published {number} events": "Ayant publié {number} événements",
"And {number} comments": "Et {number} commentaires",
"Instance configuration": "Configuration de l'instance",
"Mobilizon version": "Version de Mobilizon",
"Registrations": "Inscriptions",
"Restricted": "Restreintes",
"Enabled": "Activé",
"If allowed by organizer": "Si autorisé par l'organisateur·ice",
"Default Mobilizon terms": "Conditions d'utilisation par défaut de Mobilizon",
"Instance Privacy Policy Source": "Source de la politique de confidentialité de l'instance",
"Default Mobilizon privacy policy": "Politique de confidentialité par défaut de Mobilizon",
"default Mobilizon privacy policy": "politique de confidentialité par défaut de Mobilizon",
"Set an URL to a page with your own privacy policy.": "Entrez une URL vers une page web avec votre propre politique de confidentialité.",
"Instance Privacy Policy URL": "URL de la politique de confidentialité de l'instance",
"Instance Privacy Policy": "Politique de confidentialité de l'instance",
"Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Entrez vos propres conditions d'utilisation. Les balises HTML sont autorisées. Les {mobilizon_terms} sont fournies comme modèle.",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Entrez votre propre politique de confidentialité. Les balises HTML sont autorisées. La {mobilizon_privacy_policy} est fournie comme modèle.",
"The {default_privacy_policy} will be used. They will be translated in the user's language.": "La {default_privacy_policy} sera utilisée. Elle sera traduite dans la langue de l'utilisateur·ice",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "REMARQUE : les conditions par défaut n'ont pas été vérifiées par un juriste et ne sont donc susceptibles de ne pas offrir une protection juridique complète dans toutes les situations pour un·e administrateur·ice d'instance qui les utilise. Elles ne sont pas non plus spécifiques à tous les pays et juridictions. Si vous n'êtes pas sûr, veuillez consulter un juriste.",
"Instance Short Description": "Description courte de l'instance",
"Instance Long Description": "Description longue de l'instance",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Affichée sur la page d'accueil et dans les balises meta. Décrivez ce qu'est Mobilizon et ce qui rend spécifique cette instance en un seul paragraphe.",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Une section pour expliquer qui vous êtes et les aspects qui caractérisent votre instance. Vous pouvez utiliser des balises HTML.",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Une section appropriée pour votre code de conduite, règles ou lignes directrices. Vous pouvez utiliser des balises HTML.",
"contact uninformed": "contact non renseigné",
"Can be an email or a link, or just plain text.": "Peut être une adresse email ou bien un lien, ou alors du simple texte brut."
}

View File

@ -66,18 +66,45 @@ const router = new Router({
name: RouteName.ABOUT,
component: () => import(/* webpackChunkName: "about" */ "@/views/About.vue"),
meta: { requiredAuth: false },
},
{
path: "/terms",
name: RouteName.TERMS,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/Terms.vue"),
meta: { requiredAuth: false },
},
{
path: "/rules",
name: RouteName.RULES,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/Rules.vue"),
meta: { requiredAuth: false },
redirect: { name: RouteName.ABOUT_INSTANCE },
children: [
{
path: "mobilizon",
name: RouteName.ABOUT_MOBILIZON,
component: () =>
import(/* webpackChunkName: "about" */ "@/views/About/AboutMobilizon.vue"),
},
{
path: "instance",
name: RouteName.ABOUT_INSTANCE,
component: () =>
import(/* webpackChunkName: "about" */ "@/views/About/AboutInstance.vue"),
},
{
path: "/terms",
name: RouteName.TERMS,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/About/Terms.vue"),
meta: { requiredAuth: false },
},
{
path: "/privacy",
name: RouteName.PRIVACY,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/About/Privacy.vue"),
meta: { requiredAuth: false },
},
{
path: "/rules",
name: RouteName.RULES,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/About/Rules.vue"),
meta: { requiredAuth: false },
},
{
path: "/glossary",
name: RouteName.GLOSSARY,
component: () => import(/* webpackChunkName: "cookies" */ "@/views/About/Glossary.vue"),
meta: { requiredAuth: false },
},
],
},
{
path: "/interact",

View File

@ -9,9 +9,13 @@ import { UserRouteName } from "./user";
enum GlobalRouteName {
HOME = "Home",
ABOUT = "About",
ABOUT_MOBILIZON = "ABOUT_MOBILIZON",
ABOUT_INSTANCE = "ABOUT_INSTANCE",
PAGE_NOT_FOUND = "PageNotFound",
SEARCH = "Search",
TERMS = "TERMS",
PRIVACY = "PRIVACY",
GLOSSARY = "GLOSSARY",
INTERACT = "INTERACT",
RULES = "RULES",
}

View File

@ -14,12 +14,23 @@ export enum InstanceTermsType {
CUSTOM = "CUSTOM",
}
export enum InstancePrivacyType {
DEFAULT = "DEFAULT",
URL = "URL",
CUSTOM = "CUSTOM",
}
export interface IAdminSettings {
instanceName: string;
instanceDescription: string;
instanceLongDescription: string;
contact: string;
instanceTerms: string;
instanceTermsType: InstanceTermsType;
instanceTermsUrl: string | null;
instancePrivacyPolicy: string;
instancePrivacyPolicyType: InstanceTermsType;
instancePrivacyPolicyUrl: string | null;
instanceRules: string;
registrationsOpen: boolean;
}

View File

@ -1,9 +1,11 @@
import { InstanceTermsType } from "./admin.model";
import { InstanceTermsType, InstancePrivacyType } from "./admin.model";
import { IProvider } from "./resource";
export interface IConfig {
name: string;
description: string;
longDescription: string;
contact: string;
registrationsOpen: boolean;
registrationsWhitelist: boolean;
@ -59,10 +61,17 @@ export interface IConfig {
type: InstanceTermsType;
url: string;
};
privacy: {
bodyHtml: string;
type: InstancePrivacyType;
url: string;
};
rules: string;
resourceProviders: IProvider[];
timezones: string[];
features: {
groups: boolean;
};
federating: boolean;
version: string;
}

View File

@ -0,0 +1,5 @@
export interface IStatistics {
numberOfUsers: number;
numberOfEvents: number;
numberOfComments: number;
}

View File

@ -1,17 +1,15 @@
<template>
<div>
<div class="hero intro is-medium is-primary">
<div class="hero intro is-small is-primary">
<div class="hero-body">
<div class="container">
<h1 class="title">{{ $t("About Mobilizon") }}</h1>
<p class="subtitle">
<span>
{{
$t(
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising."
)
}}
</span>
<p>
{{
$t(
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising."
)
}}
</p>
<b-button
icon-left="open-in-new"
@ -24,165 +22,56 @@
</div>
</div>
</div>
<div class="container">
<section>
<div class="columns">
<div class="column has-text-left-desktop">
<h2 class="title">{{ $t("Gather ⋅ Organize ⋅ Mobilize") }}</h2>
<p
class="content"
v-html="
$t(
'From a birthday party with friends and family to a march for climate change, right now, our gatherings are <b>trapped inside the tech giants platforms</b>. How can we organize, how can we click “Attend,” without <b>providing private data</b> to Facebook or <b>locking ourselves up</b> inside MeetUp?'
)
"
/>
<p
v-html="
$t(
'Mobilizon is a free/libre software that will allow communities to create <b>their own spaces</b> to publish events in order to better emancipate themselves from tech giants.'
)
"
/>
</div>
<div class="column has-text-right-desktop has-text-centered-mobile">
<img
src="img/about/action-mobilizon.png"
width="300"
:alt="$t('Organize and take action, freely')"
/>
</div>
</div>
</section>
<section>
<div class="columns">
<div class="column has-text-right-desktop">
<h2 class="title">{{ $t("Let's create a new common") }}</h2>
<p
v-html="
$t(
'We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.'
)
"
/>
<p>
<span
v-html="
$t(
'Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.'
)
"
/>
<i18n
tag="span"
path="This installation (called “instance“) can easily {interconnect}, thanks to {protocol}."
>
<b slot="interconnect">{{ $t("interconnect with others like it") }}</b>
<a slot="protocol" href="https://en.wikipedia.org/wiki/ActivityPub">{{
$t("a decentralised federation protocol")
}}</a>
</i18n>
<main class="container">
<div class="columns">
<div class="column is-one-quarter-desktop">
<aside class="menu">
<p class="menu-label">
{{ $t("About") }}
</p>
</div>
<div class="column has-text-left-desktop has-text-centered-mobile">
<img
src="img/about/common-mobilizon.png"
width="300"
:alt="$t('Let\'s create a new common')"
/>
</div>
<ul class="menu-list">
<li>
<router-link :to="{ name: RouteName.ABOUT_INSTANCE }">{{
$t("About this instance")
}}</router-link>
</li>
<li>
<router-link :to="{ name: RouteName.ABOUT_MOBILIZON }">{{
$t("About Mobilizon")
}}</router-link>
</li>
</ul>
<p class="menu-label">
{{ $t("Legal") }}
</p>
<ul class="menu-list">
<li>
<router-link :to="{ name: RouteName.TERMS }">{{
$t("Terms of service")
}}</router-link>
</li>
<li>
<router-link :to="{ name: RouteName.PRIVACY }">{{
$t("Privacy policy")
}}</router-link>
</li>
<li>
<router-link :to="{ name: RouteName.RULES }">{{
$t("Instance rules")
}}</router-link>
</li>
<li>
<router-link :to="{ name: RouteName.GLOSSARY }">{{ $t("Glossary") }}</router-link>
</li>
</ul>
</aside>
</div>
</section>
</div>
<div class="hero quote is-secondary">
<div class="hero-body">
<div class="container">
<h2 class="title">{{ $t("To change the world, change the software") }}</h2>
<blockquote>
{{
$t(
"We wont change the world from Facebook. The tool we dream of, surveillance capitalism corporations wont develop it, as they couldnt profit from it. This is an opportunity to build something better, by taking another approach."
)
}}
</blockquote>
<footer class="blockquote-footer">
<a
href="https://framablog.org/2019/05/14/mobilizon-lets-finance-a-software-to-free-our-events-from-facebook/"
>{{ $t("Read Framasofts statement of intent on the Framablog") }}</a
>
</footer>
<div class="column router">
<router-view />
</div>
</div>
</div>
<div class="container">
<section>
<div class="columns">
<div class="column">
<h2 class="title">{{ $t("Software to the people") }}</h2>
<i18n
tag="p"
path="{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency."
>
<a slot="license" href="https://choosealicense.com/licenses/agpl-3.0/">{{
$t("Mobilizons licence")
}}</a>
<b slot="respect">{{ $t("respect of the fundamental freedoms") }}</b>
<a slot="source" href="https://framagit.org/framasoft/mobilizon">{{
$t("its source code is public")
}}</a>
</i18n>
<p>
{{
$t(
"If the direction given by the development team does not suit you, you have the legal right to create your own version of the software, with your own governance choices."
)
}}
</p>
<i18n
tag="p"
path="Mobilizon is not developed by a secretive start-up, but by a group of friends who strive to {change_world}. So while we do work slower, we remain attentive and in touch with our users."
>
<a slot="change_world" href="https://framasoft.org">{{
$t("change the world, one byte at a time")
}}</a>
</i18n>
</div>
<div class="column has-text-right-desktop has-text-centered-mobile">
<img
src="img/about/software-to-the-people-mobilizon.png"
width="300"
:alt="('Software to the people')"
/>
</div>
</div>
</section>
<section>
<div class="columns">
<div class="column has-text-right-desktop">
<h2 class="title">{{ $t("Concieved with care for humans") }}</h2>
<i18n
tag="p"
path="We asked professional designers to help us develop our vision for Mobilizon. We took time to study the {digital_habits} in order to understand the features they need to gather, organize, and mobilize."
>
<b slot="digital_habits">{{ $t("digital habits of activists") }}</b>
</i18n>
<i18n
tag="p"
path="So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it."
>
<b slot="fit_needs_uses_people">{{ $t("fit the needs and uses of the people") }}</b>
</i18n>
</div>
<div class="column has-text-left-desktop has-text-centered-mobile">
<img
src="img/about/concieved-mobilizon.png"
width="300"
:alt="$t('Concieved with care for humans')"
/>
</div>
</div>
</section>
</div>
</main>
<!-- We hide the "Find an instance button until https://joinmobilizon.org gets a instance picker -->
<div class="hero register is-primary is-medium" v-if="config && config.registrationsOpen">
<div class="hero-body">
@ -234,13 +123,13 @@ export default class About extends Vue {
.hero.is-primary {
background: $background-color;
.subtitle {
padding: 1rem;
display: block;
span {
color: lighten($background-color, 10%);
}
.title {
margin: 30px auto 1rem auto;
}
p {
margin-bottom: 1rem;
}
}
@ -248,49 +137,17 @@ export default class About extends Vue {
background: lighten($background-color, 20%);
}
section {
padding: 3rem 0;
&:not(:last-child) {
border-bottom: 0.1rem dotted #777;
}
p {
margin-top: 1.5rem;
}
&:nth-child(odd) .columns {
flex-direction: row-reverse;
}
aside.menu {
position: sticky;
top: 2rem;
margin-top: 2rem;
}
.hero.quote {
background: lighten($secondary, 20%);
h2 {
background: initial;
}
.router.column {
background: $white;
}
blockquote {
border-left: 0.2em solid #333;
display: block;
padding-left: 1em;
&:before {
content: "« ";
}
&:after {
content: " »";
}
}
.blockquote-footer a {
color: #6c757d;
background: initial;
&:before {
content: "\2014\00A0";
}
}
ul.menu-list > li > a {
text-decoration: none;
}
</style>

View File

@ -0,0 +1,163 @@
<template>
<div v-if="config">
<section class="hero is-primary">
<div class="hero-body">
<div class="container">
<h2 class="title">{{ config.name }}</h2>
<p>{{ config.description }}</p>
</div>
</div>
</section>
<section class="columns contact-statistics" v-if="statistics">
<div class="column is-three-quarters-desktop statistics">
<i18n tag="p" path="Home to {number} users">
<strong slot="number">{{ statistics.numberOfUsers }}</strong>
</i18n>
<i18n tag="p" path="Who published {number} events">
<strong slot="number">{{ statistics.numberOfEvents }}</strong>
</i18n>
<i18n tag="p" path="And {number} comments">
<strong slot="number">{{ statistics.numberOfComments }}</strong>
</i18n>
</div>
<div class="column contact">
<h4>{{ $t("Contact") }}</h4>
<p>
<a :title="config.contact" v-if="generateConfigLink()" :href="generateConfigLink().uri">{{
generateConfigLink().text
}}</a>
<span v-else-if="config.contact">{{ config.contact }}</span>
<span v-else>{{ $t("contact uninformed") }}</span>
</p>
</div>
</section>
<hr />
<section class="long-description">
<div v-html="config.longDescription" />
</section>
<hr />
<section class="config">
<h3 class="subtitle">{{ $t("Instance configuration") }}</h3>
<table class="table is-fullwidth">
<tr>
<td>{{ $t("Mobilizon version") }}</td>
<td>{{ config.version }}</td>
</tr>
<tr>
<td>{{ $t("Registrations") }}</td>
<td v-if="config.registrationsOpen && config.registrationsWhitelist">
{{ $t("Restricted") }}
</td>
<td v-if="config.registrationsOpen && !config.registrationsWhitelist">
{{ $t("Open") }}
</td>
<td v-else>{{ $t("Closed") }}</td>
</tr>
<tr>
<td>{{ $t("Federation") }}</td>
<td v-if="config.federating">{{ $t("Enabled") }}</td>
<td v-else>{{ $t("Disabled") }}</td>
</tr>
<tr>
<td>{{ $t("Anonymous participations") }}</td>
<td v-if="config.anonymous.participation.allowed">{{ $t("If allowed by organizer") }}</td>
<td v-else>{{ $t("Disabled") }}</td>
</tr>
</table>
</section>
</div>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import { ABOUT } from "../../graphql/config";
import { STATISTICS } from "../../graphql/statistics";
import { IConfig } from "../../types/config.model";
import { IStatistics } from "../../types/statistics.model";
@Component({
apollo: {
config: ABOUT,
statistics: STATISTICS,
},
})
export default class AboutInstance extends Vue {
config!: IConfig;
statistics!: IStatistics;
get isContactEmail(): boolean {
return this.config && this.config.contact.includes("@");
}
get isContactURL(): boolean {
return this.config && this.config.contact.match(/^https?:\/\//g) !== null;
}
generateConfigLink(): { uri: string; text: string } | null {
if (!this.config.contact) return null;
if (this.isContactEmail) {
return { uri: `mailto:${this.config.contact}`, text: this.config.contact };
} else if (this.isContactURL) {
return {
uri: this.config.contact,
text: this.urlToHostname(this.config.contact) || (this.$t("Contact") as string),
};
}
return null;
}
urlToHostname(url: string): string | null {
try {
return new URL(url).hostname;
} catch (e) {
return null;
}
}
}
</script>
<style lang="scss" scoped>
@import "../../variables.scss";
section {
&:not(:first-child) {
margin: 2rem auto;
}
&.hero {
h2.title {
margin: auto;
}
}
&.contact-statistics {
margin: 2px auto;
.statistics {
display: flex;
p {
text-align: right;
flex: 1;
padding: 0 15px;
& > * {
display: block;
}
strong {
font-weight: 500;
font-size: 32px;
line-height: 48px;
}
}
}
.contact {
p {
width: 200px;
white-space: nowrap;
overflow: hidden;