Création initiale du projet Amber
This commit is contained in:
parent
a2c4523880
commit
6d4cadc2ae
4
.amber.yml
Normal file
4
.amber.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
type: app
|
||||||
|
database: pg
|
||||||
|
language: slang
|
||||||
|
model: granite
|
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/doc/
|
||||||
|
/lib/
|
||||||
|
/.crystal/
|
||||||
|
/.shards/
|
||||||
|
/.vscode/
|
||||||
|
/tmp/
|
||||||
|
.env
|
||||||
|
.encryption_key
|
||||||
|
production.yml
|
||||||
|
.DS_Store
|
||||||
|
/bin/
|
||||||
|
/node_modules
|
||||||
|
/public/dist
|
||||||
|
shard.lock
|
||||||
|
package-lock.json
|
12
Dockerfile
Normal file
12
Dockerfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
FROM amberframework/amber:v0.9.0
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY shard.* /app/
|
||||||
|
RUN shards install
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
RUN rm -rf /app/node_modules
|
||||||
|
|
||||||
|
CMD amber watch
|
41
README.md
41
README.md
@ -1,4 +1,41 @@
|
|||||||
# carnetdejeu
|
# carnetdejeu
|
||||||
|
|
||||||
Gérer sa collection de jeux vidéos, consoles et figurines.
|
Carnet de jeu (CDJ) est une application web permettant de gérer sa collection de jeux vidéos, consoles et figurines.
|
||||||
Et plus si affinités.
|
|
||||||
|
Site officiel : [https://carnetdejeu.fr/](https://carnetdejeu.fr/)
|
||||||
|
|
||||||
|
# Motivation
|
||||||
|
|
||||||
|
L'idée principale de ce projet est d'avoir - enfin - un site web francophone concernant sa collection de jeux vidéos.
|
||||||
|
|
||||||
|
Mais également d'avoir une alternative OpenSource au très connu Backloggery.com.
|
||||||
|
|
||||||
|
# Pré-requis
|
||||||
|
|
||||||
|
* Crystal 0.26.0
|
||||||
|
* Amber 0.9.0
|
||||||
|
* shards 0.8.1
|
||||||
|
|
||||||
|
# Installation des dépendances Crystal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
shards install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Aperçu de l'application
|
||||||
|
|
||||||
|
```
|
||||||
|
amber w
|
||||||
|
```
|
||||||
|
|
||||||
|
# Fabriqué avec
|
||||||
|
|
||||||
|
* [Amber](https://amberframework.org/) - framework pour créer des applications simples, rapides et agréables
|
||||||
|
|
||||||
|
# Contributeurs
|
||||||
|
|
||||||
|
* Olivier DOSSMANN - création initiale - [blankoworld](https://github.com/blankoworld/)
|
||||||
|
|
||||||
|
# Licence
|
||||||
|
|
||||||
|
Ce projet est délivré sous les termes de la licence EUPL 1.2. Pour plus d’informations, veuillez lire [la licence EUPL 1.2](https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12).
|
||||||
|
131
config/application.cr
Normal file
131
config/application.cr
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
require "./initializers/**"
|
||||||
|
|
||||||
|
require "amber"
|
||||||
|
|
||||||
|
require "../src/controllers/application_controller"
|
||||||
|
require "../src/controllers/**"
|
||||||
|
|
||||||
|
# About Application.cr File
|
||||||
|
#
|
||||||
|
# This is Amber application main entry point. This file is responsible for loading
|
||||||
|
# initializers, classes, and all application related code in order to have
|
||||||
|
# Amber::Server boot up.
|
||||||
|
#
|
||||||
|
# > We recommend to not modify the order of the require since the order will
|
||||||
|
# affect the behavior of the application.
|
||||||
|
#
|
||||||
|
# With `Amber::Server.configure` block you can redefine the Server configuration
|
||||||
|
# settings and use ENVIRONMENT variables and/or values evaluated at runtime.
|
||||||
|
#
|
||||||
|
# > Important! Yaml configurations are first class citizen and are loaded first before
|
||||||
|
# this file, we recommend to use yaml configurations before changing any settings here.
|
||||||
|
# Any uncommented setting here will override the YAML with the value set here.
|
||||||
|
|
||||||
|
Amber::Server.configure do |settings|
|
||||||
|
# Use your environment variables settings here.
|
||||||
|
#
|
||||||
|
# Name: A name that identifies this application. This is not internally
|
||||||
|
# used by the framework.
|
||||||
|
#
|
||||||
|
# settings.name = "Cdj Carnetdejeu web application."
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Colorize Logging: specifies whether or not to use ANSI color codes
|
||||||
|
# when logging information, display the time and/or to display the severity level.
|
||||||
|
# Defaults to true.
|
||||||
|
#
|
||||||
|
# Log Level defines the verbosity of the Amber logger. This option defaults to
|
||||||
|
# debug for all environments. The available log levels are: debug, info, warn,
|
||||||
|
# error, fatal, and unknown.
|
||||||
|
#
|
||||||
|
# settings.logging.colorize = true
|
||||||
|
# settings.logging.severity = "debug"
|
||||||
|
# settings.logging.filter = %w(password confirm_password)
|
||||||
|
# settings.logging.skip = %w()
|
||||||
|
# settings.logging.context = %w(request headers cookies session params)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Secret Key Base: is used for specifying a key which allows sessions
|
||||||
|
# for the application to be verified against a known secure key to
|
||||||
|
# prevent tampering. Applications get Amber.secret_key
|
||||||
|
# initialized to a random key present in `ENV["AMBER_SECRET_KEY"]` or
|
||||||
|
# `.amber_secret_key` in this order.
|
||||||
|
#
|
||||||
|
# settings.secret_key_base= FEHWm3Fpm7vrPejFPM9x-3PLkj7C_fho6N-nIaBa19g
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Host: is the application server host address or ip address. Useful for when
|
||||||
|
# deploying Amber to a PAAS and likely the assigned server IP is either
|
||||||
|
# known or unknown. Defaults to an environment variable HOST
|
||||||
|
#
|
||||||
|
# settings.host = ENV["HOST"] if ENV["HOST"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Port Reuse: Amber supports clustering mode which allows to spin
|
||||||
|
# multiple app instances per core. This setting allows to bind the different
|
||||||
|
# instances to the same port. Default this setting to true if the number or process
|
||||||
|
# is greater than 1.
|
||||||
|
#
|
||||||
|
# > Read more about Linux PORT REUSE https://lwn.net/Articles/542629/
|
||||||
|
#
|
||||||
|
# settings.port_reuse = true
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Process Count: This will enable Amber to be used in cluster mode,
|
||||||
|
# spinning an instance for each number of process specified here.
|
||||||
|
# Rule of thumb, always leave at least 1 core available for system processes/resources.
|
||||||
|
#
|
||||||
|
# settings.process_count = ENV["PROCESS_COUNT"].to_i if ENV["PROCESS_COUNT"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# PORT: This is the port that you're application will run on. Examples would be (80, 443, 3000, 8080)
|
||||||
|
#
|
||||||
|
settings.port = ENV["PORT"].to_i if ENV["PORT"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Redis URL: Redis is an in memory key value storage. Amber utilizes redis as
|
||||||
|
# a storing option for session information.
|
||||||
|
#
|
||||||
|
# settings.redis_url = ENV["REDIS_URL"] if ENV["REDIS_URL"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Database URL: This is the database connection string or data file url.
|
||||||
|
# The connection string contains the information to establish a connection to the
|
||||||
|
# database or the data file. Defaults to the database provider you chose at
|
||||||
|
# at app generation.
|
||||||
|
#
|
||||||
|
# settings.database_url = ENV["DATABASE_URL"] if ENV["DATABASE_URL"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SSL Key File: The private key is a text file used initially to generate a
|
||||||
|
# Certificate Signing Request (CSR), and later to secure and verify connections
|
||||||
|
# using the certificate created per that request. The private key is used to create
|
||||||
|
# a digital signature as you might imagine from the name, the private key should be
|
||||||
|
# ``closely guarded.
|
||||||
|
#
|
||||||
|
# settings.ssl_key_file = ENV["SSL_KEY_FILE"] if ENV["SSL_KEY_FILE"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SSL Cert File: This represents the signed certificate file. SSL Certificates are
|
||||||
|
# small data files that digitally bind a cryptographic key to an organization's
|
||||||
|
# details. When installed on a web server, it activates the padlock and the https
|
||||||
|
# protocol and allows secure connections from a web server to a browser.
|
||||||
|
#
|
||||||
|
# settings.ssl_cert_file = ENV["SSL_CERT_FILE"] if ENV["SSL_CERT_FILE"]?
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Session: A Hash that specifies the session storage mechanism, expiration and key to be used
|
||||||
|
# for the application. The `key` specifies the name of the cookie to be used defaults to
|
||||||
|
# "amber.session". The store can be `encrypted_cookie`, `signed_cookie` or `redis`. Expires
|
||||||
|
# when set to 0 means this is indefinitely and is expressed in seconds.
|
||||||
|
#
|
||||||
|
# settings.session = { "key" => "amber.session", "store" => "signed_cookie", "expires" => 0 }
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Logger: is the logger that Amber and other capable shards in the project will use
|
||||||
|
# instead of writing directly to STDOUT. Supply a custom logger to write to syslog, etc.
|
||||||
|
#
|
||||||
|
# settings.logger = Amber::Environment::Logger.new(File.open("cdj_carnetdejeu.log", "w"))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
end
|
BIN
config/environments/.production.enc
Normal file
BIN
config/environments/.production.enc
Normal file
Binary file not shown.
36
config/environments/development.yml
Normal file
36
config/environments/development.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
secret_key_base: cie0hbJtXS-F51akAYdEeNof67tLG4q-L5bpaLqgPTE
|
||||||
|
port: 3000
|
||||||
|
name: cdj_carnetdejeu
|
||||||
|
|
||||||
|
logging:
|
||||||
|
severity: debug
|
||||||
|
colorize: true
|
||||||
|
filter:
|
||||||
|
- password
|
||||||
|
- confirm_password
|
||||||
|
context:
|
||||||
|
- request
|
||||||
|
- session
|
||||||
|
- headers
|
||||||
|
- cookies
|
||||||
|
- params
|
||||||
|
|
||||||
|
host: 0.0.0.0
|
||||||
|
port_reuse: true
|
||||||
|
process_count: 1
|
||||||
|
# ssl_key_file:
|
||||||
|
# ssl_cert_file:
|
||||||
|
redis_url: "redis://localhost:6379"
|
||||||
|
database_url: postgres://postgres:@localhost:5432/cdj_carnetdejeu_development
|
||||||
|
|
||||||
|
session:
|
||||||
|
key: amber.session
|
||||||
|
store: signed_cookie
|
||||||
|
expires: 0
|
||||||
|
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
description: Store your development secrets credentials and settings here.
|
||||||
|
|
36
config/environments/test.yml
Normal file
36
config/environments/test.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
secret_key_base: 2jEkAoKdioIl6U1W0T-Zu2U7V5HRQ3-GpeIxOeEVjms
|
||||||
|
port: 3000
|
||||||
|
name: cdj_carnetdejeu
|
||||||
|
|
||||||
|
logging:
|
||||||
|
severity: debug
|
||||||
|
colorize: true
|
||||||
|
filter:
|
||||||
|
- password
|
||||||
|
- confirm_password
|
||||||
|
context:
|
||||||
|
- request
|
||||||
|
- session
|
||||||
|
- headers
|
||||||
|
- cookies
|
||||||
|
- params
|
||||||
|
|
||||||
|
host: 0.0.0.0
|
||||||
|
port_reuse: false
|
||||||
|
process_count: 1
|
||||||
|
# ssl_key_file:
|
||||||
|
# ssl_cert_file:
|
||||||
|
redis_url: "redis://localhost:6379"
|
||||||
|
database_url: postgres://postgres:@localhost:5432/cdj_carnetdejeu_test
|
||||||
|
|
||||||
|
session:
|
||||||
|
key: amber.session
|
||||||
|
store: signed_cookie
|
||||||
|
expires: 0
|
||||||
|
|
||||||
|
smtp:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
description: Store your development secrets credentials and settings here.
|
||||||
|
|
6
config/initializers/database.cr
Normal file
6
config/initializers/database.cr
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
require "granite/adapter/pg"
|
||||||
|
|
||||||
|
Granite::Adapters << Granite::Adapter::Pg.new({name: "pg", url: Amber.settings.database_url})
|
||||||
|
Granite.settings.logger = Amber.settings.logger.dup
|
||||||
|
Granite.settings.logger.progname = "Granite"
|
||||||
|
|
24
config/initializers/i18n.cr
Normal file
24
config/initializers/i18n.cr
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
require "citrine-i18n"
|
||||||
|
|
||||||
|
Citrine::I18n.configure do |settings|
|
||||||
|
# Backend storage (as supported by i18n.cr)
|
||||||
|
# settings.backend = I18n::Backend::Yaml.new
|
||||||
|
|
||||||
|
# Default locale (defaults to "en" and "./src/locales/**/en.yml").
|
||||||
|
# For a new default locale to be accepted, it must be found by the
|
||||||
|
# backend storage and reported in "settings.available_locales".
|
||||||
|
# settings.default_locale = "en"
|
||||||
|
|
||||||
|
# Separator between sublevels of data (defaults to '.')
|
||||||
|
# e.g. I18n.translate("some/thing") instead of "some.thing"
|
||||||
|
# settings.default_separator = '.'
|
||||||
|
|
||||||
|
# Returns the current exception handler. Defaults to an instance of
|
||||||
|
# I18n::ExceptionHandler.
|
||||||
|
# settings.exception_handler = ExceptionHandler.new
|
||||||
|
|
||||||
|
# The path from where the translations should be loaded
|
||||||
|
settings.load_path += ["./src/locales"]
|
||||||
|
end
|
||||||
|
|
||||||
|
I18n.init
|
42
config/routes.cr
Normal file
42
config/routes.cr
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
Amber::Server.configure do
|
||||||
|
pipeline :web do
|
||||||
|
# Plug is the method to use connect a pipe (middleware)
|
||||||
|
# A plug accepts an instance of HTTP::Handler
|
||||||
|
plug Amber::Pipe::PoweredByAmber.new
|
||||||
|
# plug Amber::Pipe::ClientIp.new(["X-Forwarded-For"])
|
||||||
|
plug Citrine::I18n::Handler.new
|
||||||
|
plug Amber::Pipe::Error.new
|
||||||
|
plug Amber::Pipe::Logger.new
|
||||||
|
plug Amber::Pipe::Session.new
|
||||||
|
plug Amber::Pipe::Flash.new
|
||||||
|
plug Amber::Pipe::CSRF.new
|
||||||
|
end
|
||||||
|
|
||||||
|
pipeline :api do
|
||||||
|
plug Amber::Pipe::PoweredByAmber.new
|
||||||
|
plug Amber::Pipe::Error.new
|
||||||
|
plug Amber::Pipe::Logger.new
|
||||||
|
plug Amber::Pipe::Session.new
|
||||||
|
plug Amber::Pipe::CORS.new
|
||||||
|
end
|
||||||
|
|
||||||
|
# All static content will run these transformations
|
||||||
|
pipeline :static do
|
||||||
|
plug Amber::Pipe::PoweredByAmber.new
|
||||||
|
plug Amber::Pipe::Error.new
|
||||||
|
plug Amber::Pipe::Static.new("./public")
|
||||||
|
end
|
||||||
|
|
||||||
|
routes :web do
|
||||||
|
get "/", HomeController, :index
|
||||||
|
end
|
||||||
|
|
||||||
|
routes :api do
|
||||||
|
end
|
||||||
|
|
||||||
|
routes :static do
|
||||||
|
# Each route is defined as follow
|
||||||
|
# verb resource : String, controller : Symbol, action : Symbol
|
||||||
|
get "/*", Amber::Controller::Static, :index
|
||||||
|
end
|
||||||
|
end
|
69
config/webpack/common.js
Normal file
69
config/webpack/common.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
const webpack = require('webpack');
|
||||||
|
const path = require('path');
|
||||||
|
const ExtractTextPlugin = require('extract-text-webpack-plugin');
|
||||||
|
|
||||||
|
let config = {
|
||||||
|
entry: {
|
||||||
|
'main.bundle.js': './src/assets/javascripts/main.js',
|
||||||
|
'main.bundle.css': './src/assets/stylesheets/main.scss'
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
filename: '[name]',
|
||||||
|
path: path.resolve(__dirname, '../../public/dist'),
|
||||||
|
publicPath: '/dist'
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
amber: path.resolve(__dirname, '../../lib/amber/assets/js/amber.js')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
use: ExtractTextPlugin.extract({
|
||||||
|
fallback: 'style-loader',
|
||||||
|
use: 'css-loader'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.scss$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
use: ExtractTextPlugin.extract({
|
||||||
|
fallback: 'style-loader',
|
||||||
|
use: ['css-loader', 'sass-loader']
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(png|svg|jpg|gif)$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
use: [
|
||||||
|
'file-loader?name=/images/[name].[ext]'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(woff|woff2|eot|ttf|otf)$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
use: [
|
||||||
|
'file-loader?name=/[name].[ext]'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js?$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
loader: 'babel-loader',
|
||||||
|
query: {
|
||||||
|
presets: ['env']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new ExtractTextPlugin('main.bundle.css'),
|
||||||
|
],
|
||||||
|
// For more info about webpack logs see: https://webpack.js.org/configuration/stats/
|
||||||
|
stats: 'errors-only'
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
7
config/webpack/development.js
Normal file
7
config/webpack/development.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
const webpack = require('webpack');
|
||||||
|
const merge = require('webpack-merge');
|
||||||
|
const common = require('./common.js');
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
devtool: 'inline-source-map'
|
||||||
|
});
|
11
config/webpack/production.js
Normal file
11
config/webpack/production.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
const webpack = require('webpack');
|
||||||
|
const merge = require('webpack-merge');
|
||||||
|
const common = require('./common.js');
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
plugins: [
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
compress: { warnings: false }
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
0
db/migrations/.gitkeep
Normal file
0
db/migrations/.gitkeep
Normal file
42
docker-compose.yml
Normal file
42
docker-compose.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
version: '2'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
image: cdj_carnetdejeu
|
||||||
|
command: amber watch
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgres://admin:password@db:5432/cdj_carnetdejeu_development
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
volumes:
|
||||||
|
- .:/app
|
||||||
|
- nodes:/app/node_modules
|
||||||
|
- shards:/app/lib
|
||||||
|
|
||||||
|
migrate:
|
||||||
|
build: .
|
||||||
|
image: cdj_carnetdejeu
|
||||||
|
command: bash -c 'while ! nc -q 1 db 5432 </dev/null; do sleep 1; done && amber db migrate seed'
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgres://admin:password@db:5432/cdj_carnetdejeu_development
|
||||||
|
volumes:
|
||||||
|
- .:/app
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: admin
|
||||||
|
POSTGRES_PASSWORD: password
|
||||||
|
POSTGRES_DB: cdj_carnetdejeu_development
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/postgres/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db:
|
||||||
|
nodes:
|
||||||
|
shards:
|
27
package.json
Normal file
27
package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "cdj_carnetdejeu",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Cdj Carnetdejeu with Amber",
|
||||||
|
"private": true,
|
||||||
|
"author": "Olivier DOSSMANN",
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"scripts": {
|
||||||
|
"build": "webpack --config config/webpack/development.js",
|
||||||
|
"watch": "webpack -w --config config/webpack/development.js",
|
||||||
|
"release": "webpack -p --config config/webpack/production.js",
|
||||||
|
"test": "echo \"No test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-core": "^6.26.3",
|
||||||
|
"babel-loader": "^7.1.4",
|
||||||
|
"babel-preset-env": "^1.6.1",
|
||||||
|
"css-loader": "^0.28.11",
|
||||||
|
"file-loader": "^1.1.11",
|
||||||
|
"node-sass": "^4.9.0",
|
||||||
|
"sass-loader": "^7.0.1",
|
||||||
|
"style-loader": "^0.21.0",
|
||||||
|
"webpack": "^3.12.0",
|
||||||
|
"webpack-merge": "^4.1.2",
|
||||||
|
"extract-text-webpack-plugin": "^3.0.2"
|
||||||
|
}
|
||||||
|
}
|
15
public/crossdomain.xml
Normal file
15
public/crossdomain.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
|
||||||
|
<cross-domain-policy>
|
||||||
|
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
|
||||||
|
|
||||||
|
<!-- Most restrictive policy: -->
|
||||||
|
<site-control permitted-cross-domain-policies="none"/>
|
||||||
|
|
||||||
|
<!-- Least restrictive policy: -->
|
||||||
|
<!--
|
||||||
|
<site-control permitted-cross-domain-policies="all"/>
|
||||||
|
<allow-access-from domain="*" to-ports="*" secure="false"/>
|
||||||
|
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
|
||||||
|
-->
|
||||||
|
</cross-domain-policy>
|
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
public/favicon.png
Normal file
BIN
public/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 452 B |
3
public/robots.txt
Normal file
3
public/robots.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# http://www.robotstxt.org
|
||||||
|
User-agent: *
|
||||||
|
Disallow:
|
47
shard.yml
Normal file
47
shard.yml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
name: cdj_carnetdejeu
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- Olivier DOSSMANN <git@dossmann.net>
|
||||||
|
|
||||||
|
crystal: 0.26.0
|
||||||
|
|
||||||
|
license: UNLICENSED
|
||||||
|
|
||||||
|
targets:
|
||||||
|
cdj_carnetdejeu:
|
||||||
|
main: src/cdj_carnetdejeu.cr
|
||||||
|
|
||||||
|
amber:
|
||||||
|
main: lib/amber/src/amber/cli.cr
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
amber:
|
||||||
|
github: amberframework/amber
|
||||||
|
version: 0.9.0
|
||||||
|
#branch: master
|
||||||
|
|
||||||
|
granite:
|
||||||
|
github: amberframework/granite
|
||||||
|
version: ~> 0.13.0
|
||||||
|
|
||||||
|
quartz_mailer:
|
||||||
|
github: amberframework/quartz-mailer
|
||||||
|
version: ~> 0.5.1
|
||||||
|
|
||||||
|
jasper_helpers:
|
||||||
|
github: amberframework/jasper-helpers
|
||||||
|
version: ~> 0.2.0
|
||||||
|
|
||||||
|
pg:
|
||||||
|
github: will/crystal-pg
|
||||||
|
version: ~> 0.15.0
|
||||||
|
|
||||||
|
citrine-i18n:
|
||||||
|
github: amberframework/citrine-i18n
|
||||||
|
version: 0.3.2
|
||||||
|
|
||||||
|
development_dependencies:
|
||||||
|
garnet_spec:
|
||||||
|
github: amberframework/garnet-spec
|
||||||
|
version: ~> 0.2.1
|
16
spec/spec_helper.cr
Normal file
16
spec/spec_helper.cr
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
ENV["AMBER_ENV"] ||= "test"
|
||||||
|
|
||||||
|
require "spec"
|
||||||
|
require "micrate"
|
||||||
|
require "garnet_spec"
|
||||||
|
|
||||||
|
require "../config/*"
|
||||||
|
|
||||||
|
Micrate::DB.connection_url = Amber.settings.database_url
|
||||||
|
|
||||||
|
# Automatically run migrations on the test database
|
||||||
|
Micrate::Cli.run_up
|
||||||
|
|
||||||
|
# Disable Granite logs in tests
|
||||||
|
Granite.settings.logger = Logger.new nil
|
||||||
|
|
0
src/assets/fonts/.gitkeep
Normal file
0
src/assets/fonts/.gitkeep
Normal file
0
src/assets/images/.gitkeep
Normal file
0
src/assets/images/.gitkeep
Normal file
BIN
src/assets/images/logo.png
Normal file
BIN
src/assets/images/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
23
src/assets/javascripts/main.js
Normal file
23
src/assets/javascripts/main.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Amber from 'amber'
|
||||||
|
|
||||||
|
if (!Date.prototype.toGranite) {
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
function pad(number) {
|
||||||
|
if (number < 10) {
|
||||||
|
return '0' + number;
|
||||||
|
}
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
Date.prototype.toGranite = function() {
|
||||||
|
return this.getUTCFullYear() +
|
||||||
|
'-' + pad(this.getUTCMonth() + 1) +
|
||||||
|
'-' + pad(this.getUTCDate()) +
|
||||||
|
' ' + pad(this.getUTCHours()) +
|
||||||
|
':' + pad(this.getUTCMinutes()) +
|
||||||
|
':' + pad(this.getUTCSeconds()) ;
|
||||||
|
};
|
||||||
|
|
||||||
|
}());
|
||||||
|
}
|
117
src/assets/stylesheets/main.scss
Normal file
117
src/assets/stylesheets/main.scss
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
$font-stack: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
$background-color: #f4994b;
|
||||||
|
$nav-item-color: #ffe4cd;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Globals
|
||||||
|
*/
|
||||||
|
body {
|
||||||
|
font-family: $font-stack;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, .h1,
|
||||||
|
h2, .h2,
|
||||||
|
h3, .h3,
|
||||||
|
h4, .h4,
|
||||||
|
h5, .h5,
|
||||||
|
h6, .h6 {
|
||||||
|
margin-top: 0;
|
||||||
|
font-family: $font-stack;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Override Bootstrap's default container.
|
||||||
|
*/
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.container {
|
||||||
|
width: 970px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Masthead for nav
|
||||||
|
*/
|
||||||
|
.masthead {
|
||||||
|
background-color: $background-color;
|
||||||
|
-webkit-box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);
|
||||||
|
box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nav links */
|
||||||
|
.nav-item {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: $nav-item-color;
|
||||||
|
}
|
||||||
|
.nav-item:hover,
|
||||||
|
.nav-item:focus {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Active state gets a caret at the bottom */
|
||||||
|
.nav .active {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.nav .active:after {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 50%;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
margin-left: -5px;
|
||||||
|
vertical-align: middle;
|
||||||
|
content: " ";
|
||||||
|
border-right: 5px solid transparent;
|
||||||
|
border-bottom: 5px solid;
|
||||||
|
border-left: 5px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
background-color: $background-color;
|
||||||
|
background-image: url("../images/logo.png");
|
||||||
|
background-size:contain;
|
||||||
|
width: 200px;
|
||||||
|
height:278px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide logo in small screens */
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
#logo {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table td, .table th {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
margin-top: 1em;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Navigation pulling right
|
||||||
|
.nav-item-auth {
|
||||||
|
&.nav-item-auth-signout, &.nav-item-auth-signup {
|
||||||
|
order: 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.nav-item-auth-profile, &.nav-item-auth-signin {
|
||||||
|
order: 9990;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
3
src/cdj_carnetdejeu.cr
Normal file
3
src/cdj_carnetdejeu.cr
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
require "../config/*"
|
||||||
|
|
||||||
|
Amber::Server.start
|
6
src/controllers/application_controller.cr
Normal file
6
src/controllers/application_controller.cr
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
require "jasper_helpers"
|
||||||
|
|
||||||
|
class ApplicationController < Amber::Controller::Base
|
||||||
|
include JasperHelpers
|
||||||
|
LAYOUT = "application.slang"
|
||||||
|
end
|
5
src/controllers/home_controller.cr
Normal file
5
src/controllers/home_controller.cr
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class HomeController < ApplicationController
|
||||||
|
def index
|
||||||
|
render("index.slang")
|
||||||
|
end
|
||||||
|
end
|
2
src/locales/en.yml
Normal file
2
src/locales/en.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
welcome_to_amber: "Welcome to Amber Framework!"
|
9
src/views/home/index.slang
Normal file
9
src/views/home/index.slang
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
.row
|
||||||
|
#logo
|
||||||
|
.col-sm-12.col-md-6
|
||||||
|
h2 = t "welcome_to_amber"
|
||||||
|
p Thank you for trying out the Amber Framework. We are working hard to provide a super fast and reliable framework that provides all the productivity tools you are used to without sacrificing the speed.
|
||||||
|
.list-group
|
||||||
|
a.list-group-item.list-group-item-action target="_blank" href="https://docs.amberframework.org" Getting Started with Amber Framework
|
||||||
|
a.list-group-item.list-group-item-action target="_blank" href="https://github.com/veelenga/awesome-crystal" List of Awesome Crystal projects and shards
|
||||||
|
a.list-group-item.list-group-item-action target="_blank" href="https://crystalshards.xyz" What's hot in Crystal right now
|
2
src/views/layouts/_nav.slang
Normal file
2
src/views/layouts/_nav.slang
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- active = context.request.path == "/" ? "active" : ""
|
||||||
|
a class="nav-item #{active}" href="/" Home
|
32
src/views/layouts/application.slang
Normal file
32
src/views/layouts/application.slang
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
doctype html
|
||||||
|
html
|
||||||
|
head
|
||||||
|
title Cdj Carnetdejeu using Amber
|
||||||
|
meta charset="utf-8"
|
||||||
|
meta http-equiv="X-UA-Compatible" content="IE=edge"
|
||||||
|
meta name="viewport" content="width=device-width, initial-scale=1"
|
||||||
|
link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"
|
||||||
|
link rel="stylesheet" href="/dist/main.bundle.css"
|
||||||
|
link rel="apple-touch-icon" href="/favicon.png"
|
||||||
|
link rel="icon" href="/favicon.png"
|
||||||
|
link rel="icon" type="image/x-icon" href="/favicon.ico"
|
||||||
|
|
||||||
|
body
|
||||||
|
.masthead
|
||||||
|
.container
|
||||||
|
nav.nav
|
||||||
|
== render(partial: "layouts/_nav.slang")
|
||||||
|
.container
|
||||||
|
.row
|
||||||
|
.col-sm
|
||||||
|
- flash.each do |key, value|
|
||||||
|
div class="alert alert-#{key}"
|
||||||
|
p = flash[key]
|
||||||
|
.row
|
||||||
|
.col-sm-12.main
|
||||||
|
== content
|
||||||
|
|
||||||
|
script src="https://code.jquery.com/jquery-3.3.1.min.js"
|
||||||
|
script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
|
||||||
|
script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
|
||||||
|
script src="/dist/main.bundle.js"
|
Loading…
Reference in New Issue
Block a user