Improve texts

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
master
Thomas Citharel 2 years ago
parent d5564570ee
commit 5f0497144a
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
  1. 2
      js/.eslintrc.js
  2. 2
      js/package.json
  3. 36
      js/src/App.vue
  4. 40
      js/src/common.scss
  5. 5
      js/src/components/Discussion/DiscussionComment.vue
  6. 1
      js/src/components/Event/AddressAutoComplete.vue
  7. 7
      js/src/components/Event/EventListCard.vue
  8. 11
      js/src/components/Event/EventListViewCard.vue
  9. 1
      js/src/components/Event/FullAddressAutoComplete.vue
  10. 89
      js/src/components/Group/GroupSection.vue
  11. 2
      js/src/components/NavBar.vue
  12. 5
      js/src/components/Participation/UnloggedParticipation.vue
  13. 2
      js/src/components/SearchField.vue
  14. 40
      js/src/i18n/en_US.json
  15. 36
      js/src/i18n/fr_FR.json
  16. 9
      js/src/router/groups.ts
  17. 3
      js/src/types/actor/actor.model.ts
  18. 1
      js/src/types/actor/group.model.ts
  19. 4
      js/src/types/discussions.ts
  20. 6
      js/src/variables.scss
  21. 20
      js/src/views/About/AboutMobilizon.vue
  22. 2
      js/src/views/About/Glossary.vue
  23. 3
      js/src/views/Account/IdentityPicker.vue
  24. 34
      js/src/views/Account/IdentityPickerWrapper.vue
  25. 10
      js/src/views/Account/Profile.vue
  26. 22
      js/src/views/Account/Register.vue
  27. 2
      js/src/views/Admin/AdminGroupProfile.vue
  28. 2
      js/src/views/Admin/GroupProfiles.vue
  29. 2
      js/src/views/Discussions/Discussion.vue
  30. 19
      js/src/views/Discussions/DiscussionsList.vue
  31. 2
      js/src/views/Event/Edit.vue
  32. 79
      js/src/views/Event/GroupEvents.vue
  33. 4
      js/src/views/Group/Create.vue
  34. 263
      js/src/views/Group/Group.vue
  35. 2
      js/src/views/Group/GroupList.vue
  36. 2
      js/src/views/Group/GroupSettings.vue
  37. 10
      js/src/views/Group/MyGroups.vue
  38. 2
      js/src/views/Posts/Edit.vue
  39. 94
      js/src/views/Posts/List.vue
  40. 2
      js/src/views/Posts/Post.vue
  41. 75
      js/src/views/Resources/ResourceFolder.vue
  42. 26
      js/src/views/Search.vue
  43. 22
      js/src/views/Todos/TodoLists.vue
  44. 13
      js/src/views/User/Register.vue
  45. 16
      js/vue.config.js
  46. 96
      js/yarn.lock
  47. 16
      lib/web/templates/api/privacy.html.eex
  48. 22
      lib/web/templates/api/terms.html.eex
  49. 222
      priv/gettext/ar/LC_MESSAGES/default.po
  50. 222
      priv/gettext/be/LC_MESSAGES/default.po
  51. 222
      priv/gettext/ca/LC_MESSAGES/default.po
  52. 222
      priv/gettext/cs/LC_MESSAGES/default.po
  53. 222
      priv/gettext/de/LC_MESSAGES/default.po
  54. 218
      priv/gettext/default.pot
  55. 222
      priv/gettext/en/LC_MESSAGES/default.po
  56. 755
      priv/gettext/es/LC_MESSAGES/default.po
  57. 362
      priv/gettext/fi/LC_MESSAGES/default.po
  58. 566
      priv/gettext/fr/LC_MESSAGES/default.po
  59. 222
      priv/gettext/it/LC_MESSAGES/default.po
  60. 222
      priv/gettext/ja/LC_MESSAGES/default.po
  61. 222
      priv/gettext/nl/LC_MESSAGES/default.po
  62. 226
      priv/gettext/oc/LC_MESSAGES/default.po
  63. 222
      priv/gettext/pl/LC_MESSAGES/default.po
  64. 222
      priv/gettext/pt/LC_MESSAGES/default.po
  65. 292
      priv/gettext/pt_BR/LC_MESSAGES/default.po
  66. 222
      priv/gettext/ru/LC_MESSAGES/default.po
  67. 222
      priv/gettext/sv/LC_MESSAGES/default.po

@ -46,6 +46,8 @@ module.exports = {
"@typescript-eslint/interface-name-prefix": "off",
"@typescript-eslint/no-use-before-define": "off",
"import/prefer-default-export": "off",
"import/extensions": "off",
"import/no-unresolved": "off",
},
ignorePatterns: ["src/typings/*.d.ts", "vue.config.js"],

@ -78,7 +78,7 @@
"@vue/eslint-config-airbnb": "^5.0.2",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^5.0.2",
"@vue/test-utils": "1.0.4",
"@vue/test-utils": "1.0.5",
"chai": "^4.1.2",
"eslint": "^7.7.0",
"eslint-config-prettier": "^6.11.0",

@ -107,45 +107,9 @@ export default class App extends Vue {
<style lang="scss">
@import "variables";
/* Bulma imports */
@import "~bulma/bulma";
@import "~bulma-divider";
/* Buefy imports */
@import "~buefy/src/scss/buefy";
/* Icons */
$mdi-font-path: "~@mdi/font/fonts";
@import "~@mdi/font/scss/materialdesignicons";
@import "common";
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
body {
// background: #f7f8fa;
background: $body-background-color;
font-family: BlinkMacSystemFont, Roboto, Oxygen, Ubuntu, Cantarell, "Segoe UI", "Fira Sans",
"Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
/*main {*/
/* margin: 1rem auto 0;*/
/*}*/
}
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
}
}
</style>

@ -12,7 +12,7 @@ a.out,
}
input.input {
border-color: $input-border-color !important;
// border-color: $input-border-color !important;
}
.section {
@ -44,3 +44,41 @@ $color-black: #000;
background: initial;
margin-right: 0;
}
.select select {
border-color: $borders;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
body {
// background: #f7f8fa;
background: $body-background-color;
font-family: BlinkMacSystemFont, Roboto, Oxygen, Ubuntu, Cantarell, "Segoe UI",
"Fira Sans", "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
/*main {*/
/* margin: 1rem auto 0;*/
/*}*/
}
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
}
}
.module-description {
margin-bottom: 2rem;
color: $violet-1;
}

@ -91,8 +91,9 @@ import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
export default class DiscussionComment extends Vue {
@Prop({ required: true, type: Object }) comment!: IComment;
editMode: boolean = false;
updatedComment: string = "";
editMode = false;
updatedComment = "";
currentActor!: IPerson;

@ -45,6 +45,7 @@ import { IConfig } from "../../types/config.model";
})
export default class AddressAutoComplete extends Vue {
@Prop({ required: true }) value!: IAddress;
@Prop({ required: false }) placeholder!: string;
addressData: IAddress[] = [];

@ -186,7 +186,7 @@
import { Component, Prop } from "vue-property-decorator";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import { mixins } from "vue-class-component";
import { RawLocation } from "vue-router";
import { RawLocation, Route } from "vue-router";
import {
IParticipant,
ParticipantRole,
@ -246,12 +246,13 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
/**
* Delete the event
*/
async openDeleteEventModalWrapper() {
async openDeleteEventModalWrapper(): Promise<void> {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
await this.openDeleteEventModal(this.participation.event, this.currentActor);
}
async gotToWithCheck(participation: IParticipant, route: RawLocation) {
async gotToWithCheck(participation: IParticipant, route: RawLocation): Promise<Route> {
if (participation.actor.id !== this.currentActor.id && participation.event.organizerActor) {
const organizer = participation.event.organizerActor as IPerson;
await changeIdentity(this.$apollo.provider.defaultClient, organizer);

@ -50,12 +50,7 @@
</template>
<script lang="ts">
import {
IParticipant,
ParticipantRole,
EventVisibility,
IEventCardOptions,
} from "@/types/event.model";
import { ParticipantRole, EventVisibility, IEventCardOptions, IEvent } from "@/types/event.model";
import { Component, Prop } from "vue-property-decorator";
import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
import { IPerson } from "@/types/actor";
@ -63,8 +58,6 @@ import { mixins } from "vue-class-component";
import ActorMixin from "@/mixins/actor";
import { CURRENT_ACTOR_CLIENT } from "@/graphql/actor";
import EventMixin from "@/mixins/event";
import { changeIdentity } from "@/utils/auth";
import { Route } from "vue-router";
import RouteName from "../../router/name";
const defaultOptions: IEventCardOptions = {
@ -88,7 +81,7 @@ export default class EventListViewCard extends mixins(ActorMixin, EventMixin) {
/**
* The participation associated
*/
@Prop({ required: true }) event!: IParticipant;
@Prop({ required: true }) event!: IEvent;
/**
* Options are merged with default options

@ -118,6 +118,7 @@ import { IConfig } from "../../types/config.model";
})
export default class FullAddressAutoComplete extends Vue {
@Prop({ required: true }) value!: IAddress;
@Prop({ required: false, default: "" }) label!: string;
addressData: IAddress[] = [];

@ -1,50 +1,91 @@
<template>
<section>
<h2 :class="{ privateSection }">
<b-icon :icon="icon" />
<span>{{ title }}</span>
</h2>
<slot></slot>
<div class="group-section-title" :class="{ privateSection }">
<h2>
<b-icon :icon="icon" />
<span>{{ title }}</span>
</h2>
<router-link :to="route">{{ $t("View all") }}</router-link>
</div>
<div class="main-slot">
<slot></slot>
</div>
<div class="create-slot">
<slot name="create"></slot>
</div>
</section>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import { Route } from "vue-router";
@Component
export default class GroupSection extends Vue {
@Prop({ required: true, type: String }) title!: string;
@Prop({ required: true, type: String }) icon!: string;
@Prop({ required: false, type: Boolean, default: true }) privateSection!: boolean;
@Prop({ required: true, type: Object }) route!: Route;
}
</script>
<style lang="scss" scoped>
@import "@/variables.scss";
h2 {
section {
display: flex;
align-items: stretch;
margin: 15px 0 30px;
/deep/ span {
background: $secondary;
display: inline;
padding: 3px 8px;
color: #3a384c;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-weight: 500;
font-size: 30px;
flex: 1;
flex-direction: column;
margin-bottom: 2rem;
border: 2px solid $violet;
.create-slot {
display: flex;
justify-content: end;
padding-bottom: 0.5rem;
padding-right: 0.5rem;
}
/deep/ span.icon {
flex: 0;
height: 100%;
.main-slot {
min-height: 5rem;
padding: 5px;
}
}
h2.privateSection /deep/ span {
color: $violet-2;
background: $purple-2;
div.group-section-title {
display: flex;
align-items: stretch;
background: $secondary;
color: #3a384c;
&.privateSection {
color: $violet-2;
background: $purple-2;
}
/deep/ & > a {
align-self: center;
margin-right: 5px;
color: $orange-3;
}
h2 {
flex: 1;
/deep/ span {
display: inline;
padding: 3px 8px;
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial, serif;
font-weight: 500;
font-size: 30px;
flex: 1;
}
/deep/ span.icon {
flex: 0;
height: 100%;
}
}
}
</style>

@ -157,7 +157,7 @@ export default class NavBar extends Vue {
RouteName = RouteName;
mobileNavbarActive: boolean = false;
mobileNavbarActive = false;
@Watch("currentActor")
async initializeListOfIdentities() {

@ -73,7 +73,6 @@
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { FETCH_EVENT } from "@/graphql/event";
import EventListCard from "@/components/Event/EventListCard.vue";
import EventListViewCard from "@/components/Event/EventListViewCard.vue";
import { EventModel, IEvent } from "@/types/event.model";
import VerticalDivider from "@/components/Utils/VerticalDivider.vue";
@ -86,7 +85,6 @@ import RouteName from "../../router/name";
components: {
VerticalDivider,
EventListViewCard,
EventListCard,
Subtitle,
},
apollo: {
@ -114,7 +112,8 @@ export default class UnloggedParticipation extends Vue {
config!: IConfig;
get host() {
// eslint-disable-next-line class-methods-use-this
get host(): string {
return window.location.hostname;
}

@ -21,7 +21,7 @@ import RouteName from "../router/name";
export default class SearchField extends Vue {
@Prop({ type: String, required: false }) placeholder!: string;
search: string = "";
search = "";
enter() {
this.$emit("navbar-search");

@ -149,7 +149,6 @@
"Followings": "Followings",
"For instance: London, Taekwondo, Architecture…": "For instance: London, Taekwondo, Architecture…",
"Forgot your password ?": "Forgot your password ?",
"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?": "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?",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "From the {startDate} at {startTime} to the {endDate} at {endTime}",
"From the {startDate} at {startTime} to the {endDate}": "From the {startDate} at {startTime} to the {endDate}",
"From the {startDate} to the {endDate}": "From the {startDate} to the {endDate}",
@ -379,7 +378,6 @@
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.",
"This email is already registered as participant for this event": "This email is already registered as participant for this event",
"This information is saved only on your computer. Click for details": "This information is saved only on your computer. Click for details",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "This instance isn't opened to registrations, but you can register on other instances.",
"This is a demonstration site to test the beta version of Mobilizon.": "This is a demonstration site to test the beta version of Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.",
@ -411,9 +409,7 @@
"Waiting for organization team approval.": "Waiting for organization team approval.",
"Warning": "Warning",
"We just sent an email to {email}": "We just sent an email to {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>.": "We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.",
"We will redirect you to your instance in order to interact with this event": "We will redirect you to your instance in order to interact with this event",
"We won’t change the world from Facebook. The tool we dream of, surveillance capitalism corporations won’t develop it, as they couldn’t profit from it. This is an opportunity to build something better, by taking another approach.": "We won’t change the world from Facebook. The tool we dream of, surveillance capitalism corporations won’t develop it, as they couldn’t profit from it. This is an opportunity to build something better, by taking another approach.",
"Website / URL": "Website / URL",
"Welcome back {username}!": "Welcome back {username}!",
"Welcome back!": "Welcome back!",
@ -472,7 +468,6 @@
"{approved} / {total} seats": "{approved} / {total} seats",
"{count} participants": "No participants yet | One participant | {count} participants",
"{count} requests waiting": "{count} requests waiting",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors",
"@{username} ({role})": "@{username} ({role})",
"@{username}": "@{username}",
@ -513,10 +508,7 @@
"Upcoming events": "Upcoming events",
"View all upcoming events": "View all upcoming events",
"Resources": "Resources",
"View all resources": "View all resources",
"Public page": "Public page",
"Post a public message": "Post a public message",
"View all todos": "View all todos",
"Discussions": "Discussions",
"No public upcoming events": "No public upcoming events",
"Latest posts": "Latest posts",
@ -575,8 +567,6 @@
"digital habits of activists": "digital habits of activists",
"Register on this instance": "Register on this instance",
"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.": "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.",
"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.": "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.",
"So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.",
"fit the needs and uses of the people": "fit the needs and uses of the people",
"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 fall of 2020</b>.": "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 fall of 2020</b>.",
"To activate more notifications, head over to the notification settings.": "To activate more notifications, head over to the notification settings.",
@ -656,7 +646,6 @@
"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",
@ -699,7 +688,6 @@
"New discussion": "New discussion",
"Create a discussion": "Create a discussion",
"Create the discussion": "Create the discussion",
"View all discussions": "View all discussions",
"Sign in with": "Sign in with",
"Your email address was automatically set based on your {provider} account.": "Your email address was automatically set based on your {provider} account.",
"You can't change your password because you are registered through {provider}.": "You can't change your password because you are registered through {provider}.",
@ -749,7 +737,6 @@
"Explore events": "Explore events",
"#{tag}": "#{tag}",
"{count} team members": "{count} team members",
"View all events": "View all events",
"No resources yet": "No resources yet",
"No posts yet": "No posts yet",
"No ongoing todos": "No ongoing todos",
@ -779,5 +766,30 @@
"Federated Group Name": "Federated Group Name",
"This is like your federated username (<code>{username}</code>) for groups. It will allow you to be found on the federation, and is guaranteed to be unique.": "This is like your federated username (<code>{username}</code>) for groups. It will allow you to be found on the federation, and is guaranteed to be unique.",
"Banner": "Banner",
"A group with this name already exists": "A group with this name already exists"
"A group with this name already exists": "A group with this name already exists",
"Create or join an group and start organizing with other people": "Create or join an group and start organizing with other people",
"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</b> inside MeetUp?": "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</b> inside MeetUp?",
"We want to develop a <b>digital common</b> that everyone can make their own, one which respects <b>privacy and activism by design</b>.": "We want to develop a <b>digital common</b> that everyone can make their own, one which respects <b>privacy and activism by design</b>.",
"We can’t change the world from within Facebook. The tool we dream of, surveillance capitalism corporations won’t develop, as they cannot profit from it. This is an opportunity to build something better, by taking another approach.": "We can’t change the world from within Facebook. The tool we dream of, surveillance capitalism corporations won’t develop, as they cannot profit from it. This is an opportunity to build something better, by taking another approach.",
"Conceived with care for humans": "Conceived with care for humans",
"This installation (called “an instance“) can easily {interconnect}, thanks to {protocol}.": "This installation (called “an instance“) can easily {interconnect}, thanks to {protocol}.",
"{license} guarantees {respect} of the people who use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} guarantees {respect} of the people who use it. Since {source}, anyone can audit it, which guarantees its transparency.",
"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 so that right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "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 so that right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Groups are spaces for coordination and preparation to better organize events and manage your community.",
"Keep the entire conversation about a specific topic together on a single page.": "Keep the entire conversation about a specific topic together on a single page.",
"Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Create to-do lists for all the tasks you need to do, assign them and set due dates.",
"A place to store links to documents or resources of any type.": "A place to store links to documents or resources of any type.",
"{group}'s events": "{group}'s events",
"When someone from the group creates an event and attributes it to the group, it will show up here.": "When someone from the group creates an event and attributes it to the group, it will show up here.",
"View all": "View all",
"The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it.": "The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it.",
"Bio": "Bio",
"+ Start a discussion": "+ Start a discussion",
"+ Add a resource": "+ Add a resource",
"+ Add a todo": "+ Add a todo",
"+ Create an event": "+ Create an event",
"+ Post a public message": "+ Post a public message",
"A cookie is a small file containing information 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 you to store more data.": "A cookie is a small file containing information 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 you to store more data.",
"A place to publish something to the whole world, your community or just your group members.": "A place to publish something to the whole world, your community or just your group members.",
"No posts found": "No posts found"
}

@ -7,7 +7,6 @@
"@{group}": "@{group}",
"@{username}": "@{username}",
"@{username} ({role})": "@{username} ({role})",
"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.",
"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.",
"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 user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Un outil convivial, émancipateur et éthique pour se rassembler, s'organiser et se mobiliser.",
@ -221,14 +220,12 @@
"Fetch more": "En récupérer plus",
"Find an address": "Trouver une adresse",
"Find an instance": "Trouver une instance",
"Followed by {count} persons": "Suivi par {count} personnes",
"Followers": "Abonnés",
"Followings": "Abonnements",
"For instance: London": "Par exemple : Lyon",
"For instance: London, Taekwondo, Architecture…": "Par exemple : Lyon, Taekwondo, Architecture…",
"Forgot your password ?": "Mot de passe oublié ?",
"Forgot your password?": "Mot de passe oublié ?",
"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?": "De l’anniversaire entre ami·e·s à une marche pour le climat, aujourd’hui, les bonnes raisons de se rassembler sont <b>captées par les géants du web</b>. Comment s’organiser, comment cliquer sur «je participe» sans <b>livrer des données intimes</b> à Facebook ou<b> s’enfermer</b> dans MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "Du {startDate} à {startTime} jusqu'au {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Du {startDate} à {startTime} au {endDate} à {endTime}",
"From the {startDate} to the {endDate}": "Du {startDate} au {endDate}",
@ -546,7 +543,6 @@
"Sign in with": "Se connecter avec",
"Sign up": "S'enregistrer",
"Since you are a new member, private content can take a few minutes to appear.": "Étant donné que vous êtes un·e nouveau·elle membre, le contenu privé peut mettre quelques minutes à arriver.",
"So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "Afin que Mobilizon corresponde, dès sa conception, {fit_needs_uses_people} des personnes qui sont vouées à l’utiliser.",
"Software to the people": "Des logiciels pour les gens",
"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 :",
"Starts on…": "Débute le…",
@ -598,7 +594,6 @@
"This event is accessible only through it's link. Be careful where you post this link.": "Cet événement est accessible uniquement à travers son lien. Faites attention où vous le diffusez.",
"This identity is not a member of any group.": "Cette identité n'est membre d'aucun groupe.",
"This information is saved only on your computer. Click for details": "Cette information est sauvegardée uniquement sur votre appareil. Cliquez pour plus de details",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Cette installation (appelée “instance“) peut facilement {interconnect}, grâce à {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Cette instance n'autorise pas les inscriptions, mais vous pouvez vous enregistrer sur d'autres instances.",
"This is a demonstration site to test the beta version of Mobilizon.": "Ceci est un site de démonstration permettant de tester la version bêta de Mobilizon.",
"This month": "Ce mois-ci",
@ -651,12 +646,9 @@
"Visible everywhere on the web (public)": "Visible partout sur le web (public)",
"Waiting for organization team approval.": "En attente d'approbation par l'organisation.",
"Warning": "Attention",
"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.": "Nous avons demandé de l’aide à des professionnel·les du design pour concevoir ce que pourrait être Mobilizon. Nous avons pris le temps d’étudier {digital_habits} afin de comprendre les fonctionnalités dont ils et elles ont besoin pour se rassembler, s’organiser, se mobiliser.",
"We just sent an email to {email}": "Nous venons d'envoyer un email à {email}",
"We use your timezone to make sure you get notifications for an event at the correct time.": "Nous utilisons votre fuseau horaire pour nous assurer que vous recevez les notifications pour un événement au bon moment.",
"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 s’approprier, conçu dans <b>le respect de la vie privée et de l’action militante</b>.",
"We will redirect you to your instance in order to interact with this event": "Nous vous redirigerons vers votre instance pour interagir avec cet événement",
"We won’t change the world from Facebook. The tool we dream of, surveillance capitalism corporations won’t develop it, as they couldn’t profit from it. This is an opportunity to build something better, by taking another approach.": "On ne changera pas le monde depuis Facebook. L’outil dont nous rêvons, les entreprises du capitalisme de surveillance sont incapables de le produire, car elles ne sauraient pas en tirer profit. C’est l’occasion de faire mieux qu’elles, en faisant autrement.",
"We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Nous vous enverrons un email une heure avant que l'événement débute, pour être sûr que vous ne l'oubliez pas.",
"We'll use your timezone settings to send a recap of the morning of the event.": "Nous prendrons en compte votre fuseau horaire pour vous envoyer un récapitulatif de vos événements le matin.",
"Website": "Site web",
@ -746,7 +738,6 @@
"{count} requests waiting": "Une demande en attente|{count} demandes en attente",
"{count} team members": "{count} membres d'équipe",
"{instanceName} is an instance of the {mobilizon} software.": "{instanceName} est une instance du logiciel {mobilizon}.",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantit {respect} des personnes qui l'utiliseront. Puisque {source}, il est publiquement auditable, ce qui garantit sa transparence.",
"{moderator} added a note on {report}": "{moderator} a ajouté une note sur {report}",
"{moderator} closed {report}": "{moderator} a fermé {report}",
"{moderator} deleted an event named \"{title}\"": "{moderator} a supprimé un événement nommé \"{title}\"",
@ -780,5 +771,30 @@
"Federated Group Name": "Nom fédéré du groupe",
"This is like your federated username (<code>{username}</code>) for groups. It will allow you to be found on the federation, and is guaranteed to be unique.": "C'est comme votre addresse fédérée (<code>{username}</code>) pour les groupes. Cela vous permettra d'être trouvable sur la fédération, et est garanti d'être unique.",
"Banner": "Bannière",
"A group with this name already exists": "Un groupe avec ce nom existe déjà"
"A group with this name already exists": "Un groupe avec ce nom existe déjà",
"Create or join an group and start organizing with other people": "Créez ou rejoignez un groupe et commencez à vous organiser avec d'autres personnes",
"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</b> inside MeetUp?": "De l’anniversaire entre ami·e·s à une marche pour le climat, aujourd’hui, les bonnes raisons de se rassembler sont <b>captées par les géants du web</b>. Comment s’organiser, comment cliquer sur «je participe» sans <b>livrer des données intimes</b> à Facebook ou<b> s’enfermer</b> dans MeetUp?",
"We want to develop a <b>digital common</b> that everyone can make their own, one which respects <b>privacy and activism by design</b>.": "Nous voulons développer un <b>commun numérique</b>, que tout le monde pourra s’approprier, conçu dans <b>le respect de la vie privée et de l’action militante</b>.",
"We can’t change the world from within Facebook. The tool we dream of, surveillance capitalism corporations won’t develop, as they cannot profit from it. This is an opportunity to build something better, by taking another approach.": "On ne peut pas changer le monde depuis Facebook. L’outil dont nous rêvons, les entreprises du capitalisme de surveillance ne le produiront pas, car elles ne peuvent pas en tirer profit. C’est l’occasion de faire mieux qu’elles, en faisant autrement.",
"Conceived with care for humans": "Conçu avec soin pour les humains",
"This installation (called “an instance“) can easily {interconnect}, thanks to {protocol}.": "Cette installation (appelée “une instance“) peut facilement {interconnect}, grâce à {protocol}.",
"{license} guarantees {respect} of the people who use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantit {respect} des personnes qui l'utiliseront. Puisque {source}, il est publiquement auditable, ce qui garantit sa transparence.",
"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 so that right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "Nous avons demandé de l’aide à des professionnel·les du design pour concevoir ce que pourrait être Mobilizon. Nous avons pris le temps d’étudier {digital_habits} afin de comprendre les fonctionnalités dont ils et elles ont besoin pour se rassembler, s’organiser, se mobiliser afin que Mobilizon corresponde, dès sa conception, {fit_needs_uses_people} des personnes qui sont vouées à l’utiliser.",
"A cookie is a small file containing information 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 you 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.",
"The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it.": "Le nom d'utilisateur·rice est un identifiant unique pour votre compte. Il est similaire à une adresse e-mail mais permettant à d'autres personnes de vous trouver.",
"Bio": "Présentation",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Les groupes sont des espaces de coordination et de préparation pour mieux organiser des événements et gérer votre communauté.",
"Keep the entire conversation about a specific topic together on a single page.": "Rassemblez sur une seule page toute la conversation à propos d'un sujet spécifique.",
"Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Créez des listes de choses à faire pour toutes les tâches que vous devez faire, attribuez les et fixez des dates d'échéance.",
"A place to store links to documents or resources of any type.": "Un endroit pour stocker des liens vers des documents ou des ressources de tout type.",
"{group}'s events": "Événements de {group}",
"When someone from the group creates an event and attributes it to the group, it will show up here.": "Lorsqu'un membre du groupe crée un événement et l'attribue au groupe, il s'affichera ici.",
"View all": "Voir tous",
"+ Start a discussion": "+ Lancer une discussion",
"+ Add a resource": "+ Ajouter une resource",
"+ Add a todo": "+ Ajouter un todo",
"+ Create an event": "+ Créer un événement",
"+ Post a public message": "+ Poster un message public",
"A place to publish something to the whole world, your community or just your group members.": "Un endroit pour publier quelque chose à l'intention du monde entier, de votre communauté ou simplement des membres de votre groupe.",
"No posts found": "Aucun billet trouvé"
}

@ -14,9 +14,12 @@ export enum GroupsRouteName {
POST_EDIT = "POST_EDIT",
POST = "POST",
POSTS = "POSTS",
GROUP_EVENTS = "GROUP_EVENTS",
}
const resourceFolder = () => import("@/views/Resources/ResourceFolder.vue");
const groupEvents = () =>
import(/* webpackChunkName: "groupEvents" */ "@/views/Event/GroupEvents.vue");
export const groupsRoutes: RouteConfig[] = [
{
@ -99,4 +102,10 @@ export const groupsRoutes: RouteConfig[] = [
props: true,
name: GroupsRouteName.POSTS,
},
{
path: "/@:preferredUsername/events",
component: groupEvents,
props: true,
name: GroupsRouteName.GROUP_EVENTS,
},
];

@ -63,7 +63,8 @@ export class Actor implements IActor {
export function usernameWithDomain(actor: IActor, force = false): string {
if (actor.domain) {
return `${actor.preferredUsername}@${actor.domain}`;
} else if (force) {
}
if (force) {
return `${actor.preferredUsername}@${window.location.hostname}`;
}
return actor.preferredUsername;

@ -56,6 +56,7 @@ export class Group extends Actor implements IGroup {
this.patch(hash);
}
physicalAddress: IAddress = new Address();
patch(hash: any) {

@ -29,9 +29,9 @@ export class Discussion implements IDiscussion {
lastComment?: IComment = undefined;
insertedAt: string = "";
insertedAt = "";
updatedAt: string = "";
updatedAt = "";
constructor(hash?: IDiscussion) {
if (!hash) return;

@ -131,7 +131,11 @@ $subtitle-sup-size: 15px;
margin: 15px auto 30px;
}
$input-border-color: #dbdbdb;
//$input-border-color: #dbdbdb;
$breadcrumb-item-color: $primary;
$checkbox-background-color: #fff;
$title-color: $violet-3;
@import "~bulma";
@import "~bulma-divider";
@import "~buefy/src/scss/buefy";

@ -9,7 +9,7 @@
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?'
'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</b> inside MeetUp?'
)
"
/>
@ -37,7 +37,7 @@
<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>.'
'We want to develop a <b>digital common</b> that everyone can make their own, one which respects <b>privacy and activism by design</b>.'
)
"
/>
@ -49,9 +49,10 @@
)
"
/>
<span> </span>
<i18n
tag="span"
path="This installation (called “instance“) can easily {interconnect}, thanks to {protocol}."
path="This installation (called “an 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">{{
@ -77,7 +78,7 @@
<blockquote>
{{
$t(
"We won’t change the world from Facebook. The tool we dream of, surveillance capitalism corporations won’t develop it, as they couldn’t profit from it. This is an opportunity to build something better, by taking another approach."
"We can’t change the world from within Facebook. The tool we dream of, surveillance capitalism corporations won’t develop, as they cannot profit from it. This is an opportunity to build something better, by taking another approach."
)
}}
</blockquote>
@ -97,7 +98,7 @@
<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."
path="{license} guarantees {respect} of the people who use it. Since {source}, anyone can audit it, which guarantees its transparency."
>
<a slot="license" href="https://choosealicense.com/licenses/agpl-3.0/">{{
$t("Mobilizon’s licence")
@ -135,17 +136,12 @@
<section>
<div class="columns">
<div class="column has-text-right-desktop">
<h2 class="title">{{ $t("Concieved with care for humans") }}</h2>
<h2 class="title">{{ $t("Conceived 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."
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 so that right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it."
>
<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>

@ -55,7 +55,7 @@
<dd>
{{
$t(
"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 information 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 you to store more data."
)
}}
</dd>

@ -8,6 +8,7 @@
<a
class="list-item"
v-for="identity in identities"
:key="identity.id"
:class="{ 'is-active': identity.id === currentIdentity.id }"
@click="changeCurrentIdentity(identity)"
>
@ -49,7 +50,7 @@ export default class IdentityPicker extends Vue {
currentIdentity: IActor = this.value;
changeCurrentIdentity(identity: IActor) {
changeCurrentIdentity(identity: IActor): void {
this.currentIdentity = identity;
this.$emit("input", identity);
}

@ -3,8 +3,8 @@
<div
v-if="inline"
class="inline box"
:class="{ 'has-background-grey-lighter': masked }"
@click="isComponentModalActive = true"
:class="{ 'has-background-grey-lighter': masked, 'no-other-identity': !hasOtherIdentities }"
@click="activateModal"
>
<div class="media">
<div class="media-left">
@ -23,29 +23,35 @@
<div class="media-content" v-else>
{{ `@${currentIdentity.preferredUsername}` }}
</div>
<b-button type="is-text" @click="isComponentModalActive = true">
<b-button type="is-text" v-if="identities.length > 1" @click="activateModal">
{{ $t("Change") }}
</b-button>
</div>
</div>
<span v-else class="block" @click="isComponentModalActive = true">
<span v-else class="block" @click="activateModal">
<figure class="image is-48x48" v-if="currentIdentity.avatar">
<img class="is-rounded" :src="currentIdentity.avatar.url" alt="" />
</figure>
<b-icon v-else size="is-large" icon="account-circle" />
</span>
<b-modal :active.sync="isComponentModalActive" has-modal-card>
<b-modal v-model="isComponentModalActive" has-modal-card>
<identity-picker v-model="currentIdentity" @input="relay" />
</b-modal>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { IDENTITIES } from "@/graphql/actor";
import { IActor } from "../../types/actor";
import IdentityPicker from "./IdentityPicker.vue";
@Component({
components: { IdentityPicker },
apollo: {
identities: {
query: IDENTITIES,
},
},
})
export default class IdentityPickerWrapper extends Vue {
@Prop() value!: IActor;
@ -56,18 +62,30 @@ export default class IdentityPickerWrapper extends Vue {
isComponentModalActive = false;
identities: IActor[] = [];
currentIdentity: IActor = this.value;
@Watch("value")
updateCurrentActor(value: IActor) {
updateCurrentActor(value: IActor): void {
this.currentIdentity = value;
}
relay(identity: IActor) {
relay(identity: IActor): void {
this.currentIdentity = identity;
this.$emit("input", identity);
this.isComponentModalActive = false;
}
get hasOtherIdentities(): boolean {
return this.identities.length > 1;
}
activateModal(): void {
if (this.hasOtherIdentities) {
this.isComponentModalActive = true;
}
}
}
</script>
<style lang="scss">
@ -76,7 +94,7 @@ export default class IdentityPickerWrapper extends Vue {
cursor: pointer;
}
.inline {
.inline:not(.no-other-identity) {
cursor: pointer;
}

@ -91,7 +91,7 @@
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { Component, Prop, Vue } from "vue-property-decorator";
import EventCard from "@/components/Event/EventCard.vue";
import { FETCH_PERSON, CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import { MOBILIZON_INSTANCE_HOST } from "../../api/_entrypoint";
@ -123,12 +123,6 @@ export default class Profile extends Vue {
currentActor!: IPerson;
// // call again the method if the route changes
// @Watch('$route')
// onRouteChange() {
// // this.fetchData()
// }
feedUrls(format: "ics" | "webcal:" | "atom", isPublic = true): string {
let url = format === "ics" ? "webcal:" : "";
url += `//${MOBILIZON_INSTANCE_HOST}/`;
@ -140,7 +134,7 @@ export default class Profile extends Vue {
return url + (format === "ics" ? "ics" : "atom");
}
async createToken() {
async createToken(): Promise<void> {
const { data } = await this.$apollo.mutate({
mutation: CREATE_FEED_TOKEN_ACTOR,
variables: { actor_id: this.person.id },

@ -33,9 +33,16 @@
</p>
</b-field>
</b-field>
<p class="description">
{{
$t(
"The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it."
)
}}
</p>
<b-field :label="$t('Description')">
<b-input type="textarea" v-model="identity.summary" />
<b-field :label="$t('Bio')">
<b-input type="textarea" maxlength="100" rows="2" v-model="identity.summary" />
</b-field>
<p class="control has-text-centered">
@ -94,20 +101,20 @@ export default class Register extends mixins(identityEditionMixin) {
host?: string = MOBILIZON_INSTANCE_HOST;
errors: object = {};
errors: Record<string, unknown> = {};
validationSent = false;
sendingValidation = false;
async created() {
async created(): Promise<void> {
// Make sure no one goes to this page if we don't want to
if (!this.email) {
await this.$router.replace({ name: RouteName.PAGE_NOT_FOUND });
}
}
async submit() {
async submit(): Promise<void> {
try {
this.sendingValidation = true;
this.errors = {};
@ -170,4 +177,9 @@ export default class Register extends mixins(identityEditionMixin) {
.container .columns {
margin: 1rem auto 3rem;
}
p.description {
font-size: 0.9rem;
margin-bottom: 10px;
}
</style>

@ -197,13 +197,13 @@
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import { GET_GROUP, REFRESH_PROFILE } from "@/graphql/group";
import { SUSPEND_PROFILE, UNSUSPEND_PROFILE } from "../../graphql/actor";
import { IGroup, MemberRole } from "../../types/actor";
import { usernameWithDomain, IActor } from "../../types/actor/actor.model";
import RouteName from "../../router/name";
import { IEvent } from "../../types/event.model";
import ActorCard from "../../components/Account/ActorCard.vue";
import { GET_GROUP, REFRESH_PROFILE } from "@/graphql/group";
const EVENTS_PER_PAGE = 10;

@ -82,9 +82,9 @@
</template>
<script lang="ts">
import { Component, Vue, Watch } from "vue-property-decorator";
import { LIST_GROUPS } from "@/graphql/group";
import { LIST_PROFILES } from "../../graphql/actor";
import RouteName from "../../router/name";
import { LIST_GROUPS } from "@/graphql/group";
const PROFILES_PER_PAGE = 10;

@ -112,9 +112,9 @@ import { IDiscussion, Discussion } from "@/types/discussions";
import { usernameWithDomain } from "@/types/actor";
import DiscussionComment from "@/components/Discussion/DiscussionComment.vue";
import { GraphQLError } from "graphql";
import { DELETE_COMMENT, UPDATE_COMMENT } from "@/graphql/comment";
import RouteName from "../../router/name";
import { IComment } from "../../types/comment.model";
import { DELETE_COMMENT, UPDATE_COMMENT } from "@/graphql/comment";
@Component({
apollo: {

@ -26,13 +26,9 @@
</ul>
</nav>
<section>
<div v-if="group.discussions.elements.length > 0">
<discussion-list-item
:discussion="discussion"
v-for="discussion in group.discussions.elements"
:key="discussion.id"
/>
</div>
<p>
{{ $t("Keep the entire conversation about a specific topic together on a single page.") }}
</p>
<b-button
tag="router-link"
:to="{
@ -41,6 +37,13 @@
}"
>{{ $t("New discussion") }}</b-button
>
<div v-if="group.discussions.elements.length > 0">
<discussion-list-item
:discussion="discussion"
v-for="discussion in group.discussions.elements"
:key="discussion.id"
/>
</div>
</section>
</div>
</template>
@ -69,7 +72,7 @@ import RouteName from "../../router/name";
},
metaInfo() {
return {
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
title: this.$t("Discussions") as string,
// all titles will be injected into this template

@ -213,7 +213,7 @@
</b-field>
</form>
</div>
<b-modal :active.sync="dateSettingsIsOpen" has-modal-card trap-focus>
<b-modal v-model="dateSettingsIsOpen" has-modal-card trap-focus>
<form action>
<div class="modal-card" style="width: auto">
<header class="modal-card-head">

@ -0,0 +1,79 @@
<template>
<div class="container section" v-if="group">
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li>
<router-link
:to="{
name: RouteName.GROUP,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ group.preferredUsername }}</router-link
>
</li>
<li class="is-active">
<router-link
:to="{
name: RouteName.TODO_LISTS,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ $t("Events") }}</router-link
>
</li>
</ul>
</nav>
<section>
<h1 class="title" v-if="group">
{{ $t("{group}'s events", { group: group.name || group.preferredUsername }) }}
</h1>
<p>
{{
$t(
"When someone from the group creates an event and attributes it to the group, it will show up here."
)
}}
</p>
<b-loading :active.sync="$apollo.loading"></b-loading>
<section v-if="group && group.organizedEvents.total > 0">
<subtitle>
{{ $t("Past events") }}
</subtitle>
<transition-group name="list" tag="p">
<EventListViewCard v-for="event in group.organizedEvents.elements" :key="event.id" />
</transition-group>
</section>
<b-message
v-if="group.organizedEvents.elements.length === 0 && $apollo.loading === false"
type="is-danger"
>
{{ $t("No events found") }}
</b-message>
</section>
</div>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import { FETCH_GROUP } from "@/graphql/group";
import RouteName from "@/router/name";
import { IGroup, usernameWithDomain } from "../../types/actor";
@Component({
apollo: {
group: {
query: FETCH