Pages (terms/tos/privacy), comments improvements, etc

This commit is contained in:
vjrj 2018-01-21 20:53:21 +01:00
parent cd16f45d8e
commit 952431d296
34 changed files with 435 additions and 97 deletions

1
.gitignore vendored
View file

@ -7,3 +7,4 @@ private/GeoLite2-City.mmdb*
npm-debug.log
**/.sass-cache
.deploy/
public/locales/undefined/

View file

@ -14,6 +14,7 @@ const firesCommonSchema = {
owner: { type: String, optional: true },
dateformat: { type: String, optional: true },
ourversion: { type: String, optional: true },
// NASA types
address: { type: String, optional: true }, // reverse geo

View file

@ -0,0 +1,6 @@
import moment from 'moment-timezone';
export const momentTz = date => moment.tz(date, moment.tz.guess());
export const dateLongFormat = date => momentTz(date).format('LLLL (z)');
export const dateParseShortFormat = date => moment(date, 'YYYY-MM-DD').format('LL');
export const dateFromNow = date => momentTz(date).fromNow();

View file

@ -30,6 +30,7 @@ Notifications.schema = new SimpleSchema({
emailNotified: { type: Boolean, optional: true },
emailNotifiedAt: { type: Date, optional: true },
when: Date,
sealed: String,
createdAt: defaultCreatedAt,
updatedAt: defaultUpdateAt
});

View file

@ -1,13 +1,35 @@
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import i18n from 'i18next';
import fs from 'fs';
import getPrivateFile from '../../../modules/server/get-private-file';
import parseMarkdown from '../../../modules/parse-markdown';
const as = f => `assets/app/${f}`;
const getFallback = (lang) => {
if (lang === 'ast' || lang === 'gl' || lang === 'eu' || lang === 'ca') {
return 'es';
}
return 'en';
};
Meteor.methods({
'utility.getPage': function utilityGetPage(fileName) {
'utility.getPage': function utilityGetPage(fileName, lang) {
check(fileName, String);
return parseMarkdown(getPrivateFile(`pages/${fileName}.md`));
check(lang, String);
const base = `pages/${fileName}`;
const fallback = getFallback(lang);
let file = `${base}-${lang}.md`;
if (!fs.existsSync(as(file))) {
console.log(`Page '${fileName}' not found for '${lang}' lang`);
file = `${base}-${fallback}.md`;
if (!fs.existsSync(as(file))) {
console.log(`Page '${fileName}' not found for '${fallback}' lang`);
file = `${base}.md`;
}
}
return parseMarkdown(getPrivateFile(file));
},
'utility.saveMissingI18n': function saveMissing(key, value) {
check(key, String);

View file

@ -28,12 +28,12 @@ i18n.init((err, t) => {
Comments.ui.config({
limit: 20, // default 10
loadMoreCount: 20, // default 20
generateAvatar: function genAvatar(user, isAnonymous) {
/* generateAvatar: function genAvatar(user, isAnonymous) {
if (isAnonymous) {
return i18n.t('Anónimo');
}
return user.profile && user.profile.name && user.profile.name.first ? user.profile.name.first : null;
},
}, */
template: 'bootstrap', // default 'semantic-ui'
// default 'http://s3.amazonaws.com/37assets/svn/765-default-avatar.png'
defaultAvatar: '/default-avatar.png',

View file

@ -3,6 +3,7 @@
import i18n from 'i18next';
import { Meteor } from 'meteor/meteor';
import moment from 'moment';
import { dateLongFormat } from '/imports/api/Common/dates';
import Notifications from '/imports/api/Notifications/Notifications';
import sendMail from '/imports/startup/server/email';
import { hr } from '/imports/startup/server/email';
@ -58,19 +59,28 @@ Meteor.startup(() => {
user && user.emails[0] && user.emails[0].verified ? user.emails[0].address : null;
if (emailAddress) {
const img = imgEl(notif.geo.coordinates[1], notif.geo.coordinates[0]);
const url = imgUrl(notif.geo.coordinates[1], notif.geo.coordinates[0]);
// const url = imgUrl(notif.geo.coordinates[1], notif.geo.coordinates[0]);
const fireUrl = `${Meteor.absoluteUrl('fire/')}${notif.sealed}`;
const fireHtmlUrl = `<a href="${fireUrl}">${i18n.t('Más información sobre este fuego')}</a>`;
// TODO get _id of fire
const fireTextUrl = `${i18n.t('Más información sobre este fuego')}:\n${fireUrl}`;
// FIXME use our map as url and static map as img
moment.locale(user.lang);
const message = `${trim(notif.content)} (${i18n.t('fireDetectedAt', { when: moment(notif.when).format('LLL') })}).`;
// moment user tz ?
const message = `${trim(notif.content)} (${i18n.t('fireDetectedAt', { when: dateLongFormat(notif.when) })}).`;
// TODO unsubscribe link
// TODO Address
const emailOpts = {
to: emailAddress,
userName: firstName,
sendAt: new Date(),
subject: truncate.apply(message, [50, true]),
text: `${message} ${url}`,
text: `${message}\n\n${fireTextUrl}\n\n`,
template: '<body><h2>{{appName}}</h2>{{{html}}}</body>',
appName: i18n.t('AppName'),
html: `<p>${message}</p>${hr}<p>${img}</p>`
html: `<p>${message}</p><p>${fireHtmlUrl}</p>${hr}<p>${img}</p>`
};
sendMail(emailOpts, true);
Notifications.update(notif._id, { $set: { emailNotified: true, emailNotifiedAt: new Date() } });

View file

@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import { Bert } from 'meteor/themeteorchef:bert';
import moment from 'moment';
import { dateFromNow } from '/imports/api/Common/dates';
import Notifications from '/imports/api/Notifications/Notifications';
import Push from 'push.js/bin/push.min.js';
import i18n from '/imports/startup/client/i18n';
@ -14,13 +14,13 @@ function process(notif) {
if (Push.Permission.has()) {
if (!notif.webNotified) {
Push.create(i18n.t('AppName'), {
body: `${trim(notif.content)} (${i18n.t('fireDetected', { when: moment(notif.when).fromNow() })})`,
body: `${trim(notif.content)} (${i18n.t('fireDetected', { when: dateFromNow(notif.when) })})`,
icon: '/n-fire-marker.png',
requireInteraction: true,
onClick: function onClickFocus() {
window.focus();
this.close();
history.push('/fires');
history.push(`/fire/${notif.sealed}`);
}
});

View file

@ -160,8 +160,7 @@ class SelectionMap extends Component {
render() {
const { t, onRemove } = this.props;
return (
<div>
{ this.isValidState() &&
this.isValidState() ?
<Fragment>
<Map
className="selectionmap-leaflet-container"
@ -251,10 +250,8 @@ class SelectionMap extends Component {
</ButtonGroup>
</Control>
</Map>
</Fragment>
}
</div>
);
</Fragment> :
<div />);
}
}

View file

@ -1,12 +1,16 @@
/* eslint-disable import/no-absolute-path */
/* eslint-disable react/jsx-indent-props */
/* eslint-disable react/jsx-indent */
import React from 'react';
import Page from '../Page/Page';
import { translate } from 'react-i18next';
import Page from '../Page/Page';
const Credits = props => (
<div className="Credits">
<Page
title={props.t("Créditos")}
subtitle={props.t("Sobre los datos y imágenes usados")}
title={props.t('Créditos')}
subtitle={props.t('Sobre los datos y imágenes usados')}
page="credits"
/>
</div>

View file

@ -8,12 +8,12 @@ import { withTracker } from 'meteor/react-meteor-data';
import { translate } from 'react-i18next';
import { Meteor } from 'meteor/meteor';
import { Map, Circle } from 'react-leaflet';
import moment from 'moment-timezone';
import Blaze from 'meteor/gadicc:blaze-react-component';
import DefMapLayers from '/imports/ui/components/Maps/DefMapLayers';
import NotFound from '/imports/ui/pages/NotFound/NotFound';
import FiresCollection from '/imports/api/Fires/Fires';
import { dateLongFormat, dateFromNow } from '/imports/api/Common/dates';
import '/imports/startup/client/comments';
import './Fires.scss';
class Fire extends React.Component {
@ -27,16 +27,17 @@ class Fire extends React.Component {
render() {
const { loading, fire, t } = this.props;
if (fire && fire.when) {
this.when = moment.tz(fire.when, moment.tz.guess());
this.dateLongFormat = dateLongFormat(fire.when);
this.dateFromNow = dateFromNow(fire.when);
}
return (
<div className="ViewFire">
return (fire ?
(<div className="ViewFire">
{!loading &&
<Fragment>
<h4 className="page-header">
{fire.address ?
t('Información adicional sobre fuego detectado en {{where}} el {{when}}', { where: fire.address, when: this.when.format('LLLL (z)') }) :
t('Información adicional sobre fuego detectado el {{when}}', { when: this.when.format('LLLL (z)') })}
t('Información adicional sobre fuego detectado en {{where}} el {{when}}', { where: fire.address, when: this.dateLongFormat }) :
t('Información adicional sobre fuego detectado el {{when}}', { when: this.dateLongFormat })}
</h4>
<Map
@ -62,10 +63,10 @@ class Fire extends React.Component {
</Map>
<p>{t('Coordenadas:')} {fire.lat}, {fire.lon}</p>
{(fire.type === 'modis' || fire.type === 'viirs') &&
<p>{t('Fuego detectado por satélites de la NASA {{when}}', { when: this.when.fromNow() })}</p>
<p>{t('Fuego detectado por satélites de la NASA {{when}}', { when: this.dateFromNow })}</p>
}
{(fire.type === 'vecinal') &&
<p>{t('Fuego notificado por uno de nuestros usuarios/as {{when}}', { when: this.when.fromNow() })}</p>
<p>{t('Fuego notificado por uno de nuestros usuarios/as {{when}}', { when: this.dateFromNow })}</p>
}
{/* TODO: marcar tipo de fuego, industria, etc */}
<h4>{t('Comentarios')}</h4>
@ -85,8 +86,8 @@ class Fire extends React.Component {
</div>
</Fragment>
}
</div>
);
</div>
) : <NotFound />);
}
}

View file

@ -9,7 +9,7 @@
width: 100%;
/* min-width: 75vw; */
display: flex;
margin: 20px auto;
margin: 10px auto;
}
@include breakpoint(mobile) {

View file

@ -166,6 +166,7 @@
position: relative;
width: 100vw;
margin-left: calc(-50vw + 50%);
margin-top: -21px;
position: relative;
/*
width: 100vw;
@ -213,3 +214,7 @@
.device[data-device=iPhone6][data-orientation=portrait][data-color=white] {
background-image: url(/mobile.png);
}
.full-width .page-header { // section titles
margin-top: 20px;
}

View file

@ -208,7 +208,7 @@ class Index extends Component {
</div>
<div className="col-lg-6">
<div className="feature-item">
<i className="icon-envelope-open text-primary" />
<i className="icon-speech text-primary" />
<h3><Trans>Notificaciones</Trans></h3>
<p className="text-muted"><Trans>Recibe nuestras notificaciones de fuegos por correo o en tu navegador</Trans></p>
</div>

View file

@ -1,12 +1,17 @@
/* eslint-disable import/no-absolute-path */
/* eslint-disable react/jsx-indent-props */
/* eslint-disable react/jsx-indent */
import React from 'react';
import Page from '../Page/Page';
import { translate } from 'react-i18next';
import { dateParseShortFormat } from '/imports/api/Common/dates';
import Page from '../Page/Page';
const License = props => (
<div className="License">
<Page
title={props.t("Licencia")}
subtitle={props.t("Última actualización 15 de noviembre de 2017")}
title={props.t('Licencia')}
subtitle={props.t('Última actualización, {{when}}', { when: dateParseShortFormat('2017-01-19') })}
page="license"
/>
</div>

View file

@ -1,12 +1,15 @@
import React from 'react';
import { Alert } from 'react-bootstrap';
import { translate, Trans } from 'react-i18next';
const NotFound = () => (
<div className="NotFound">
<Alert bsStyle="danger">
<p><strong>Error [404]</strong>: {window.location.pathname} does not exist.</p>
<p>
<Trans i18nKey="not-found">Upppps: Esta página no existe</Trans>
</p>
</Alert>
</div>
);
export default NotFound;
export default translate([], { wait: true })(NotFound);

View file

@ -5,6 +5,7 @@ import { createContainer } from 'meteor/react-meteor-data';
import { ReactiveVar } from 'meteor/reactive-var';
import PageHeader from '../../components/PageHeader/PageHeader';
import Content from '../../components/Content/Content';
import i18n from '/imports/startup/client/i18n';
import './Page.scss';
@ -16,13 +17,13 @@ const Page = ({ title, subtitle, content }) => (
);
Page.defaultProps = {
subtitle: '',
subtitle: ''
};
Page.propTypes = {
title: PropTypes.string.isRequired,
subtitle: PropTypes.string,
content: PropTypes.string.isRequired,
content: PropTypes.string.isRequired
};
const pageContent = new ReactiveVar('');
@ -30,7 +31,7 @@ const pageContent = new ReactiveVar('');
export default createContainer(({ content, page }) => {
window.scrollTo(0, 0); // Force window to top of page.
Meteor.call('utility.getPage', page, (error, response) => {
Meteor.call('utility.getPage', page, i18n.language, (error, response) => {
if (error) {
console.warn(error);
} else {
@ -39,6 +40,6 @@ export default createContainer(({ content, page }) => {
});
return {
content: content || pageContent.get(),
content: content || pageContent.get()
};
}, Page);

View file

@ -1,12 +1,17 @@
/* eslint-disable import/no-absolute-path */
/* eslint-disable react/jsx-indent-props */
/* eslint-disable react/jsx-indent */
import React from 'react';
import Page from '../Page/Page';
import { translate } from 'react-i18next';
import { dateParseShortFormat } from '/imports/api/Common/dates';
import Page from '../Page/Page';
const Privacy = props => (
<div className="Privacy">
<Page
title={props.t("Política de Privacidad")}
subtitle={props.t("Última actualización 15 de noviembre de 2017")}
title={props.t('Política de Privacidad')}
subtitle={props.t('Última actualización, {{when}}', { when: dateParseShortFormat('2017-01-19') })}
page="privacy"
/>
</div>

View file

@ -1,12 +1,17 @@
/* eslint-disable import/no-absolute-path */
/* eslint-disable react/jsx-indent-props */
/* eslint-disable react/jsx-indent */
import React from 'react';
import Page from '../Page/Page';
import { translate } from 'react-i18next';
import { dateParseShortFormat } from '/imports/api/Common/dates';
import Page from '../Page/Page';
const Terms = props => (
<div className="Terms">
<Page
title={props.t("Términos de Servicio")}
subtitle={props.t("Última actualización 15 de noviembre de 2017")}
title={props.t('Términos de Servicio')}
subtitle={props.t('Última actualización, {{when}}', { when: dateParseShortFormat('2017-01-19') })}
page="terms"
/>
</div>

View file

@ -2,7 +2,7 @@
@import './colors';
a, a:hover {
color: $todos-palette5;
color: $todos-palette2;
}
.bg-dark {
@ -19,6 +19,10 @@ h4.page-header {
}
}
.page-header {
margin-top: 25px;
.App > .container { // Because of fixed header, previously page-header {
margin-top: 30px;
}
h4.page-header {
font-size: 2em;
}

View file

@ -49,10 +49,15 @@ p {
margin-bottom: 20px; }
div.section.platf > div.container {
padding: 70px 0; }
padding: 30px 0; }
div.section h2 {
font-size: 50px; }
@include breakpoint(mobile) {
div.section h2 {
font-size: 40px; }
}
div.section.crowd > div.container {
position: relative;
padding: 120px 0; }
@ -84,6 +89,17 @@ div.section.platf .feature-item {
max-width: 325px;
margin: 0 auto; }
@include breakpoint(mobile) {
div.section.platf .device-container,
div.section.platf .feature-item {
margin: 10px auto;
}
.device-wrapper {
margin: 10px auto;
}
}
div.section.platf .device-container {
margin-bottom: 100px; }
@media (min-width: 992px) {
@ -94,6 +110,13 @@ div.section.platf .feature-item {
padding-top: 50px;
padding-bottom: 50px;
text-align: center; }
@include breakpoint(mobile) {
div.section.platf .feature-item {
padding-top: 15px;
padding-bottom: 15px; }
}
div.section.platf .feature-item h3 {
font-size: 30px; }
div.section.platf .feature-item i {

View file

@ -0,0 +1,16 @@
**Data**
We acknowledge the use of data and imagery from LANCE FIRMS operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.
**Images**
* Home slide 1: Sotres, Picos de Europa, Asturias, photo by Mick Stephenson, license CC-BY-SA 3.0, [source](https://es.wikipedia.org/wiki/Sotres#/media/File:SotresPanorama.jpg).
* Home slide 2: Silverhorne, United States, photo by Nathan Anderson [source](https://unsplash.com/photos/ZLOZC1uUdns).
* Home slide 3: Bitterroot National Forest, Montana, United States, photo by John McColgan, Public Domain, [source](https://commons.wikimedia.org/wiki/File:Deerfire_high_res.jpg).
* Home slide 4: Cox Valley Fire, Olympic NP, United States, August 2016, [source](https://www.nps.gov/olym/learn/management/current-fire-status.htm).
* Wildfire home photo: [California Wildfires, October 23th 2007](https://commons.wikimedia.org/wiki/File:California_Wildfires_October_23_2007.jpg), [fuente](http://www.nasa.gov/vision/earth/lookingatearth/socal_wildfires_oct07.html).
* Default avatar: A colored Emoji from Noto project, released under Apache license, [source](https://commons.wikimedia.org/wiki/File:Emoji_u1f469_1f3fd_200d_1f692.svg).
**Others**
The rest is our own work, see [our license](/license).

View file

@ -0,0 +1,16 @@
**Datos**
Reconocemos el uso de datos e imágenes de LANCE FIRMS operadas por NASA/GSFC/Earth Science Data and Information System (ESDIS) con fondos proporcionados por NASA/HQ.
**Imágenes**
* Diapositiva 1 inicial: Sotres, Picos de Europa, Asturias, foto de Mick Stephenson, licencia CC-BY-SA 3.0, [fuente](https://es.wikipedia.org/wiki/Sotres#/media/File:SotresPanorama.jpg).
* Diapositiva 2 inicial: Silverhorne, Estados Unidos, foto de Nathan Anderson [fuente](https://unsplash.com/photos/ZLOZC1uUdns).
* Diapositiva 3 inicial: Bitterroot National Forest, Montana, Estados Unidos, foto de John McColgan, Public Domain, [fuente](https://commons.wikimedia.org/wiki/File:Deerfire_high_res.jpg).
* Diapositiva 4 inicial: Cox Valley Fire, Olympic NP, Estados Unidos, agosto de 2016, [fuente](https://www.nps.gov/olym/learn/management/current-fire-status.htm).
* Foto de inicio de fuego forestal: [Incendios forestales de California, 23 de octubre de 2007](https://commons.wikimedia.org/wiki/File:California_Wildfires_October_23_2007.jpg), [fuente](http://www.nasa.gov/vision/earth/lookingatearth/socal_wildfires_oct07.html).
* Avatar predeterminado: un Emoji coloreado del proyecto Noto, publicado bajo licencia Apache, [fuente](https://commons.wikimedia.org/wiki/File:Emoji_u1f469_1f3fd_200d_1f692.svg).
**Otros**
El resto es nuestro propio trabajo, ver [nuestra licencia](/licencia).

View file

@ -1,13 +0,0 @@
## Data ##
We acknowledge the use of data and imagery from LANCE FIRMS operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.
## Photos ##
https://commons.wikimedia.org/wiki/File:California_Wildfires_October_23_2007.jpg
Source: http://www.nasa.gov/vision/earth/lookingatearth/socal_wildfires_oct07.html
## Icons ##
Default avater by Mimooh (Own work) [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons

View file

@ -0,0 +1,97 @@
Your privacy is important to us.
Comunes Association built the 'All Against Fire' app and this SERVICE is provided by Comunes Association at no cost and is intended for use as is.
This page is used to inform website visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service.
If you choose to use our Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that we collect is used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.
The terms used in this Privacy Policy have the same meanings as in our [Terms and Conditions](/terms), which is accessible at 'All Against Fire' unless otherwise defined in this Privacy Policy.
**Information Collection and Use**
For a better experience, while using our Service, we may require you to provide us with certain personally identifiable information, including but not limited to name, email, language, and the telegram username (of our Telegram users). The information that we request is will be retained by us and used as described in this privacy policy.
In addition, the app may collect certain information automatically, including, but not limited to, the type of device you use, the IP address of your device, your mobile operating system, the type of Internet browsers you use, and information about the way you use the app.
We may use the information we collect in the following ways:
* To personalize your experience and to allow us to deliver the type of content in which you are most interested.
* To send periodic emails regarding our services.
The app does use third party services that may collect information used to identify you.
Links to privacy policy of third party service providers used by the app:
* [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Privacy_Policy/)
* [Google Maps](https://developers.google.com/maps/terms?hl=es#3-privacy-and-personal-information)
We have not enabled Google AdSense.
**Does the app collect precise real time location information of the device?**
When you visit the app, we may use GPS technology (or other similar technology) to determine your current location in order to determine the city you are located within and/or display a location map of local fires and/or provide alerts of future fires in your zone. We **will not** share your current location with other users or partners.
If you do not want us to use your location for the purposes set forth above, you should turn off the location services for the mobile app located in your account settings or in your mobile phone settings and/or within the app and/or when asked by your browser.
**How do we protect your information?**
We do not use vulnerability scanning and/or scanning to PCI standards. We only provide articles and information. We never ask for credit card numbers. We do not use Malware Scanning.
Your personal information is contained behind secured networks and is only accessible by a limited number of persons who have special access rights to such systems, and are required to keep the information confidential. In addition, all sensitive information you supply is encrypted via Secure Socket Layer (SSL) technology.
We implement a variety of security measures when a user enters, submits, or accesses their information to maintain the safety of your personal information.
**Log Data**
We want to inform you that whenever you use our Service, in a case of an error in the app we collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing our Service, the time and date of your use of the Service, and other statistics.
**Do we use 'cookies'?**
Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow) that enables the site's or service provider's systems to recognize your browser and capture and remember certain information. For instance, we use cookies to help us remember and process your prefered language. They are also used to help us understand your preferences based on previous or current site activity, which enables us to provide you with improved services. We also use cookies to help us compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future.
We use cookies to understand and save user's preferences for future visits.
You can choose to have your computer warn you each time a cookie is being sent, or you can choose to turn off all cookies. You do this through your browser settings. Since browser is a little different, look at your browser's Help Menu to learn the correct way to modify your cookies.
If you turn cookies off, some of the features that make your site experience more efficient may not function properly.
**Service Providers**
We may employ third-party companies and individuals to facilitate our Service.
**Third-party disclosure**
We do not sell, trade, or otherwise transfer to outside parties your Personally Identifiable Information.
**Security**
We value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and we cannot guarantee its absolute security.
**Links to Other Sites**
We do not include or offer third-party products or services on our website but this Service may contain links to other sites in user comments. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by us. Therefore, we strongly advise you to review the Privacy Policy of these websites. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.
**Childrens Privacy**
These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.
**Fair Information Practices**
The Fair Information Practices Principles form the backbone of privacy law in the United States and the concepts they include have played a significant role in the development of data protection laws around the globe. Understanding the Fair Information Practice Principles and how they should be implemented is critical to comply with the various privacy laws that protect personal information.
In order to be in line with Fair Information Practices we will take the following responsive action, should a data breach occur:
* We will notify you via email, within 7 business days
We also agree to the Individual Redress Principle which requires that individuals have the right to legally pursue enforceable rights against data collectors and processors who fail to adhere to the law. This principle requires not only that individuals have enforceable rights against data users, but also that individuals have recourse to courts or government agencies to investigate and/or prosecute non-compliance by data processors.
**Changes to This Privacy Policy**
We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.
**Your Consent**
By using the app, you are consenting to our processing of your information as set forth in this Privacy Policy now and as amended by us. "Processing," means using cookies on a computer/hand held device or using or touching information in any way, including, but not limited to, collecting, storing, deleting, using, combining and disclosing information, all of which activities will take place in Spain. If you reside outside Spain your information will be transferred, processed and stored there under Spain privacy standards.
**Contact Us**
If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us: info AT comunes DOT org.

View file

@ -0,0 +1,97 @@
Su privacidad es importante para nosotros.
La Asociación Comunes ha creado esta aplicación 'Tod@s contra el fuego' y este SERVICIO que se provee por la Asociación de Comunes sin costo y está destinado a ser usado tal cual.
Esta página se utiliza para informar a los visitantes del sitio web sobre nuestras políticas con la recopilación, el uso y la divulgación de información personal si alguien decide utilizar nuestro Servicio.
Si elige usar nuestro Servicio, acepta la recopilación y el uso de la información en relación con esta política. La información personal que recopilamos se usa para proporcionar y mejorar el servicio. No usaremos ni compartiremos su información con nadie, excepto según se describe en esta Política de privacidad.
Los términos utilizados en esta Política de privacidad tienen los mismos significados que en nuestros [Términos y condiciones](/terms), a los que se puede acceder en "Tod@s contra incendio" a menos que se defina lo contrario en esta Política de privacidad.
**Recopilación y uso de información**
Para una mejor experiencia, al utilizar nuestro Servicio, podemos solicitarle que nos brinde cierta información de identificación personal, que incluye, entre otros, nombre, correo electrónico, idioma y el nombre de usuario del telegrama (de nuestros usuarios de Telegram). La información que solicitamos será retenida por nosotros y utilizada como se describe en esta política de privacidad.
Además, la aplicación puede recopilar cierta información automáticamente, que incluye, entre otros, el tipo de dispositivo que usa, la dirección IP de su dispositivo, su sistema operativo móvil, el tipo de navegador de Internet que utiliza e información sobre la forma que usas la aplicación.
Podemos usar la información que recopilamos de las siguientes maneras:
* Para personalizar su experiencia y permitirnos ofrecer el tipo de contenido que más le interesa.
* Para enviar correos electrónicos periódicos con respecto a nuestros servicios.
La aplicación utiliza servicios de terceros que pueden recopilar información utilizada para identificarlo.
Enlaces a la política de privacidad de proveedores de servicios de terceros utilizados por la aplicación:
* [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Privacy_Policy/)
* [Google Maps](https://developers.google.com/maps/terms?hl=es#3-privacy-and-personal-information)
No hemos habilitado Google AdSense.
**¿La aplicación recopila información precisa sobre la ubicación en tiempo real del dispositivo?**
Cuando visita la aplicación, podemos usar tecnología GPS (u otra tecnología similar) para determinar su ubicación actual a fin de determinar la ciudad en la que se encuentra y/o mostrar un mapa de ubicación de incendios locales y/o proporcionar alertas de incendios futuros en tu zona. **No** compartiremos su ubicación actual con otros usuarios o socios.
Si no desea que usemos su ubicación para los fines establecidos anteriormente, debe desactivar los servicios de ubicación para la aplicación móvil ubicados en la configuración de su cuenta o en la configuración de su teléfono móvil y/o dentro de la aplicación y/o cuando se le solicite por tu navegador.
**¿Cómo protegemos tu información?**
No utilizamos el escaneo y/o escaneo de vulnerabilidades a estándares PCI. Solo proporcionamos artículos e información. Nunca pedimos números de tarjetas de crédito. No utilizamos el Malware Scanning.
Su información personal está almacenada detrás de redes seguras y solo es accesible para un número limitado de personas que tienen derechos especiales de acceso a dichos sistemas, y se les exige mantener la confidencialidad de la información. Además, toda la información sensible que usted suministra se cifra a través de la tecnología Secure Socket Layer (SSL).
Implementamos una variedad de medidas de seguridad cuando un usuario ingresa, envía o accede a su información para mantener la seguridad de su información personal.
**Dato de registro**
Queremos informarle que cada vez que utiliza nuestro Servicio, en caso de error en la aplicación, recopilamos datos e información (a través de productos de terceros) en su teléfono, llamados Datos de registro. Este registro de datos puede incluir información como la dirección del protocolo de Internet ("IP"), el nombre del dispositivo, la versión del sistema operativo, la configuración de la aplicación al utilizar nuestro servicio, la hora y fecha de uso del servicio y otras estadísticas.
**¿Usamos 'cookies'?**
Sí. Las cookies son pequeños archivos que un sitio o su proveedor de servicios transfiere al disco duro de su computadora a través de su navegador web (si lo permite) que permite que los sistemas del sitio o del proveedor de servicios reconozcan su navegador y capturen y recuerden cierta información. Por ejemplo, usamos cookies para ayudarnos a recordar y procesar su idioma preferido. También se utilizan para ayudarnos a comprender sus preferencias en función de la actividad del sitio anterior o actual, lo que nos permite brindarle mejores servicios. También utilizamos cookies para ayudarnos a recopilar datos agregados sobre el tráfico del sitio y la interacción del sitio para que podamos ofrecer mejores experiencias y herramientas del sitio en el futuro.
Usamos cookies para comprender y guardar las preferencias del usuario para futuras visitas.
Puede optar por que su computadora lo advierta cada vez que se envía una cookie, o puede optar por desactivar todas las cookies. Lo haces a través de la configuración de tu navegador. Dado que el navegador es un poco diferente, consulte el Menú de Ayuda de su navegador para conocer la forma correcta de modificar sus cookies.
Si desactiva las cookies, es posible que algunas de las funciones que hacen que su sitio sea más eficiente no funcionen correctamente.
**Proveedores de servicio**
Podemos emplear compañías e individuos de terceros para facilitar nuestro Servicio.
**Divulgación de terceros**
No vendemos, comercializamos ni transferimos a terceros su información de identificación personal.
**Seguridad**
Valoramos su confianza al proporcionarnos su información personal, por lo tanto, nos esforzamos por utilizar medios comercialmente aceptables para protegerla. Pero recuerde que ningún método de transmisión a través de Internet o método de almacenamiento electrónico es 100% seguro y confiable, y no podemos garantizar su seguridad absoluta.
**Enlaces a otros sitios**
No incluimos ni ofrecemos productos o servicios de terceros en nuestro sitio web, pero este Servicio puede contener enlaces a otros sitios en los comentarios de los usuarios. Si hace clic en un enlace de un tercero, se lo dirigirá a ese sitio. Tenga en cuenta que estos sitios externos no son operados por nosotros. Por lo tanto, le recomendamos encarecidamente que revise la Política de privacidad de estos sitios web. No tenemos control ni asumimos ninguna responsabilidad por el contenido, las políticas de privacidad o las prácticas de sitios o servicios de terceros.
**Privacidad de los niños**
Estos servicios no se dirigen a personas menores de 13 años. No recopilamos deliberadamente información personal identificable de niños menores de 13 años. En el caso de que descubramos que un niño menor de 13 años nos ha proporcionado información personal, la borramos inmediatamente de nuestros servidores. Si usted es un padre o tutor y sabe que su hijo nos ha proporcionado información personal, comuníquese con nosotros para que podamos hacer las acciones necesarias.
**Prácticas justas de información**
Los principios de prácticas justas de información (del inglés 'Fair Information Practices') forman la columna vertebral de la ley de privacidad en los Estados Unidos y los conceptos que incluyen han jugado un papel importante en el desarrollo de las leyes de protección de datos en todo el mundo. Comprender los principios prácticos de información justa y cómo deben implementarse es fundamental para cumplir con las diversas leyes de privacidad que protegen la información personal.
Para estar en línea con las prácticas de información justas, tomaremos la siguiente medida de respuesta, en caso de que se produzca una violación de datos:
* Le notificaremos por correo electrónico dentro de los 7 días hábiles
También aceptamos el principio de reparación individual que exige que las personas tengan derecho a buscar legalmente derechos exigibles contra los recolectores de datos y procesadores que no cumplan con la ley. Este principio requiere no solo que los individuos tengan derechos exigibles contra los usuarios de los datos, sino también que los individuos recurran a los tribunales o agencias gubernamentales para investigar y/o enjuiciar el incumplimiento por parte de los procesadores de datos.
**Cambios a esta política de privacidad**
Es posible que actualicemos nuestra política de privacidad de vez en cuando. Por lo tanto, se recomienda revisar esta página periódicamente para cualquier cambio. Le notificaremos de cualquier cambio publicando la nueva política de privacidad en esta página. Estos cambios entran en vigencia inmediatamente después de que se publiquen en esta página.
**Tu consentimiento**
Al utilizar la aplicación, usted está dando su consentimiento para que procesemos su información según lo establecido en esta política de privacidad ahora y en la forma en que nosotros lo modifiquemos. "Procesamiento" significa usar cookies en una computadora/dispositivo de mano o usar o tocar información de cualquier manera, incluyendo, pero no limitado a, recolectar, almacenar, eliminar, usar, combinar y divulgar información, todas las cuales se llevarán a cabo en España. Si reside fuera de España, su información será transferida, procesada y almacenada allí según los estándares de privacidad de España.
**Contáctenos**
Si tiene alguna pregunta o sugerencia sobre nuestra Política de privacidad, no dude en ponerse en contacto con nosotros: info ARROBA comunes PUNTO org.

View file

@ -1,18 +0,0 @@
Your privacy is important to us.
It is Clever Beagle's policy to respect your privacy regarding any information we may collect while operating our website. Accordingly, we have developed this privacy policy in order for you to understand how we collect, use, communicate, disclose and otherwise make use of personal information. We have outlined our privacy policy below.
We will collect personal information by lawful and fair means and, where appropriate, with the knowledge or consent of the individual concerned.
Before or at the time of collecting personal information, we will identify the purposes for which information is being collected.
We will collect and use personal information solely for fulfilling those purposes specified by us and for other ancillary purposes, unless we obtain the consent of the individual concerned or as required by law.
Personal data should be relevant to the purposes for which it is to be used, and, to the extent necessary for those purposes, should be accurate, complete, and up-to-date.
We will protect personal information by using reasonable security safeguards against loss or theft, as well as unauthorized access, disclosure, copying, use or modification.
We will make readily available to customers information about our policies and practices relating to the management of personal information.
We will only retain personal information for as long as necessary for the fulfillment of those purposes.
We are committed to conducting our business in accordance with these principles in order to ensure that the confidentiality of personal information is protected and maintained. Clever Beagle may change this privacy policy from time to time at Clever Beagle's sole discretion.

45
private/pages/terms-en.md Normal file
View file

@ -0,0 +1,45 @@
The Association Comunes (hereinafter Comunes) with address at Calle Duque de Alba, 13, 28012 Madrid, Spain with CIF G85860708 makes available on its website fuegos.comunes.org certain content of an informative nature on its activities.
These general conditions govern solely and exclusively the use of the Comunes website by the USERS that access it. These general conditions are exposed to the USER on the website fuegos.comunes.org in each and every one of the pages and each time a USER enters their data in the existing forms, to read, print, file and accept through internet, the USER can not enter their data effectively without this acceptance has occurred.
Comunes is registered in the Spanish National Registry of Associations: Group 1 / Section 1 / National Number: 594506.
The access to this website of Comunes, 'All against the Fire', implies without reservation the acceptance of the present general conditions of use that the USER affirms to understand in its entirety. The USER undertakes not to use the website and the services offered therein to carry out activities contrary to the law and to respect at all times these general conditions.
**FIRST.- CONDITIONS OF ACCESS AND USE**
1.1.- The use of the website of Comunes, 'All against the Fire', does not entail the obligation of registration of the USER, unless this USER wishes to use the notification services of fuegos.comunes.org where it will be necessary to register covering a basic form, this subscription will be governed by the specific general conditions. The conditions of access and use of this website are strictly governed by current legislation and by the principle of good faith, the USER committing to make good use of the website. All acts that violate the legality, rights or interests of third parties are forbidden: right to privacy, data protection, intellectual property, etc. Expressly Comunes prohibits the following:
1.1.1.- Perform actions that may produce on the website or through it by any means any type of damage to the systems of Comunes or third parties.
1.1.2.- Carry out, without due authorization, any type of advertising or commercial information directly or covertly, sending mass mailings ("spamming") or sending large messages in order to block servers from the network ("mail bombing ").
1.2.- Provide false information about fires.
1.3.- Comunes may interrupt at any time access to its website if it detects a use contrary to legality, good faith or these general conditions - see clause fifth.
**SECOND.- CONTENTS**
The contents incorporated in this website have been prepared and included by:
2.1.- Comunes, using internal and external sources in such a way that Comunes is only responsible for the contents elaborated internally.
2.2.- Third parties other than, Comunes either through direct collaborations on the website or present through, comments, hyperlinks or links to other websites or news from other sites that are not common proprietors. Comunes will in no case be responsible for the contents thus introduced and does not guarantee the correct functioning of all these links or hyperlinks.
The USER who wishes to establish a hyperlink on their website to the Comunes website will not make any illegal use or contrary to the good faith of the information made available on the aforementioned website.
2.3.- Comunes reserves the right to modify at any time the existing contents on its website.
**THIRD.- COPYRIGHT AND TRADEMARK**
Comunes informs that the website fuegos.comunes.org the own contents, the programming and the design of the website is fully protected by the author's rights through the license that in each case applies and is indicated. Comunes uses external sources (such as NASA) to prepare its content on certain occasions and also establishes links or hyperlinks to articles or information from third parties, always citing the source. The legitimate owner of the copyright of this information so included may at any time request the elimination of the aforementioned references.
About NASA data: *We acknowledge the use of data and imagery from LANCE FIRMS operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ*.
**FOUR.- JURISDICTION AND APPLICABLE LAW**
These general conditions are governed by Spanish law. They are competent to resolve any dispute or conflict arising from these general conditions the Courts of Madrid expressly renouncing the USER to any other jurisdiction that may correspond.
**FIFTH**
In the event that any clause of this document is declared void, the other clauses will remain in force and will be interpreted taking into account the will of the parties and the purpose of these conditions. Comunes may not exercise any of the rights and powers conferred in this document which does not imply in any case the waiver of the same unless expressly recognized by Comunes.

View file

@ -1,14 +1,12 @@
# CONDICIONES GENERALES DE USO DE TOD@S CONTRA EL FUEGO
La Asociación Comunes (en adelante Comunes) con domicilio en Calle Duque de Alba, 13, 28012 MADRID con CIF G85860708 pone a disposición en su sitio web fuegos.comunes.org determinados contenidos de carácter informativo sobre sus actividades.
La Asociación Comunes (en adelante Comunes) con domicilio en Calle Duque de Alba, 13, 28012 Madrid, España con CIF G85860708 pone a disposición en su sitio web fuegos.comunes.org determinados contenidos de carácter informativo sobre sus actividades.
Las presentes condiciones generales rigen única y exclusivamente el uso del sitio web de Comunes por parte de los USUARIOS que accedan al mismo. Las presentes condiciones generales se le exponen al USUARIO en el sitio web fuegos.comunes.org en todas y cada una de las páginas y cada vez que un USUARIO introduce sus datos en los formularios existentes, para que las lea, las imprima, archive y acepte a través de internet, no pudiendo el USUARIO introducir sus datos efectivamente sin que se haya producido esta aceptación.
Comunes está inscrita en el Registro Nacional de Asocisaciones.: Grupo 1 / Sección 1 / Número Nacional: 594506.
Comunes está inscrita en el Registro Nacional de Asocisaciones: Grupo 1 / Sección 1 / Número Nacional: 594506.
El acceso a este sitio web de Comunes, 'Todos contra el Fuego', implica sin reservas la aceptación de las presentes condiciones generales de uso que el USUARIO afirma comprender en su totalidad. El USUARIO se compromete a no utilizar el sitio web y los servicios que se ofrecen en el mismo para la realización de actividades contrarias a la ley y a respetar en todo momento las presentes condiciones generales.
## PRIMERA.- CONDICIONES DE ACCESO Y USO
**PRIMERA.- CONDICIONES DE ACCESO Y USO**
1.1.- La utilización del sitio web de Comunes, 'Todos contra el Fuego', no conlleva la obligatoriedad de inscripción del USUARIO, salvo si este USUARIO desee utilizar los servicios de notificación de fuegos.comunes.org donde será preciso que se registre cubriendo un formulario básico, ésta suscripción se regirá por las condiciones generales específicas. Las condiciones de acceso y uso del presente sitio web se rigen estrictamente por la legalidad vigente y por el principio de buena fe comprometiéndose el USUARIO a realizar un buen uso de la web. Quedan prohibidos todos los actos que vulneren la legalidad, derechos o intereses de terceros: derecho a la intimidad, protección de datos, propiedad intelectual etc. Expresamente Comunes prohíbe los siguientes:
@ -20,27 +18,28 @@ El acceso a este sitio web de Comunes, 'Todos contra el Fuego', implica sin rese
1.3.- Comunes podrá interrumpir en cualquier momento el acceso a su sitio web si detecta un uso contrario a la legalidad, la buena fe o a las presentes condiciones generales- ver cláusula quinta.
## SEGUNDA.- CONTENIDOS
**SEGUNDA.- CONTENIDOS**
Los contenidos incorporados en este sitio web han sido elaborados e incluidos por:
2.1.- Comunes utilizando fuentes internas y externas de tal modo que Comunes únicamente se hace responsable por los contenidos elaborados de forma interna.
2.2.- Terceros ajenos a, Comunes bien mediante colaboraciones directas en el sitio web o bien presentes a través de hiperenlaces o links a otros sitios web o a noticias de otros sitios de los que no es titular Comunes. Comunes en ningún caso será responsable de los contenidos así introducidos y no garantiza el correcto funcionamiento de todos estos links o hiperenlaces.
2.2.- Terceros ajenos a, Comunes bien mediante colaboraciones directas en el sitio web o bien presentes a través de comentarios, hiperenlaces o links a otros sitios web o a noticias de otros sitios de los que no es titular Comunes. Comunes en ningún caso será responsable de los contenidos así introducidos y no garantiza el correcto funcionamiento de todos estos links o hiperenlaces.
El USUARIO que desee establecer un hiperenlace en su sitio web al sitio web de Comunes no realizará un uso ilegal o contrario a la buena fe de las informaciones puestas a disposición en el referido sitio web.
2.3.- Comunes se reserva el derecho a modificar en cualquier momento los contenidos existentes en su sitio web.
## TERCERA.- DERECHOS DE AUTOR Y MARCA
**TERCERA.- DERECHOS DE AUTOR Y MARCA**
Comunes informa que el sitio web fuegos.comunes.org los contenidos propios, la programación y el diseño del sitio web se encuentra plenamente protegido por los derechos de autor mediante la licencia que en cada caso aplique y se indique. Comunes utiliza fuentes externas (como la NASA) para la elaboración de sus contenidos en determinadas ocasiones y también establece links o hiperenlaces a artículos o informaciones de terceros citando siempre la fuente. El legítimo titular de los derechos de autor de estas informaciones así incluidas podrá solicitar en cualquier momento la eliminación de las referidas referencias.
Sobre los datos de la NASA: *We acknowledge the use of data and imagery from LANCE FIRMS operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ*.
Sobre los datos de la NASA: Reconocemos el uso de datos e imágenes de LANCE FIRMS operadas por NASA/GSFC/Earth Science Data and Information System (ESDIS) con fondos proporcionados por NASA/HQ.
## CUARTA.- JURISDICCIÓN Y LEY APLICABLE
**CUARTA.- JURISDICCIÓN Y LEY APLICABLE**
Las presentes condiciones generales se rigen por la legislación española. Son competentes para resolver toda controversia o conflicto que se derive de las presentes condiciones generales los Juzgados de Madrid renunciando expresamente el USUARIO a cualquier otro fuero que pudiera corresponderle.
## QUINTA
**QUINTA**
En caso de que cualquier cláusula del presente documento sea declarada nula, las demás cláusulas seguirán vigentes y se interpretarán teniendo en cuenta la voluntad de las partes y la finalidad misma de las presentes condiciones. Comunes podrá no ejercitar alguno de los derechos y facultades conferidos en este documento lo que no implicará en ningún caso la renuncia a los mismos salvo reconocimiento expreso por parte de Comunes.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

@ -110,5 +110,6 @@
"Suscripción añadida":
"Subscription added",
"Suscripción actualizada":
"Subscription updated"
"Subscription updated",
"Última actualización, {{when}}": "Last updated, {{when}}"
}

View file

@ -219,5 +219,10 @@
"o cualquier otra información": "o cualquier otra información",
"Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.": "Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.",
"Notificaciones": "Notificaciones",
"Recibe nuestras notificaciones de fuegos por correo o en tu navegador": "Recibe nuestras notificaciones de fuegos por correo o en tu navegador"
"Recibe nuestras notificaciones de fuegos por correo o en tu navegador": "Recibe nuestras notificaciones de fuegos por correo o en tu navegador",
"Fuego notificado por uno de nuestros usuarios/as {{when}}": "Fuego notificado por uno de nuestros usuarios/as {{when}}",
"No recibirás notificaciones de fuegos en este equipo, solo por correo": "No recibirás notificaciones de fuegos en este equipo, solo por correo",
"not-found": "Upppps: Esta página no existe",
"Más información sobre este fuego": "Más información sobre este fuego",
"Última actualización, {{when}}": "Última actualización, {{when}}"
}

View file

@ -3,7 +3,6 @@
import { chai } from 'meteor/practicalmeteor:chai';
import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires';
import Iron from 'iron';
import urlEnc from '/imports/modules/url-encode';
describe('url encoding', () => {