mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 06:43:24 +00:00
Merge branch 'develop' into ed-forge
This commit is contained in:
@@ -1,77 +0,0 @@
|
|||||||
node_modules
|
|
||||||
npm-debug.log
|
|
||||||
### Node template
|
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# TypeScript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
|
||||||
*.tgz
|
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
|
|
||||||
# parcel-bundler cache (https://parceljs.org/)
|
|
||||||
.cache
|
|
||||||
|
|
||||||
# next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# nuxt.js build output
|
|
||||||
.nuxt
|
|
||||||
|
|
||||||
# vuepress build output
|
|
||||||
.vuepress/dist
|
|
||||||
|
|
||||||
# Serverless directories
|
|
||||||
.serverless
|
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
image: docker:stable
|
|
||||||
services:
|
|
||||||
- docker:dind
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- Build image
|
|
||||||
|
|
||||||
docker build:
|
|
||||||
stage: Build image
|
|
||||||
script:
|
|
||||||
- img build --build-arg branch=$CI_COMMIT_REF_NAME -t edcd/coriolis:$CI_COMMIT_REF_NAME .
|
|
||||||
- echo "$REGISTRY_PASSWORD" | img login --username "$REGISTRY_USER" --password-stdin
|
|
||||||
- img push edcd/coriolis:$CI_COMMIT_REF_NAME
|
|
||||||
16
.travis.yml
16
.travis.yml
@@ -1,16 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
sudo: false
|
|
||||||
node_js:
|
|
||||||
- "4.8.1"
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- git clone https://github.com/EDCD/coriolis-data.git ../coriolis-data
|
|
||||||
|
|
||||||
script:
|
|
||||||
- npm run lint
|
|
||||||
- npm test
|
|
||||||
35
Dockerfile
35
Dockerfile
@@ -1,35 +0,0 @@
|
|||||||
### STAGE 1: Build ###
|
|
||||||
FROM node:9.11.1-alpine as builder
|
|
||||||
ARG branch=develop
|
|
||||||
ENV BRANCH=$branch
|
|
||||||
WORKDIR /src/app
|
|
||||||
RUN mkdir -p /src/app/coriolis
|
|
||||||
RUN mkdir -p /src/app/coriolis-data
|
|
||||||
|
|
||||||
RUN apk add --update git
|
|
||||||
|
|
||||||
COPY . /src/app/coriolis
|
|
||||||
|
|
||||||
RUN npm i -g npm
|
|
||||||
|
|
||||||
# Set up coriolis-data
|
|
||||||
WORKDIR /src/app/coriolis-data
|
|
||||||
RUN git clone https://github.com/EDCD/coriolis-data.git .
|
|
||||||
RUN git checkout ${BRANCH}
|
|
||||||
RUN npm install --no-package-lock
|
|
||||||
RUN npm start
|
|
||||||
|
|
||||||
# Set up coriolis
|
|
||||||
WORKDIR /src/app/coriolis
|
|
||||||
RUN git checkout ${BRANCH}
|
|
||||||
RUN npm install --no-package-lock
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
|
|
||||||
### STAGE 2: Production Environment ###
|
|
||||||
FROM fholzer/nginx-brotli as web
|
|
||||||
COPY nginx.conf /etc/nginx/nginx.conf
|
|
||||||
COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html
|
|
||||||
WORKDIR /usr/share/nginx/html
|
|
||||||
EXPOSE 80
|
|
||||||
CMD ["nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;"]
|
|
||||||
64
README.md
64
README.md
@@ -1,4 +1,4 @@
|
|||||||
 [](https://travis-ci.org/EDCD/coriolis) [](https://discord.gg/0uwCh6R62aPRjk9w)
|
[](https://discord.gg/0uwCh6R62aPRjk9w)
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
@@ -8,53 +8,41 @@ Coriolis was created using assets and imagery from Elite: Dangerous, with the pe
|
|||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please [submit issues](https://github.com/EDCD/coriolis/issues), or better yet [pull requests](https://github.com/EDCD/coriolis/pulls) for any corrections or additions to the database or the code.
|
- [Submit issues](https://github.com/EDCD/coriolis/issues)
|
||||||
|
- [Submit pull requests](https://github.com/EDCD/coriolis/pulls) targetting `develop` branch
|
||||||
### Translations
|
- Chat to us on [Discord](https://discord.gg/0uwCh6R62aPRjk9w)!
|
||||||
|
|
||||||
Please use the OneSky translation site to suggest new translations: http://edcd-coriolis.oneskyapp.com
|
|
||||||
These will be merged regularly by the project manager.
|
|
||||||
|
|
||||||
### Feature Requests, Suggestions & Bugs
|
|
||||||
|
|
||||||
Chat to us on [Discord](https://discord.gg/0uwCh6R62aPRjk9w)!
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
See the [Developer's Guide](https://github.com/EDCD/coriolis/wiki/Developing-for-Coriolis) in the wiki.
|
To get a local instance of coriolis running, perform the following steps in a shell:
|
||||||
|
```sh
|
||||||
|
> git clone https://github.com/EDCD/coriolis.git
|
||||||
|
> git clone https://github.com/EDCD/coriolis-data.git
|
||||||
|
> cd ./coriolis-data
|
||||||
|
> npm install
|
||||||
|
> cd ../coriolis
|
||||||
|
> npm install
|
||||||
|
> npm start
|
||||||
|
```
|
||||||
|
|
||||||
Also see [the documentation site.](https://coriolis.willb.info/)
|
You will then have a development server running on `localhost:3300`.
|
||||||
|
|
||||||
### Ship and Module Database
|
### Ship and Module Database
|
||||||
|
|
||||||
See the [Data wiki](https://github.com/cmmcleod/coriolis-data/wiki) for details on structure, etc.
|
See the [Data wiki](https://github.com/cmmcleod/coriolis-data/wiki) for details on structure, etc.
|
||||||
|
|
||||||
You can find hosted and compiled versions of these data-jsons under https://coriolis.io/data/ and https://beta.coriolis.io/data/.
|
## Deployment
|
||||||
You might want to load these as depedency instead of reyling on the npm-dependency.
|
|
||||||
|
|
||||||
## License
|
Follow the steps for [Development](#development) as above, but instead
|
||||||
|
of `npm start` you'll want to:
|
||||||
|
|
||||||
All Data and [associated JSON](https://github.com/EDCD/coriolis-data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
|
```sh
|
||||||
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
|
> npm run build
|
||||||
|
```
|
||||||
|
|
||||||
The code (Javascript, CSS, HTML, and SVG files only) specificially for Coriolis.io is released under the MIT License.
|
this will result in a `build/` directory being created containing all the necessary files.
|
||||||
|
|
||||||
Copyright (c) 2015 Coriolis.io, Colin McLeod
|
After this you need to serve the files in some manner.
|
||||||
|
Either configure your webserver to make the actual `build/` directory
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
visible on the web, or alternatively copy it to somewhere to serve it
|
||||||
of this software (Javascript, CSS, HTML, and SVG files only), and associated documentation files (the "Software"), to deal
|
from.
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
version: '2.2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
coriolis_prod:
|
|
||||||
image: edcd/coriolis:master
|
|
||||||
build:
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
args:
|
|
||||||
branch: master
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
|
||||||
networks:
|
|
||||||
- web
|
|
||||||
labels:
|
|
||||||
- "traefik.docker.network=web"
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.basic.frontend.rule=Host:coriolis.io,coriolis.edcd.io"
|
|
||||||
- "traefik.basic.port=80"
|
|
||||||
- "traefik.basic.protocol=http"
|
|
||||||
|
|
||||||
coriolis_dev:
|
|
||||||
image: edcd/coriolis:develop
|
|
||||||
build:
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
args:
|
|
||||||
branch: develop
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
|
||||||
networks:
|
|
||||||
- web
|
|
||||||
labels:
|
|
||||||
- "traefik.docker.network=web"
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.basic.frontend.rule=Host:beta.coriolis.io,beta.coriolis.edcd.io"
|
|
||||||
- "traefik.basic.port=80"
|
|
||||||
- "traefik.basic.protocol=http"
|
|
||||||
|
|
||||||
coriolis_dw2:
|
|
||||||
image: edcd/coriolis:dw2
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
|
||||||
networks:
|
|
||||||
- web
|
|
||||||
labels:
|
|
||||||
- "traefik.docker.network=web"
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.basic.frontend.rule=Host:dw2.coriolis.io"
|
|
||||||
- "traefik.basic.port=80"
|
|
||||||
- "traefik.basic.protocol=http"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
web:
|
|
||||||
external: true
|
|
||||||
96
nginx.conf
96
nginx.conf
@@ -1,96 +0,0 @@
|
|||||||
worker_processes 1;
|
|
||||||
user nobody nobody;
|
|
||||||
error_log /tmp/error.log;
|
|
||||||
pid /tmp/nginx.pid;
|
|
||||||
|
|
||||||
events {
|
|
||||||
|
|
||||||
worker_connections 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
|
|
||||||
include /etc/nginx/mime.types;
|
|
||||||
default_type application/octet-stream;
|
|
||||||
sendfile on;
|
|
||||||
client_body_temp_path /tmp/client_body;
|
|
||||||
fastcgi_temp_path /tmp/fastcgi_temp;
|
|
||||||
proxy_temp_path /tmp/proxy_temp;
|
|
||||||
scgi_temp_path /tmp/scgi_temp;
|
|
||||||
uwsgi_temp_path /tmp/uwsgi_temp;
|
|
||||||
access_log /tmp/access.log;
|
|
||||||
error_log /tmp/error.log;
|
|
||||||
|
|
||||||
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
|
|
||||||
# Enable gzip compression.
|
|
||||||
# Default: off
|
|
||||||
gzip off;
|
|
||||||
|
|
||||||
# Compression level (1-9).
|
|
||||||
# 5 is a perfect compromise between size and CPU usage, offering about
|
|
||||||
# 75% reduction for most ASCII files (almost identical to level 9).
|
|
||||||
# Default: 1
|
|
||||||
gzip_comp_level 5;
|
|
||||||
|
|
||||||
# Don't compress anything that's already small and unlikely to shrink much
|
|
||||||
# if at all (the default is 20 bytes, which is bad as that usually leads to
|
|
||||||
# larger files after gzipping).
|
|
||||||
# Default: 20
|
|
||||||
gzip_min_length 256;
|
|
||||||
|
|
||||||
# Compress data even for clients that are connecting to us via proxies,
|
|
||||||
# identified by the "Via" header (required for CloudFront).
|
|
||||||
# Default: off
|
|
||||||
gzip_proxied any;
|
|
||||||
|
|
||||||
# Tell proxies to cache both the gzipped and regular version of a resource
|
|
||||||
# whenever the client's Accept-Encoding capabilities header varies;
|
|
||||||
# Avoids the issue where a non-gzip capable client (which is extremely rare
|
|
||||||
# today) would display gibberish if their proxy gave them the gzipped version.
|
|
||||||
# Default: off
|
|
||||||
gzip_vary on;
|
|
||||||
|
|
||||||
# Compress all output labeled with one of the following MIME-types.
|
|
||||||
# text/html is always compressed by gzip module.
|
|
||||||
# Default: text/html
|
|
||||||
gzip_types *;
|
|
||||||
brotli on;
|
|
||||||
# brotli_static on;
|
|
||||||
brotli_types *;
|
|
||||||
# This should be turned on if you are going to have pre-compressed copies (.gz) of
|
|
||||||
# static files available. If not it should be left off as it will cause extra I/O
|
|
||||||
# for the check. It is best if you enable this in a location{} block for
|
|
||||||
# a specific directory, or on an individual server{} level.
|
|
||||||
# gzip_static on;
|
|
||||||
keepalive_timeout 3000;
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
listen [::]:80;
|
|
||||||
index index.html;
|
|
||||||
server_name localhost;
|
|
||||||
root /usr/share/nginx/html;
|
|
||||||
autoindex on;
|
|
||||||
|
|
||||||
location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ {
|
|
||||||
add_header Access-Control-Allow-Origin *;
|
|
||||||
add_header Access-Control-Allow-Credentials true;
|
|
||||||
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
|
|
||||||
add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
location /service-worker.js {
|
|
||||||
expires -1;
|
|
||||||
add_header Access-Control-Allow-Origin *;
|
|
||||||
add_header Access-Control-Allow-Credentials true;
|
|
||||||
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
|
|
||||||
add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.html =404;
|
|
||||||
}
|
|
||||||
location /iframe.html {
|
|
||||||
try_files $uri $uri/ /iframe.html =404;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -376,7 +376,6 @@ export default class Coriolis extends React.Component {
|
|||||||
*/
|
*/
|
||||||
render() {
|
render() {
|
||||||
let currentMenu = this.state.currentMenu;
|
let currentMenu = this.state.currentMenu;
|
||||||
|
|
||||||
return <div style={{ minHeight: '100%' }} onClick={this._closeMenu}
|
return <div style={{ minHeight: '100%' }} onClick={this._closeMenu}
|
||||||
className={this.state.noTouch ? 'no-touch' : null}
|
className={this.state.noTouch ? 'no-touch' : null}
|
||||||
>
|
>
|
||||||
@@ -389,6 +388,7 @@ export default class Coriolis extends React.Component {
|
|||||||
{this.state.modal}
|
{this.state.modal}
|
||||||
{this.state.tooltip}
|
{this.state.tooltip}
|
||||||
<footer>
|
<footer>
|
||||||
|
|
||||||
<div className="right cap">
|
<div className="right cap">
|
||||||
<a href="https://github.com/EDCD/coriolis" target="_blank" rel="noopener noreferrer"
|
<a href="https://github.com/EDCD/coriolis" target="_blank" rel="noopener noreferrer"
|
||||||
title="Coriolis Github Project">{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE}</a>
|
title="Coriolis Github Project">{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE}</a>
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ Router.go = function(path, state) {
|
|||||||
gaTrack(path);
|
gaTrack(path);
|
||||||
let ctx = new Context(path, state);
|
let ctx = new Context(path, state);
|
||||||
Router.dispatch(ctx);
|
Router.dispatch(ctx);
|
||||||
|
|
||||||
if (!ctx.unhandled) {
|
if (!ctx.unhandled) {
|
||||||
if (isStandAlone()) {
|
if (isStandAlone()) {
|
||||||
Persist.setState(ctx);
|
Persist.setState(ctx);
|
||||||
|
|||||||
@@ -160,8 +160,8 @@ export default class CostSection extends TranslatedComponent {
|
|||||||
<tr className='main'>
|
<tr className='main'>
|
||||||
<th colSpan='2' className='sortable le' onClick={() => this._sortBy('m')}>
|
<th colSpan='2' className='sortable le' onClick={() => this._sortBy('m')}>
|
||||||
{translate('module')}
|
{translate('module')}
|
||||||
{shipDiscount ? <u className='cap optional-hide' style={{ marginLeft: '0.5em' }}>{`[${translate('ship')} -${formats.pct(shipDiscount)}]`}</u> : null}
|
{shipDiscount ? <u className='cap optional-hide' style={{ marginLeft: '0.5em' }}>{`[${translate('ship')} ${formats.pct(-1 * shipDiscount)}]`}</u> : null}
|
||||||
{moduleDiscount ? <u className='cap optional-hide' style={{ marginLeft: '0.5em' }}>{`[${translate('modules')} -${formats.pct(moduleDiscount)}]`}</u> : null}
|
{moduleDiscount ? <u className='cap optional-hide' style={{ marginLeft: '0.5em' }}>{`[${translate('modules')} ${formats.pct(-1 * moduleDiscount)}]`}</u> : null}
|
||||||
</th>
|
</th>
|
||||||
<th className='sortable le' onClick={() => this._sortBy('cr')} >{translate('credits')}</th>
|
<th className='sortable le' onClick={() => this._sortBy('cr')} >{translate('credits')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import cn from 'classnames';
|
|||||||
import { Cogs, CoriolisLogo, Hammer, Help, Rocket, StatsBars } from './SvgIcons';
|
import { Cogs, CoriolisLogo, Hammer, Help, Rocket, StatsBars } from './SvgIcons';
|
||||||
import Persist from '../stores/Persist';
|
import Persist from '../stores/Persist';
|
||||||
import { toDetailedExport } from '../shipyard/Serializer';
|
import { toDetailedExport } from '../shipyard/Serializer';
|
||||||
import ModalBatchOrbis from './ModalBatchOrbis';
|
|
||||||
import ModalDeleteAll from './ModalDeleteAll';
|
import ModalDeleteAll from './ModalDeleteAll';
|
||||||
import ModalExport from './ModalExport';
|
import ModalExport from './ModalExport';
|
||||||
import ModalHelp from './ModalHelp';
|
import ModalHelp from './ModalHelp';
|
||||||
@@ -367,7 +366,10 @@ export default class Header extends TranslatedComponent {
|
|||||||
if (this.props.announcements) {
|
if (this.props.announcements) {
|
||||||
announcements = [];
|
announcements = [];
|
||||||
for (let announce of this.props.announcements) {
|
for (let announce of this.props.announcements) {
|
||||||
announcements.push(<Announcement text={announce.message} />);
|
if (announce.expiry < Date.now()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
announcements.push(<Announcement text={announce.text} />);
|
||||||
announcements.push(<hr/>);
|
announcements.push(<hr/>);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import request from 'superagent';
|
|
||||||
import TranslatedComponent from './TranslatedComponent';
|
|
||||||
import { orbisUpload } from '../utils/ShortenUrl';
|
|
||||||
import Persist from '../stores/Persist';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Permalink modal
|
|
||||||
*/
|
|
||||||
export default class ModalBatchOrbis extends TranslatedComponent {
|
|
||||||
static propTypes = {
|
|
||||||
ships: PropTypes.any.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param {Object} props React Component properties
|
|
||||||
*/
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
orbisCreds: Persist.getOrbisCreds(),
|
|
||||||
resp: ''
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send ship to Orbis.zone
|
|
||||||
* @param {SyntheticEvent} e React Event
|
|
||||||
* @return {Promise} Promise sending post request to orbis
|
|
||||||
*/
|
|
||||||
sendToOrbis(e) {
|
|
||||||
let agent;
|
|
||||||
try {
|
|
||||||
agent = request.agent(); // apparently this crashes somehow
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
if (!agent) {
|
|
||||||
agent = request;
|
|
||||||
}
|
|
||||||
const API_ORBIS = 'https://orbis.zone/api/builds/add/batch';
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
agent
|
|
||||||
.post(API_ORBIS)
|
|
||||||
.withCredentials()
|
|
||||||
.redirects(0)
|
|
||||||
.set('Content-Type', 'application/json')
|
|
||||||
.send(this.props.ships)
|
|
||||||
.end((err, response) => {
|
|
||||||
console.log(response);
|
|
||||||
if (err) {
|
|
||||||
console.error(err);
|
|
||||||
this.setState({ resp: response.text });
|
|
||||||
reject('Bad Request');
|
|
||||||
} else {
|
|
||||||
this.setState({ resp: 'All builds uploaded. Check https://orbis.zone' });
|
|
||||||
resolve('All builds uploaded. Check https://orbis.zone');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
reject(e.message ? e.message : e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the modal
|
|
||||||
* @return {React.Component} Modal Content
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
let translate = this.context.language.translate;
|
|
||||||
this.sendToOrbis = this.sendToOrbis.bind(this);
|
|
||||||
|
|
||||||
return <div className='modal' onClick={ (e) => e.stopPropagation() }>
|
|
||||||
<h2>{translate('permalink')}</h2>
|
|
||||||
<br/>
|
|
||||||
<a className='button' href="https://orbis.zone/api/auth">Log in / signup to Orbis</a>
|
|
||||||
<br/><br/>
|
|
||||||
<h3 >{translate('success')}</h3>
|
|
||||||
<input value={this.state.resp} readOnly size={25} onFocus={ (e) => e.target.select() }/>
|
|
||||||
<br/><br/>
|
|
||||||
<p>Orbis.zone is currently in a trial period, and may be wiped at any time as development progresses. Some elements are also still placeholders.</p>
|
|
||||||
<button className={'l cb dismiss cap'} disabled={!!this.state.failed} onClick={this.sendToOrbis}>{translate('PHASE_UPLOAD_ORBIS')}</button>
|
|
||||||
<button className={'r dismiss cap'} onClick={this.context.hideModal}>{translate('close')}</button>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,6 +18,7 @@ const STATE = {
|
|||||||
*/
|
*/
|
||||||
export default class ModalImport extends TranslatedComponent {
|
export default class ModalImport extends TranslatedComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
importString: PropTypes.string, // Optional: Default data for import modal
|
||||||
builds: PropTypes.object, // Optional: Import object
|
builds: PropTypes.object, // Optional: Import object
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -35,6 +36,30 @@ export default class ModalImport extends TranslatedComponent {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import SLEF formatted builds. Sets state to a map of the builds on success
|
||||||
|
* and flags if there was only a single build.
|
||||||
|
*
|
||||||
|
* @param {string} importData - Array of the list of builds.
|
||||||
|
* @throws {string} If parse / import fails
|
||||||
|
*/
|
||||||
|
_importSlefBuilds(importData) {
|
||||||
|
const builds = importData.reduce((memo, { data }) => {
|
||||||
|
const shipModel = shipModelFromJson(data);
|
||||||
|
const ship = shipFromLoadoutJSON(data);
|
||||||
|
const shipTemplate = Ships[shipModel];
|
||||||
|
const shipName = data.ShipName || shipTemplate.properties.name;
|
||||||
|
|
||||||
|
const key = `Imported ${shipName}`;
|
||||||
|
memo[shipModel] = {};
|
||||||
|
memo[shipModel][key] = ship.toString();
|
||||||
|
|
||||||
|
return memo;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
this.setState({ builds, singleBuild: Object.keys(builds).length === 1 });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate the import string / text box contents
|
* Validate the import string / text box contents
|
||||||
* @param {SyntheticEvent} event Event
|
* @param {SyntheticEvent} event Event
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import TranslatedComponent from './TranslatedComponent';
|
|
||||||
import { orbisUpload } from '../utils/ShortenUrl';
|
|
||||||
import Persist from '../stores/Persist';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Permalink modal
|
|
||||||
*/
|
|
||||||
export default class ModalOrbis extends TranslatedComponent {
|
|
||||||
static propTypes = {
|
|
||||||
ship: PropTypes.any.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param {Object} props React Component properties
|
|
||||||
*/
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
orbisCreds: Persist.getOrbisCreds(),
|
|
||||||
orbisUrl: '...',
|
|
||||||
ship: this.props.ship,
|
|
||||||
authenticatedStatus: 'Checking...'
|
|
||||||
};
|
|
||||||
this.orbisCategory = this.orbisCategory.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send ship to Orbis.zone
|
|
||||||
* @param {SyntheticEvent} e React Event
|
|
||||||
*/
|
|
||||||
sendToOrbis(e) {
|
|
||||||
const target = e.target;
|
|
||||||
target.disabled = true;
|
|
||||||
this.setState({ orbisUrl: 'Sending...' }, () => {
|
|
||||||
orbisUpload(this.props.ship, this.state.orbisCreds)
|
|
||||||
.then(orbisUrl => {
|
|
||||||
target.disabled = false;
|
|
||||||
this.setState({ orbisUrl });
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
target.disabled = false;
|
|
||||||
this.setState({ orbisUrl: 'Error - ' + err });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Orbis.zone auth status
|
|
||||||
* @returns {Object} auth status
|
|
||||||
*/
|
|
||||||
getOrbisAuthStatus() {
|
|
||||||
return fetch('https://orbis.zone/api/checkauth', {
|
|
||||||
credentials: 'include',
|
|
||||||
mode: 'cors'
|
|
||||||
})
|
|
||||||
.then(data => data.json())
|
|
||||||
.then(res => {
|
|
||||||
this.setState({ authenticatedStatus: res.status || res.error });
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
this.setState({ authenticatedStatus: err.message });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for changing cmdr name
|
|
||||||
* @param {SyntheticEvent} e React Event
|
|
||||||
*/
|
|
||||||
orbisPasswordHandler(e) {
|
|
||||||
let password = e.target.value;
|
|
||||||
this.setState({ orbisCreds: { email: this.state.orbisCreds.email, password } }, () => {
|
|
||||||
Persist.setOrbisCreds(this.state.orbisCreds);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for changing cmdr name
|
|
||||||
* @param {SyntheticEvent} e React Event
|
|
||||||
*/
|
|
||||||
orbisUsername(e) {
|
|
||||||
let orbisUsername = e.target.value;
|
|
||||||
this.setState({ orbisCreds: { email: orbisUsername, password: this.state.orbisCreds.password } }, () => {
|
|
||||||
Persist.setOrbisCreds(this.state.orbisCreds);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for changing category
|
|
||||||
* @param {SyntheticEvent} e React Event
|
|
||||||
*/
|
|
||||||
orbisCategory(e) {
|
|
||||||
let ship = this.state.ship;
|
|
||||||
let cat = e.target.value;
|
|
||||||
ship.category = cat;
|
|
||||||
this.setState({ ship });
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the modal
|
|
||||||
* @return {React.Component} Modal Content
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
let translate = this.context.language.translate;
|
|
||||||
this.orbisPasswordHandler = this.orbisPasswordHandler.bind(this);
|
|
||||||
this.orbisUsername = this.orbisUsername.bind(this);
|
|
||||||
this.sendToOrbis = this.sendToOrbis.bind(this);
|
|
||||||
this.getOrbisAuthStatus();
|
|
||||||
return <div className='modal' onClick={ (e) => e.stopPropagation() }>
|
|
||||||
<h2>{translate('upload to orbis')}</h2>
|
|
||||||
<br/>
|
|
||||||
<label>Orbis auth status: </label>
|
|
||||||
<input value={this.state.authenticatedStatus} readOnly size={25} onFocus={ (e) => e.target.select() }/>
|
|
||||||
<br/><br/>
|
|
||||||
<a className='button' href="https://orbis.zone/api/auth">Log in / signup to Orbis</a>
|
|
||||||
<br/><br/>
|
|
||||||
<h3>Category</h3>
|
|
||||||
<select onChange={this.orbisCategory}>
|
|
||||||
<option value="">No Category</option>
|
|
||||||
<option>Combat</option>
|
|
||||||
<option>Mining</option>
|
|
||||||
<option>Trading</option>
|
|
||||||
<option>Exploration</option>
|
|
||||||
<option>Passenger Liner</option>
|
|
||||||
<option>PvP</option>
|
|
||||||
</select>
|
|
||||||
<br/><br/>
|
|
||||||
<h3 >{translate('Orbis link')}</h3>
|
|
||||||
<input value={this.state.orbisUrl} readOnly size={25} onFocus={ (e) => e.target.select() }/>
|
|
||||||
<br/><br/>
|
|
||||||
<p>Orbis.zone is currently in a trial period, and may be wiped at any time as development progresses. Some elements are also still placeholders.</p>
|
|
||||||
<button className={'l cb dismiss cap'} disabled={!!this.state.failed} onClick={this.sendToOrbis}>{translate('PHASE_UPLOAD_ORBIS')}</button>
|
|
||||||
<button className={'r dismiss cap'} onClick={this.context.hideModal}>{translate('close')}</button>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -291,8 +291,8 @@ export default class Offence extends TranslatedComponent {
|
|||||||
<tr className='main'>
|
<tr className='main'>
|
||||||
<th rowSpan='2' className='sortable' onClick={sortOrder.bind(this, 'classRating')}>{translate('weapon')}</th>
|
<th rowSpan='2' className='sortable' onClick={sortOrder.bind(this, 'classRating')}>{translate('weapon')}</th>
|
||||||
<th colSpan='1'>{translate('overall')}</th>
|
<th colSpan='1'>{translate('overall')}</th>
|
||||||
<th colSpan='2'>{translate('opponent\'s shields')}</th>
|
<th colSpan='3'>{translate('opponent\'s shields')}</th>
|
||||||
<th colSpan='2'>{translate('opponent\'s armour')}</th>
|
<th colSpan='3'>{translate('opponent\'s armour')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th className='lft sortable' onMouseOver={termtip.bind(null, 'TT_EFFECTIVE_SDPS_SHIELDS')}
|
<th className='lft sortable' onMouseOver={termtip.bind(null, 'TT_EFFECTIVE_SDPS_SHIELDS')}
|
||||||
@@ -359,6 +359,7 @@ export default class Offence extends TranslatedComponent {
|
|||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -205,7 +205,7 @@
|
|||||||
"internal protection": "Internal protection",
|
"internal protection": "Internal protection",
|
||||||
"external protection": "External protection",
|
"external protection": "External protection",
|
||||||
"engagement range": "Engagement range",
|
"engagement range": "Engagement range",
|
||||||
"boost interval": "Boost intervall",
|
"boost interval": "Boost interval",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"ammo": "Ammunition maximum",
|
"ammo": "Ammunition maximum",
|
||||||
"boot": "Boot time",
|
"boot": "Boot time",
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ export const formats = {
|
|||||||
decimal: ',',
|
decimal: ',',
|
||||||
thousands: '.',
|
thousands: '.',
|
||||||
grouping: [3],
|
grouping: [3],
|
||||||
currency: ['', ' €'],
|
currency: ['$', ''],
|
||||||
dateTime: '%A, %e de %B de %Y, %X',
|
dateTime: '%A, %e de %B de %Y, %X',
|
||||||
date: '%d/%m/%Y',
|
date: '%d/%m/%Y',
|
||||||
time: '%H:%M:%S',
|
time: '%H:%M:%S',
|
||||||
periods: ['AM', 'PM'],
|
periods: ['AM', 'PM'],
|
||||||
days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
|
days: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],
|
||||||
shortDays: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],
|
shortDays: ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sab'],
|
||||||
months: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],
|
months: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],
|
||||||
shortMonths: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic']
|
shortMonths: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez']
|
||||||
};
|
};
|
||||||
|
|
||||||
export { default as terms } from './pt.json';
|
export { default as terms } from './pt.json';
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
1157
src/app/i18n/ru.json
1157
src/app/i18n/ru.json
File diff suppressed because it is too large
Load Diff
@@ -94,39 +94,6 @@ export default class AboutPage extends Page {
|
|||||||
</a>
|
</a>
|
||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Supporting Coriolis</h3>
|
|
||||||
<p>
|
|
||||||
Coriolis is an open source project, and I work on it in my free time.
|
|
||||||
I have set up a patreon at{' '}
|
|
||||||
<a href="https://www.patreon.com/coriolis_elite">
|
|
||||||
patreon.com/coriolis_elite
|
|
||||||
</a>
|
|
||||||
, which will be used to keep Coriolis up to date and the servers
|
|
||||||
running.
|
|
||||||
</p>
|
|
||||||
<form
|
|
||||||
action="https://www.paypal.com/cgi-bin/webscr"
|
|
||||||
method="post"
|
|
||||||
target="_top"
|
|
||||||
>
|
|
||||||
<input type="hidden" name="cmd" value="_s-xclick" />
|
|
||||||
<input type="hidden" name="hosted_button_id" value="SJBKT2SWEEU68" />
|
|
||||||
<input
|
|
||||||
type="image"
|
|
||||||
src="https://www.paypalobjects.com/en_AU/i/btn/btn_donate_SM.gif"
|
|
||||||
border="0"
|
|
||||||
name="submit"
|
|
||||||
alt="PayPal – The safer, easier way to pay online!"
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
alt=""
|
|
||||||
border="0"
|
|
||||||
src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif"
|
|
||||||
width="1"
|
|
||||||
height="1"
|
|
||||||
/>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import {
|
|||||||
LinkIcon,
|
LinkIcon,
|
||||||
ShoppingIcon,
|
ShoppingIcon,
|
||||||
MatIcon,
|
MatIcon,
|
||||||
OrbisIcon
|
|
||||||
} from '../components/SvgIcons';
|
} from '../components/SvgIcons';
|
||||||
import ShipSummaryTable from '../components/ShipSummaryTable';
|
import ShipSummaryTable from '../components/ShipSummaryTable';
|
||||||
import StandardSlotSection from '../components/StandardSlotSection';
|
import StandardSlotSection from '../components/StandardSlotSection';
|
||||||
@@ -26,7 +25,6 @@ import UtilitySlotSection from '../components/UtilitySlotSection';
|
|||||||
import OutfittingSubpages from '../components/OutfittingSubpages';
|
import OutfittingSubpages from '../components/OutfittingSubpages';
|
||||||
import ModalExport from '../components/ModalExport';
|
import ModalExport from '../components/ModalExport';
|
||||||
import ModalPermalink from '../components/ModalPermalink';
|
import ModalPermalink from '../components/ModalPermalink';
|
||||||
import ModalOrbis from '../components/ModalOrbis';
|
|
||||||
import autoBind from 'auto-bind';
|
import autoBind from 'auto-bind';
|
||||||
import { assign } from 'lodash';
|
import { assign } from 'lodash';
|
||||||
import EDEngineerButton from '../components/EDEngineerButton';
|
import EDEngineerButton from '../components/EDEngineerButton';
|
||||||
@@ -358,23 +356,6 @@ export default class OutfittingPage extends Page {
|
|||||||
this.context.showModal(<ModalPermalink url={window.location.href} />);
|
this.context.showModal(<ModalPermalink url={window.location.href} />);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate Orbis link
|
|
||||||
*/
|
|
||||||
_genOrbis() {
|
|
||||||
const data = {};
|
|
||||||
const ship = this.state.ship;
|
|
||||||
ship.coriolisId = ship.id;
|
|
||||||
data.coriolisShip = ship;
|
|
||||||
data.url = window.location.href;
|
|
||||||
data.title = this.state.buildName || ship.id;
|
|
||||||
data.description = this.state.buildName || ship.id;
|
|
||||||
data.ShipName = ship.id;
|
|
||||||
data.Ship = ship.id;
|
|
||||||
console.log(data);
|
|
||||||
this.context.showModal(<ModalOrbis ship={data} />);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open up a window for EDDB with a shopping list of our components
|
* Open up a window for EDDB with a shopping list of our components
|
||||||
*/
|
*/
|
||||||
@@ -579,13 +560,6 @@ export default class OutfittingPage extends Page {
|
|||||||
>
|
>
|
||||||
<LinkIcon className="lg" />
|
<LinkIcon className="lg" />
|
||||||
</button>
|
</button>
|
||||||
<button
|
|
||||||
onClick={this._genOrbis}
|
|
||||||
onMouseOver={termtip.bind(null, 'PHASE_UPLOAD_ORBIS')}
|
|
||||||
onMouseOut={hide}
|
|
||||||
>
|
|
||||||
<OrbisIcon className="lg" />
|
|
||||||
</button>
|
|
||||||
<EDEngineerButton ship={ship} />
|
<EDEngineerButton ship={ship} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -61,6 +61,14 @@ export default class Page extends React.Component {
|
|||||||
*/
|
*/
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
document.title = this.state.title || 'Coriolis';
|
document.title = this.state.title || 'Coriolis';
|
||||||
|
try {
|
||||||
|
(window.adsbygoogle = window.adsbygoogle || []).push({
|
||||||
|
google_ad_client: "ca-pub-3709458261881414",
|
||||||
|
enable_page_level_ads: true
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ const LS_KEY_STATE = 'state';
|
|||||||
const LS_KEY_SIZE_RATIO = 'sizeRatio';
|
const LS_KEY_SIZE_RATIO = 'sizeRatio';
|
||||||
const LS_KEY_TOOLTIPS = 'tooltips';
|
const LS_KEY_TOOLTIPS = 'tooltips';
|
||||||
const LS_KEY_ROLLS = 'matsPerGrade';
|
const LS_KEY_ROLLS = 'matsPerGrade';
|
||||||
const LS_KEY_ORBIS = 'orbis';
|
|
||||||
|
|
||||||
let LS;
|
let LS;
|
||||||
|
|
||||||
@@ -91,7 +90,6 @@ export class Persist extends EventEmitter {
|
|||||||
let moduleDiscount = _get(LS_KEY_MOD_DISCOUNT);
|
let moduleDiscount = _get(LS_KEY_MOD_DISCOUNT);
|
||||||
let buildJson = _get(LS_KEY_BUILDS);
|
let buildJson = _get(LS_KEY_BUILDS);
|
||||||
|
|
||||||
this.orbisCreds = _get(LS_KEY_ORBIS) || { email: '', password: '' };
|
|
||||||
this.onStorageChange = this.onStorageChange.bind(this);
|
this.onStorageChange = this.onStorageChange.bind(this);
|
||||||
this.langCode = _getString(LS_KEY_LANG) || 'en';
|
this.langCode = _getString(LS_KEY_LANG) || 'en';
|
||||||
this.insurance = insurance && Insurance[insurance.toLowerCase()] !== undefined ? insurance : 'standard';
|
this.insurance = insurance && Insurance[insurance.toLowerCase()] !== undefined ? insurance : 'standard';
|
||||||
@@ -155,10 +153,6 @@ export class Persist extends EventEmitter {
|
|||||||
this.matsPerGrade = JSON.parse(newValue);
|
this.matsPerGrade = JSON.parse(newValue);
|
||||||
this.emit('matsPerGrade', this.matsPerGrade);
|
this.emit('matsPerGrade', this.matsPerGrade);
|
||||||
break;
|
break;
|
||||||
case LS_KEY_ORBIS:
|
|
||||||
this.orbisCreds = JSON.parse(newValue);
|
|
||||||
this.emit('orbis', this.orbisCreds);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// On JSON.Parse Error - don't sync or do anything
|
// On JSON.Parse Error - don't sync or do anything
|
||||||
@@ -184,24 +178,6 @@ export class Persist extends EventEmitter {
|
|||||||
this.emit('language', langCode);
|
this.emit('language', langCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current orbis.zone credentials
|
|
||||||
* @return {String} language code
|
|
||||||
*/
|
|
||||||
getOrbisCreds() {
|
|
||||||
return this.orbisCreds;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update and save the orbis.zone credentials
|
|
||||||
* @param {Object} creds object with username and password properties.
|
|
||||||
*/
|
|
||||||
setOrbisCreds(creds) {
|
|
||||||
this.langCode = creds;
|
|
||||||
_put(LS_KEY_ORBIS, creds);
|
|
||||||
this.emit('orbis', creds);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show tooltips setting
|
* Show tooltips setting
|
||||||
* @param {boolean} show Optional - update setting
|
* @param {boolean} show Optional - update setting
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ function orbisShorten(url, success, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const API_ORBIS = 'https://orbis.zone/api/builds/add';
|
const API_ORBIS = 'https://api.orbis.zone/ships';
|
||||||
/**
|
/**
|
||||||
* Upload to Orbis
|
* Upload to Orbis
|
||||||
* @param {object} ship The URL to shorten
|
* @param {object} ship The URL to shorten
|
||||||
|
|||||||
@@ -2,19 +2,14 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Coriolis EDCD Edition</title>
|
<title>Coriolis EDCD Edition</title>
|
||||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
|
||||||
<script>
|
|
||||||
(adsbygoogle = window.adsbygoogle || []).push({
|
|
||||||
google_ad_client: "ca-pub-3709458261881414",
|
|
||||||
enable_page_level_ads: true
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="stylesheet" href="<%= htmlWebpackPlugin.files.css[0] %>">
|
<link rel="stylesheet" href="<%= htmlWebpackPlugin.files.css[0] %>">
|
||||||
<!-- Standard headers -->
|
<!-- Standard headers -->
|
||||||
<meta name="description" content="A ship builder, outfitting and comparison
|
<meta name="description" content="A ship builder, outfitting and comparison
|
||||||
tool for Elite Dangerous">
|
tool for Elite Dangerous">
|
||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0,
|
<meta name="viewport" content="width=device-width, initial-scale=1.0,
|
||||||
maximum-scale=1.0, user-scalable=0">
|
maximum-scale=1.0, user-scalable=0">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
@@ -32,7 +27,7 @@
|
|||||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||||
<meta name="msapplication-config" content="/browserconfig.xml">
|
<meta name="msapplication-config" content="/browserconfig.xml">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#000000">
|
||||||
|
<!-- <script data-ad-client="ca-pub-3709458261881414" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> -->
|
||||||
<script>
|
<script>
|
||||||
window.CORIOLIS_GAPI_KEY = '<%- htmlWebpackPlugin.options.gapiKey %>';
|
window.CORIOLIS_GAPI_KEY = '<%- htmlWebpackPlugin.options.gapiKey %>';
|
||||||
window.CORIOLIS_VERSION = '<%- htmlWebpackPlugin.options.version %>';
|
window.CORIOLIS_VERSION = '<%- htmlWebpackPlugin.options.version %>';
|
||||||
@@ -59,7 +54,8 @@
|
|||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body style="background-color:#000;">
|
<body style="background-color:#000;">
|
||||||
<section id="coriolis"></section>
|
<section id="coriolis">
|
||||||
|
|
||||||
|
</section>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
104
src/migrate.html
Normal file
104
src/migrate.html
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Coriolis EDCD Edition</title>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="stylesheet" href="<%= htmlWebpackPlugin.files.css[0] %>" />
|
||||||
|
<!-- Standard headers -->
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="A ship builder, outfitting and comparison
|
||||||
|
tool for Elite Dangerous"
|
||||||
|
/>
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1.0,
|
||||||
|
maximum-scale=1.0, user-scalable=0"
|
||||||
|
/>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<link rel="shortcut icon" href=/favicon2.ico>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
sizes="152x152 192x192"
|
||||||
|
type="image/png"
|
||||||
|
href="/192x192.png"
|
||||||
|
/>
|
||||||
|
<!-- Bugsnag -->
|
||||||
|
<script src="https://d2wy8f7a9ursnm.cloudfront.net/v5.0.0/bugsnag.min.js"></script>
|
||||||
|
<script>
|
||||||
|
window.bugsnagClient = bugsnag('ba9fae819372850fb660755341fa6ef5', {appVersion: window.BUGSNAG_VERSION || undefined})
|
||||||
|
window.Bugsnag = window.bugsnagClient
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Apple/iOS headers -->
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-title" content="Coriolis" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||||
|
|
||||||
|
<!-- Microsoft Windows Phone/Tablet headers -->
|
||||||
|
<meta name="msapplication-TileColor" content="#000000" />
|
||||||
|
<meta name="msapplication-TileImage" content="/mstile-144x144.png" />
|
||||||
|
<meta name="msapplication-config" content="/browserconfig.xml" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<body style="background-color:#000;">
|
||||||
|
<section id="coriolis">
|
||||||
|
<div class="modal">
|
||||||
|
<h2>
|
||||||
|
Please migrate to <a href="https://coriolis.io">coriolis.io</a>
|
||||||
|
</h2>
|
||||||
|
You are currently on coriolis.<strong>.edcd</strong>.io This domain is
|
||||||
|
considered deprecated. To migrate your builds, copy the below text and
|
||||||
|
go to
|
||||||
|
<a
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
href="https://coriolis.io"
|
||||||
|
>this link</a
|
||||||
|
>, press ctrl + i and then paste in the data. (If you are on mobile,
|
||||||
|
you can go to the settings and hit import)
|
||||||
|
<div>
|
||||||
|
<textarea id="data" class="cb json"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
const LS = localStorage;
|
||||||
|
/**
|
||||||
|
* Safe localstorage get string
|
||||||
|
* @param {String} key key
|
||||||
|
* @return {String} The stored string
|
||||||
|
*/
|
||||||
|
function _getString(key) {
|
||||||
|
return LS ? LS.getItem(key) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safe localstorage get
|
||||||
|
* @param {String} key key
|
||||||
|
* @return {object | number} The stored data
|
||||||
|
*/
|
||||||
|
function _get(key) {
|
||||||
|
let str = _getString(key);
|
||||||
|
try {
|
||||||
|
return str ? JSON.parse(str) : null;
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const textarea = document.querySelector("#data");
|
||||||
|
const data = {
|
||||||
|
builds: _get("builds") || {},
|
||||||
|
comparisons: _get("comparisons") || {},
|
||||||
|
insurance: _get("insurance") || "standard",
|
||||||
|
shipDiscount: _get("shipDiscount") || 0,
|
||||||
|
moduleDiscount: _get("moduleDiscount") || 0
|
||||||
|
};
|
||||||
|
textarea.textContent = JSON.stringify(data, null, 2);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user