Merge from booking branch

vnext
Paul Schneider 9 years ago
parent 8c5de206e1
commit 25906d0227
60 changed files with 6228 additions and 0 deletions

@ -0,0 +1,356 @@
//
// NpgsqlSkillProvider.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using Yavsc.Model.Skill;
using System.Configuration;
using System.Collections.Specialized;
using System.Collections.Generic;
using Npgsql;
using NpgsqlTypes;
namespace WorkFlowProvider
{
/// <summary>
/// Npgsql skill provider.
/// </summary>
public class NpgsqlSkillProvider : SkillProvider
{
/// <summary>
/// Initializes a new instance of the <see cref="WorkFlowProvider.NpgsqlSkillProvider"/> class.
/// </summary>
public NpgsqlSkillProvider ()
{
}
string connectionString = null;
string applicationName = null;
/// <summary>
/// Initialize this object using the specified name and config.
/// </summary>
/// <param name="name">Name.</param>
/// <param name="config">Config.</param>
public override void Initialize (string name, NameValueCollection config)
{
if (string.IsNullOrWhiteSpace (config ["connectionStringName"]))
throw new ConfigurationErrorsException ("No name for Npgsql connection string found");
connectionString = ConfigurationManager.ConnectionStrings [config ["connectionStringName"]].ConnectionString;
applicationName = config ["applicationName"] ?? "/";
}
#region implemented abstract members of SkillProvider
/// <summary>
/// Gets the user skills.
/// </summary>
/// <returns>The user skills.</returns>
/// <param name="username">Username.</param>
public override PerformerProfile GetUserSkills (string username)
{
var skills = new List <UserSkill>();
var profile = new PerformerProfile (username);
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText =
" select u._id, u.skillid, s.name, " +
" u.comment, u.rate from userskills u, " +
" skill s " +
" where u.skillid = s._id and " +
" u.username = :uname " +
" and applicationname = :app " +
" order by u.rate desc";
cmd.Parameters.AddWithValue ("uname", NpgsqlTypes.NpgsqlDbType.Varchar, username);
cmd.Parameters.AddWithValue ("app", NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
cmd.Prepare ();
using (var rdr = cmd.ExecuteReader ()) {
if (rdr.HasRows) while (rdr.Read ()) {
skills.Add (new UserSkill () {
Id = rdr.GetInt64 (0),
SkillId = rdr.GetInt64 (1),
SkillName = rdr.GetString (2),
Comment = rdr.GetString (3),
Rate = rdr.GetInt32(4)
});
}
profile.Skills = skills.ToArray ();
}
}
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText =
"select uniqueid from profiles where username = :user and applicationname = :app";
cmd.Parameters.AddWithValue ("user", NpgsqlTypes.NpgsqlDbType.Varchar, username);
cmd.Parameters.AddWithValue ("app", NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
profile.Id = (long) cmd.ExecuteScalar ();
}
cnx.Close ();
}
return profile;
}
/// <summary>
/// Create the specified skill.
/// </summary>
/// <param name="skill">skill.</param>
public override long Declare (Skill skill)
{
long res = 0;
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
if (skill.Id == 0) {
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "insert into skill (name,rate) values (:name,:rate) returning _id";
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Varchar, skill.Name);
cmd.Parameters.AddWithValue ("rate",
NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
res = (long)cmd.ExecuteScalar ();
}
} else {
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "update skill set name = :name, rate = :rate where _id = :sid";
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Bigint, skill.Id);
cmd.Parameters.AddWithValue ("rate",
NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
cmd.ExecuteNonQuery ();
}
}
cnx.Close ();
}
return res;
}
/// <summary>
/// Declares the userskill.
/// </summary>
/// <returns>The userskill.</returns>
/// <param name="userskill">userskill.</param>
public override long Declare (UserSkillDeclaration userskill)
{
long res=0;
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
if (userskill.Id == 0) {
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "insert into userskills" +
" (username, applicationname, skillid, rate, comment) " +
" values (:uname,:app,:sid,:rate,:cmnt) returning _id";
cmd.Parameters.AddWithValue ("uname",
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.UserName);
cmd.Parameters.AddWithValue ("app",
NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
cmd.Parameters.AddWithValue ("sid",
NpgsqlTypes.NpgsqlDbType.Bigint, userskill.SkillId);
cmd.Parameters.AddWithValue ("rate",
NpgsqlTypes.NpgsqlDbType.Integer, userskill.Rate);
cmd.Parameters.AddWithValue ("cmnt",
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.Comment);
userskill.Id = res = (long)cmd.ExecuteScalar ();
}
} else {
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "update userskills" +
" set rate = :rate," +
" comment = :cmnt) " +
" where _id = :usid ";
cmd.Parameters.AddWithValue ("comment",
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.Comment);
cmd.Parameters.AddWithValue ("rate",
NpgsqlTypes.NpgsqlDbType.Integer, userskill.Rate);
cmd.Parameters.AddWithValue ("usid",
NpgsqlTypes.NpgsqlDbType.Bigint, userskill.Id);
cmd.ExecuteNonQuery ();
}
}
cnx.Close ();
}
return res;
}
/// <summary>
/// Rate the specified user's skill.
/// It creates the record describing the user's skill
/// if not existent.
/// </summary>
/// <param name="userSkill">UserSkillRating.</param>
public override long Rate (UserSkillRating userSkill)
{
// TODO Use the Author value to choose
// between a self rating that goes into the `userskills` table
// and a client rating that goes into the
// `statisfaction` table.
long usid = 0;
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
if (userSkill.Id == 0) {
cmd.CommandText = "insert into userskills " +
" ( skillid, rate, username, applicationname ) " +
" values ( :sid, :rate, :uname, :app ) " +
" returning _id ";
cmd.Parameters.AddWithValue ("sid", NpgsqlDbType.Bigint, userSkill.Id);
cmd.Parameters.AddWithValue ("rate", NpgsqlDbType.Integer, userSkill.Rate);
cmd.Parameters.AddWithValue ("uname", NpgsqlDbType.Varchar, userSkill.Performer);
cmd.Parameters.AddWithValue ("app", NpgsqlDbType.Varchar, applicationName);
usid = (long) cmd.ExecuteScalar ();
} else {
cmd.CommandText = "update userskills " +
" set rate = :rate " +
" where _id = :usid ";
cmd.Parameters.AddWithValue ("rate", NpgsqlDbType.Integer, userSkill.Rate);
cmd.Parameters.AddWithValue ("usid", NpgsqlDbType.Bigint, userSkill.Id);
cmd.ExecuteNonQuery ();
}
}
cnx.Close ();
}
return usid;
}
/// <summary>
/// Rate the specified skill.
/// The access to this method
/// should be restricted to an Admin,
/// or a rating engine
/// </summary>
/// <param name="skill">Skill.</param>
public override void Rate (SkillRating skill)
{
// TODO Use the Author value to choose
// between a global setting for the application
// and an user setting on his needs
// when the `Author` value is not null,
// it's concerning a rating on a need of the Author
// if not, it's a need of the site
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "update skill set rate = :rate where _id = :sid";
cmd.Parameters.AddWithValue ("sid", NpgsqlTypes.NpgsqlDbType.Bigint, skill.Id);
cmd.Parameters.AddWithValue ("rate", NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
cmd.ExecuteNonQuery ();
}
cnx.Close ();
}
}
/// <summary>
/// Finds the skill identifier.
/// </summary>
/// <returns>The skill identifier.</returns>
/// <param name="pattern">Pattern.</param>
public override Skill[] FindSkill (string pattern)
{
List<Skill> skills = new List<Skill> ();
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = "select _id, name, rate from skill where name like :name order by rate desc";
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Varchar, pattern);
cmd.Prepare ();
using (var rdr = cmd.ExecuteReader ()) {
if (rdr.HasRows) while (rdr.Read ()) {
skills.Add (new Skill () {
Id = (long)rdr.GetInt64 (0),
Name = (string)rdr.GetString (1),
Rate = (int) rdr.GetInt32(2)
});
}
}
}
cnx.Close ();
}
return skills.ToArray ();
}
/// <summary>
/// Finds the performer.
/// </summary>
/// <returns>The performer.</returns>
/// <param name="skillIds">Skill identifiers.</param>
public override string[] FindPerformer (long[] skillIds)
{
var res = new List<string> ();
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = " select username from userskills " +
" where skillid = :sid " +
" order by rate desc ";
cmd.Parameters.AddWithValue ("sid", NpgsqlDbType.Bigint, 0);
cmd.Prepare ();
foreach ( long sid in skillIds )
{
cmd.Parameters ["sid"].Value = sid;
using (var rdr = cmd.ExecuteReader ()) {
string uname = rdr.GetString (0);
if (!res.Contains(uname))
res.Add (uname);
}
}
}
cnx.Close ();
}
return res.ToArray ();
}
/// <summary>
/// Deletes the skill.
/// </summary>
/// <param name="skillId">Skill identifier.</param>
public override void DeleteSkill (long skillId)
{
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = " delete from skill " +
" where _id = :sid ";
cmd.Parameters.AddWithValue ("sid", NpgsqlTypes.NpgsqlDbType.Bigint,skillId);
cmd.ExecuteNonQuery ();
}
cnx.Close ();
}
}
/// <summary>
/// Deletes the user skill.
/// </summary>
/// <param name="userSkillId">User skill identifier.</param>
public override void DeleteUserSkill(long userSkillId) {
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
cnx.Open ();
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
cmd.CommandText = " delete from userskills " +
" where _id = :usid ";
cmd.Parameters.AddWithValue ("usid", NpgsqlTypes.NpgsqlDbType.Bigint,userSkillId);
cmd.ExecuteNonQuery ();
}
cnx.Close ();
}
}
#endregion
}
}

@ -0,0 +1,90 @@
//
// RateControl.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Web.Mvc;
using Yavsc.Model;
namespace Yavsc
{
/// <summary>
/// Rate control.
/// </summary>
public class RateControl<TModel> : ViewUserControl<TModel> where TModel : IRating
{
/// <summary>
/// Initializes a new instance of the Yavsc.Blogs.RateControl class.
/// </summary>
public RateControl ()
{
}
/// <summary>
/// Gets or sets the rate, that is, an integer between 0 and 100
/// </summary>
/// <value>The rate.</value>
public int Rate
{
get { return (int) ViewState["rate"]; }
set {
ViewState["rate"] = value;
int rate = value;
int rounded = (rate / 10);
HasHalf = rounded % 2 == 1;
NbFilled = (int)rounded / 2;
NbEmpty = (5 - NbFilled) - ((HasHalf)?1:0) ;
}
}
/// <summary>
/// Gets the nb filed.
/// </summary>
/// <value>The nb filed.</value>
public int NbFilled {
set { ViewState["nbfilled"] = value; }
get { return (int) ViewState["nbfilled"]; }
}
/// <summary>
/// Gets the nb empty.
/// </summary>
/// <value>The nb empty.</value>
public int NbEmpty {
set { ViewState["nbempty"] = value; }
get { return (int) ViewState["nbempty"]; }
}
/// <summary>
/// Gets a value indicating whether this instance has half.
/// </summary>
/// <value><c>true</c> if this instance has half; otherwise, <c>false</c>.</value>
public bool HasHalf {
set { ViewState["hashalf"] = value; }
get { return (bool) ViewState["hashalf"]; }
}
protected override void OnInit (EventArgs e)
{
base.OnInit (e);
Rate = this.Model.Rate;
}
}
}

@ -0,0 +1,109 @@
//
// SkillController.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using Yavsc.Model.Skill;
using System.Web.Http;
using Yavsc.Model;
namespace Yavsc.ApiControllers
{
/// <summary>
/// Skill controller.
/// </summary>
public class SkillController : YavscController
{
/// <summary>
/// Create or update the specified Skill.
/// </summary>
/// <param name="s">the Skill objet.</param>
[ValidateAjaxAttribute,Authorize(Roles="Profiler")]
public long DeclareSkill (Skill s) {
if (ModelState.IsValid) {
SkillManager.DeclareSkill (s);
}
return s.Id;
}
/// <summary>
/// Declares the user's skill,
/// This call should be in charge of
/// the user himself, it's an user
/// declaration, and as a result,
/// this only is a declarative caracterisation of
/// the user's skills.
/// </summary>
/// <returns>The skill.</returns>
/// <param name="dec">Dec.</param>
[Authorize()]
public long DeclareUserSkill (UserSkillDeclaration dec) {
return SkillManager.DeclareUserSkill(dec);
}
/// <summary>
/// Rate the specified user's skill.
/// A way for an effective client to rate
/// the service or good he should have got.
/// This is the king's value
/// </summary>
/// <param name="rate">The user skill rating.</param>
[Authorize()]
public long RateUserSkill (UserSkillRating rate) {
return SkillManager.RateUserSkill(User.Identity.Name, rate);
}
/// <summary>
/// Rates the skill.
/// </summary>
/// <param name="rate">Skill rating.</param>
[Authorize()]
public void RateSkill (SkillRating rate) {
SkillManager.RateSkill(User.Identity.Name,rate);
}
/// <summary>
/// Finds the skill identifier.
/// </summary>
/// <returns>The skill identifier.</returns>
/// <param name="pattern">Pattern.</param>
public Skill [] FindSkill (string pattern){
return SkillManager.FindSkill(pattern);
}
/// <summary>
/// Finds the performer.
/// </summary>
/// <returns>The performer.</returns>
/// <param name="skillIds">Skill identifiers.</param>
public string [] FindPerformer (long []skillIds){
return SkillManager.FindPerformer(skillIds);
}
/// <summary>
/// Deletes the skill.
/// </summary>
/// <param name="skillId">Skill identifier.</param>
[Authorize(Roles="Moderator")]
public void DeleteSkill (long skillId)
{
SkillManager.DeleteSkill (skillId);
}
}
}

@ -0,0 +1,68 @@

-- Table: skill
-- DROP TABLE skill;
CREATE TABLE skill
(
_id bigserial NOT NULL,
name character varying(2024) NOT NULL,
rate integer NOT NULL DEFAULT 50,
CONSTRAINT skill_pkey PRIMARY KEY (_id),
CONSTRAINT skill_name_key UNIQUE (name)
)
WITH (
OIDS=FALSE
);
-- Table: userskills
-- DROP TABLE userskills;
CREATE TABLE userskills
(
applicationname character varying(512) NOT NULL,
username character varying(512) NOT NULL,
comment character varying,
skillid bigint NOT NULL, -- Skill identifier
rate integer NOT NULL,
_id bigserial NOT NULL, -- The id ...
CONSTRAINT userskills_pkey PRIMARY KEY (applicationname, username, skillid),
CONSTRAINT userskills_applicationname_fkey FOREIGN KEY (applicationname, username)
REFERENCES users (applicationname, username) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT userskills_skillid_fkey FOREIGN KEY (skillid)
REFERENCES skill (_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT userskills__id_key UNIQUE (_id)
)
WITH (
OIDS=FALSE
);
COMMENT ON COLUMN userskills.skillid IS 'Skill identifier';
COMMENT ON COLUMN userskills._id IS 'The id ...';
-- Table: satisfaction
-- DROP TABLE satisfaction;
CREATE TABLE satisfaction
(
_id bigserial NOT NULL,
userskillid bigint, -- the user's skill reference
rate integer, -- The satisfaction rating associated by a client to an user's skill
comnt character varying(8192), -- The satisfaction textual comment associated by a client to an user's skill, it could be formatted ala Markdown
CONSTRAINT satisfaction_pkey PRIMARY KEY (_id),
CONSTRAINT satisfaction_userskillid_fkey FOREIGN KEY (userskillid)
REFERENCES userskills (_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
WITH (
OIDS=FALSE
);
COMMENT ON COLUMN satisfaction.userskillid IS 'the user''s skill reference';
COMMENT ON COLUMN satisfaction.rate IS 'The satisfaction rating associated by a client to an user''s skill';
COMMENT ON COLUMN satisfaction.comnt IS 'The satisfaction textual comment associated by a client to an user''s skill, it could be formatted ala Markdown';

@ -0,0 +1,465 @@
body {
background-color: grey;
color: #303030;
font-family: 'Arial', cursive;
padding: 0;
margin: 0;
}
.tagname { color: #D0FFD0; }
.tagname+.tagname:before { content: ', '; }
.tagname:hover { background-color: red; cursor:pointer; }
/* Start by setting display:none to make this hidden.
Then we position it in relation to the viewport window
with position:fixed. Width, height, top and left speak
for themselves. Background we set to 80% white with
our animation centered, and no-repeating */
.modal {
display: none;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba( 255, 255, 255, .8 )
url('/App_Themes/images/FhHRx.gif')
50% 50%
no-repeat;
overflow: auto;
}
.dispmodal {
position: fixed;
z-index: 1000;
top: 0;
left: 0;
right: 0;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
}
body.loading {
overflow: hidden;
}
body.loading .modal {
display: block;
}
.iconsmall { max-height: 1.3em; max-width: 1.3em; }
input, textarea, checkbox {
color: #FFA0A0;
background-color: black;
}
.post .photo { max-width: 100%; }
.blogbanner { float: left; top:0; }
.subtitle { font-size:small; font-style: italic; }
header {
transition: margin 2s, padding 2s;
padding: 0;
margin: 0;
display: block;
background: url("/App_Themes/images/live-concert-388160_1280.jpg") 50% 0 repeat fixed;
}
#logo {
padding: 0;
margin: 0;
min-height: 12em;
background: url("/App_Themes/images/logo.s.png") 1em 1em no-repeat fixed;
}
h1, h2, h3 { background-color: rgba(256,256,256,.5); }
nav {
transition: margin 2s, padding 2s;
margin: 2em;
padding: 2em;
display: block;
border-radius:1em;
background: url("/App_Themes/images/live-concert-388160_1280.jpg") 50% 10em repeat fixed ;
justify-content: space-around;
}
nav li { display: inline-block; }
main {
transition: margin 2s, padding 2s;
margin: 2em;
padding: 2em;
display: block;
border-radius:1em;
background: url("/App_Themes/images/musician-923526_1.nbbi.jpg") 50% 20em repeat fixed ;
}
footer {
transition: margin 2s, padding 2s;
background: url("/App_Themes/images/live-concert-388160_1280.jpg") 50% 30em repeat fixed ;
margin: 0;
margin-top: 2em;
padding: 2em;
display: block;
clear: both;
font-size: smaller;
justify-content: space-around;
}
footer {
border-radius:1em;
padding:1em;
}
legend {
border-radius:5px;
padding:.5em;
background-color: rgba(240,240,240,.5);
}
#copyr { text-align: center; display: block; background-color: rgba(250,250,250,.8); }
footer p { display:inline-block; }
footer img { max-height: 3em; vertical-align: middle; }
a img, h1 img, .menuitem img { vertical-align: middle; }
#gspacer {
background-color: rgba(209,209,209,.8);
border-radius:1em;
margin:1em; padding:1em; display: inline-block }
form {
background-color: rgba(150,150,256,0.8);
}
fieldset {
background-color: rgba(216,216,256,0.8);
border-radius:5px; border: solid 1px #000060;
}
.post video, .post img {
max-width:100%;
max-height:75%;
padding: 1em;
}
aside {
display: inline-block;
float: right;
max-width: 40em;
}
.postpreview {
display: inline-block;
padding: 1em;
background-color: rgba(233,233,233,0.8);
border-radius:1em;
max-width: 100%;
}
img.postpreviewphoto, .postpreview video, .postpreview img {
padding: 1em;
width: 100%;
}
.post {
display:block;
padding: 1em;
background-color: rgba(256,256,256,0.8);
border-radius:1em;
}
.hiddenpost { background-color: rgba(160,160,160,0.5); }
.fullwidth { width: 100%; }
textarea.fullwidth { min-height:10em; }
a { color: rgb(0,56,0); }
a:hover {
background-color: rgba(160,160,160,.7);
}
footer a {
transition: margin 2s, padding 2s;
border-radius:1em;
margin:1em;
padding:1em;
text-decoration: none;
display:inline-block;
color: black;
font-weight: bold;
border: solid black 1px;
background-color: rgba(220,220,220,.8);
cursor: pointer;
font-family: 'Arial', cursive;
}
.panel { max-width: 24em; display:inline-block; padding: 1em; }
.panel,.bshpanel, aside {
background-color: rgba(200,200,200,.8);
border-radius: 1em;
padding: 1em;
}
.spanel {
max-width: 18em;
display: inline-block;
padding: .3em;
}
.xspanel {
max-width:13em;
display: inline-block;
padding:.2em;
}
.xxspanel {
max-width:7em;
display: inline-block;
padding:.1em;
}
.hint {
display: inline;
font-style: italic;
font-size: smaller;
}
.hint::before {
content: "(";
}
.hint::after {
content: ")";
}
.usertitleref {
border-radius: 1em;
background-color:rgba(256,256,212,0.6);
font-family: 'Arial', cursive;
padding: 1em;
}
label {
font-size: medium;
}
.editable {
margin: .5em;
min-height:1em;
border-radius: 1em;
border: dashed rgb(200,200,256) 2px;
}
.notification {
font-size: large;
background-color: rgba(264,264,128,0.5);
border: solid green 1px;
padding: 1em;
border-radius:1em;
margin:1em;
padding:1em;
}
.dirty {
background-color: rgba(256,228,128,0.5);
}
.error, #error {
color: #f88;
font-size: large;
background-color: rgba(256,.5);
}
.validation-summary-errors{
color: #f88;
background-color: rgba(256,256,139,0.5);
}
.hidden { display:none; }
ul.preview li:nth-child(-n+10) {
display:inline;
font-size:xx-small;
}
ul.preview li:nth-child(n) {
display:none;
}
.validation-summary-errors{
color: #f88;
}
a.menuitem {
display:inline-block;
color: black;
font-weight: bold;
border-radius:1em;
border: solid black 1px;
background-color: rgba(220,220,220,.8);
cursor: pointer;
font-family: 'Arial', cursive;
padding: 1em;
}
.actionlink {
text-decoration: none;
display:inline-block;
color: black;
font-weight: bold;
border-radius:1em;
border: solid black 1px;
background-color: rgba(220,220,220,.8);
cursor: pointer;
font-family: 'Arial', cursive;
padding: 1em;
}
input, select, textarea {
color: black;
background-color:rgba(256,256,256,0.8);
border: solid 1px rgb(128,128,128);
border-radius:1em;
font-family: 'Arial', cursive;
}
a:active {
background-color:rgba(184,180,132,0.9);
}
input:hover, textarea:hover {
color: white;
background-color:rgba(164,164,164,0.8);
}
.code {
font-family: "monospace";
background-color: rgba(230,230,230,0.5);
border-radius:25px;
white-space: pre-wrap;
}
#avatar {
float: left;
margin:1em;
}
.comment {
border-radius:25px;
font-size: smaller;
}
.onhover {
display:none;
position: absolute;
}
.ohafter:hover + .onhover, .ohinside:hover > .onhover {
display:block;
z-index:2;
padding:5px; margin:5px;
background-color: rgba(240,240,250,.8);
}
.input-validation-error { border: solid 1px red; }
.field-validation-error { color: red; }
.c2 { font-size: small; font-style: italic; }
.c3 { font-size: x-small; font-style: italic; }
header h1, .actionlink, .menuitem {transition: padding 2s; padding:1em;}
@media print {
body {background-color:white;color:black;}
.control, .actionlink, .menuitem, nav { display:none;}
}
.bshpanel { display:block; }
.bsh { display: none; }
.c3 { display:initial; }
.c3-alt { display:none; }
@media all and (max-width: 640px) {
#logo {
min-height: 6em;
background: url("/App_Themes/images/logo.xs.png") 0 0 no-repeat fixed;
}
header {
background: url("/App_Themes/images/live-concert-388160_1280.s.jpg") 50% 0 repeat fixed;
}
#avatar {
margin:.5em;
}
header h1, .actionlink, .menuitem { padding:.5em;}
nav {
margin: 1em;
padding: 1em;
background: url("/App_Themes/images/live-concert-388160_1280.s.jpg") 50% 10% repeat fixed ;
}
main {
margin: 1em;
padding: 1em;
background: url("/App_Themes/images/musician-923526_1.nbbi.xs.jpg") 50% 20em repeat fixed ;
}
footer {
background: url("/App_Themes/images/live-concert-388160_1280.s.jpg") 50% 90% repeat fixed ;
}
footer a {
border-radius:.5em;
margin:.5em;
padding:.5em;
}
.notification {
padding: .5em;
border-radius:.5em;
margin:.5em;
padding:.5em;
}
.menuitem {
display: block;
}
.post {
margin:.3em;
padding:.3em;
}
.usertitleref{
padding:.3em;
}
.bshpanel { cursor:zoom-in; }
.c2 { display:initial; }
.c2-alt { display:none; }
.c3 { display:none; }
.c3-alt { display:initial; }
#gspacer {
border-radius:.5em;
margin:.5em; padding:.5em; }
}
@media all and (max-width: 350px) {
#logo {
min-height: 3em;
background: url("/App_Themes/images/logo.xxs.png") 0 0 no-repeat fixed;
}
header {
background: url("/App_Themes/images/live-concert-388160_1280.xxs.jpg") -1em -1em repeat fixed;
}
header h1, .actionlink, .menuitem { padding:.2em;}
nav {
margin: .5em;
padding: .5em;
background: url("/App_Themes/images/live-concert-388160_1280.xxs.jpg") 50% 10% repeat fixed ;
}
main {
margin: .5em;
padding: .5em;
background: url("/App_Themes/images/musician-923526_1.nbbi.xxs.jpg") 50% 20em repeat fixed ;
}
footer {
background: url("/App_Themes/images/live-concert-388160_1280.xxs.jpg") 50% 90% repeat fixed ;
}
footer {
border-radius:.2em;
margin:.2em;
padding:.2em;
}
.c2 { display:none; }
.c2-alt { display:initial; }
#gspacer {
border-radius:.2em;
margin:.2em; padding:.2em; }
}

@ -0,0 +1,345 @@
body {
font-family: 'Arial', cursive;
padding: 0;
margin: 0;
background-color: black;
color: #D0FFD0;
}
.tagname { color: #D0FFD0; }
.tagname+.tagname:before { content: ', '; }
.tagname:hover { cursor:pointer; background-color: red; }
.rate {
border-radius:1em;
border: solid rgb(128,128,0) 1px;
background-color: rgba(20,20,20,.8);
color: yellow;
}
.rate:hover { border-color: green;
background-color:rgba(30,0,124,0.9); }
input, textarea, checkbox {
color: #FFFFA0;
background-color: black;
}
header {
transition: margin 2s, padding 2s;
padding: 0;
margin: 0;
padding-top: 2em;
padding-bottom:2em;
display: block;
background: url("/App_Themes/images/star-939235_1280.jpg") -3em -3em no-repeat fixed;
}
header h1, header a {
transition:padding 2s;
background-color: rgba(0,0,0,.5);
margin:0; padding:1em;
}
nav {
transition: margin 2s, padding 2s;
margin: 2em;
padding: 2em;
display: block;
border-radius:1em;
background: url("/App_Themes/images/helix-nebula-1400x1400.s.jpg") 50% 10% repeat fixed ;
justify-content: space-around;
}
main {
transition: margin 2s, padding 2s;
margin: 2em;
padding: 2em;
display: block;
border-radius:1em;
background: url("/App_Themes/images/p8-av4.png") 50% 20em no-repeat fixed ;
}
footer {
transition: margin 2s, padding 2s;
background: url("/App_Themes/images/helix-nebula-1400x1400.s.jpg") 50% 90% repeat fixed ;
margin: 0;
margin-top: 2em;
padding: 2em;
display: block;
clear: both;
font-size: smaller;
justify-content: space-around;
}
#copyr { text-align: center; display: block; background-color: rgba(20,20,20,.8); }
footer p { display:inline-block; }
footer img { max-height: 3em; vertical-align: middle; }
a img, h1 img, .menuitem img { vertical-align: middle; }
fieldset {
background-color: rgba(16,16,64,0.8);
border-radius:5px; border: solid 1px #000060;
}
legend {
background-color: rgba(0,0,32,.5);
}
#gspacer {
background-color: rgba(20,20,20,.8);
border-radius:1em;
margin:1em; padding:1em; display: inline-block }
main video, main img {
max-width:100%;
max-height:75%;
padding: 1em;
}
aside {
display: inline-block;
float: right;
max-width: 40em;
}
.postpreview {
display: inline-block;
max-width: 40em;
padding: 1em;
background-color: rgba(0,0,32,0.8);
border-radius:1em;
}
.postpreview video, .postpreview img {
max-width: 100%;
padding: 1em;
}
.post {
display:block;
padding: 1em;
background-color: rgba(0,0,32,0.8);
color: #eee;
border-radius:1em;
}
.hiddenpost { background-color: rgba(16,16,16,0.5); }
.fullwidth { width: 100%; }
textarea.fullwidth { min-height:10em; }
.thanks {
max-width: 10%;
text-align: center;
font-size:smaller;
display:inline;
bottom:0;
}
.panel {
display:inline-block;
}
.panel,.bshpanel, aside {
background-color: rgba(20,20,20,.8);
border-radius: 1em;
padding: 1em;
}
.spanel {
max-width: 18em;
display: inline-block;
padding: .3em;
}
.xspanel {
max-width:13em;
display: inline-block;
padding:.2em;
}
.xxspanel {
max-width:7em;
display: inline-block;
padding:.1em;
}
.hint {
display: inline;
font-style: italic;
font-size: smaller;
}
.hint::before {
content: "(";
}
.hint::after {
content: ")";
}
.usertitleref {
border-radius: 1em;
background-color:rgba(0,0,32,0.6);
font-family: 'Arial', cursive;
padding: 1em;
}
label {
font-size: medium;
}
.editable {
margin: .5em;
min-height:1em;
border-radius: 1em;
border: dashed rgb(020,20,256) 2px;
}
.notification {
font-size: large;
background-color: rgba(64,64,0,0.5);
border: solid green 1px;
padding: 1em;
border-radius:1em;
margin:1em;
padding:1em;
}
.dirty {
background-color: rgba(128,128,0,0.5);
}
.error, #error {
color: #f88;
font-size: large;
background-color: rgba(256,0,0,0.5);
}
.validation-summary-errors{
color: #f88;
background-color: rgba(256,0,0,0.5);
}
.hidden { display:none; }
ul.preview li:nth-child(-n+10) {
display:inline;
font-size:xx-small;
}
ul.preview li:nth-child(n) {
display:none;
}
.validation-summary-errors{
color: #f88;
}
a {
text-decoration: none;
}
.actionlink, .menuitem, a {
border-color: rgb(128,128,0);
background-color: rgba(20,20,20,.8);
color: yellow;
}
input, select, textarea {
color: white;
background-color:rgba(0,0,64,0.8);
border-color: rgb(128,128,128);
}
a:hover {
background-color:rgba(30,0,124,0.9);
border-color: green ;
}
a:active {
background-color:rgba(124,0,32,0.9);
}
input:hover, textarea:hover {
color: white;
background-color:rgba(64,64,64,0.8);
}
.code {
background-color: rgba(0,0,256,0.1);
}
@media all and (max-width: 640px) {
header {
padding-top:1em;
padding-bottom:1em;
background: url("/App_Themes/images/star-939235_1280.s.jpg") 0 0 no-repeat fixed;
}
#avatar {
margin:.5em;
}
header h1, header a , .actionlink, .menuitem, a { padding:.5em;}
nav {
margin: 1em;
padding: 1em;
background: url("/App_Themes/images/helix-nebula-1400x1400.s.jpg") 50% 10% repeat fixed ;
}
main {
margin: 1em;
padding: 1em;
background: url("/App_Themes/images/p8-av4.s.jpg") 50% 20em no-repeat fixed ;
}
footer {
background: url("/App_Themes/images/helix-nebula-1400x1400.s.jpg") 50% 90% repeat fixed ;
}
footer a {
border-radius:.5em;
margin:.5em;
padding:.5em;
}
.notification {
padding: .5em;
border-radius:.5em;
margin:.5em;
padding:.5em;
}
.menuitem {
display: block;
}
.post {
margin:.3em;
padding:.3em;
}
.usertitleref{
padding:.3em;
}
.bshpanel { cursor:zoom-in; }
.c2 { display:initial; }
.c2-alt { display:none; }
.c3 { display:none; }
.c3-alt { display:initial; }
}
@media all and (max-width: 350px) {
header {
padding-top:.5em;
padding-bottom:.5em;
background: url("/App_Themes/images/star-939235_1280.xxs.jpg") 0 0 no-repeat fixed;
}
header h1, header a { padding:.2em;}
nav {
margin: .5em;
padding: .5em;
background: url("/App_Themes/images/helix-nebula-1400x1400.xxs.jpg") 50% 10% repeat fixed ;
}
main {
margin: .5em;
padding: .5em;
background: url("/App_Themes/images/p8-av4.xxs.jpg") 50% 20em repeat fixed ;
}
footer {
background: url("/App_Themes/images/helix-nebula-1400x1400.xxs.jpg") 50% 10% repeat fixed ;
}
footer a {
border-radius:.2em;
margin:.2em;
padding:.2em;
}
.c2 { display:none; }
.c2-alt { display:initial; }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@ -0,0 +1,58 @@
//
// AuthorizeAttribute.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc
{
/// <summary>
/// Authorize attribute.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute: System.Web.Mvc.AuthorizeAttribute
{
/// <summary>
/// Handles the unauthorized request.
/// </summary>
/// <param name="filterContext">Filter context.</param>
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
if (string.IsNullOrWhiteSpace (Users) && !string.IsNullOrEmpty (Roles))
{
// let the client know which role were allowed here
// filterContext.ActionDescriptor.ControllerDescriptor.
filterContext.Result = new System.Web.Mvc.RedirectResult ("~/Home/RestrictedArea");
filterContext.Controller.ViewData ["ActionName"] = filterContext.ActionDescriptor.ActionName;
filterContext.Controller.ViewData ["ControllerName"] = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
filterContext.Controller.ViewData ["Roles"] = Roles;
filterContext.Controller.ViewData ["Users"] = Users;
}
else filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
}

@ -0,0 +1,98 @@
//
// GoogleHelpers.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using Yavsc.Model.Google;
using System.Web.Profile;
using System.Configuration;
using System.Web;
namespace Yavsc.Helpers.Google
{
/// <summary>
/// Google helpers.
/// </summary>
public static class GoogleHelpers
{
/// <summary>
/// Gets the events.
/// </summary>
/// <returns>The events.</returns>
/// <param name="profile">Profile.</param>
/// <param name="mindate">Mindate.</param>
/// <param name="maxdate">Maxdate.</param>
public static CalendarEventList GetEvents(this ProfileBase profile, DateTime mindate, DateTime maxdate)
{
string gcalid = (string) profile.GetPropertyValue ("gcalid");
if (string.IsNullOrWhiteSpace (gcalid))
throw new ArgumentException ("NULL gcalid");
CalendarApi c = new CalendarApi (clientApiKey);
string creds = OAuth2.GetFreshGoogleCredential (profile);
return c.GetCalendar (gcalid, mindate, maxdate, creds);
}
/// <summary>
/// Gets the calendars.
/// </summary>
/// <returns>The calendars.</returns>
/// <param name="profile">Profile.</param>
public static CalendarList GetCalendars (this ProfileBase profile)
{
string cred = OAuth2.GetFreshGoogleCredential (profile);
CalendarApi c = new CalendarApi (clientApiKey);
return c.GetCalendars (cred);
}
private static string clientId = ConfigurationManager.AppSettings ["GOOGLE_CLIENT_ID"];
private static string clientSecret = ConfigurationManager.AppSettings ["GOOGLE_CLIENT_SECRET"];
private static string clientApiKey = ConfigurationManager.AppSettings ["GOOGLE_API_KEY"];
/// <summary>
/// Login the specified response, state and callBack.
/// </summary>
/// <param name="response">Response.</param>
/// <param name="state">State.</param>
/// <param name="callBack">Call back.</param>
public static void Login(this HttpResponseBase response, string state, string callBack)
{
OAuth2 oa = new OAuth2 (callBack, clientId,clientSecret);
oa.Login (response, state);
}
/// <summary>
/// Cals the login.
/// </summary>
/// <param name="response">Response.</param>
/// <param name="state">State.</param>
/// <param name="callBack">Call back.</param>
public static void CalLogin(this HttpResponseBase response, string state, string callBack)
{
OAuth2 oa = new OAuth2 (callBack,clientId,clientSecret);
oa.GetCalendarScope (response, state);
}
/// <summary>
/// Creates the O auth2.
/// </summary>
/// <returns>The O auth2.</returns>
/// <param name="callBack">Call back.</param>
public static OAuth2 CreateOAuth2(string callBack)
{
return new OAuth2 (callBack,clientId,clientSecret);
}
}
}

@ -0,0 +1,189 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*!
** Unobtrusive Ajax support library for jQuery
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global window: false, jQuery: false */
(function ($) {
var data_click = "unobtrusiveAjaxClick",
data_target = "unobtrusiveAjaxClickTarget",
data_validation = "unobtrusiveValidation";
function getFunction(code, argNames) {
var fn = window, parts = (code || "").split(".");
while (fn && parts.length) {
fn = fn[parts.shift()];
}
if (typeof (fn) === "function") {
return fn;
}
argNames.push(code);
return Function.constructor.apply(null, argNames);
}
function isMethodProxySafe(method) {
return method === "GET" || method === "POST";
}
function asyncOnBeforeSend(xhr, method) {
if (!isMethodProxySafe(method)) {
xhr.setRequestHeader("X-HTTP-Method-Override", method);
}
}
function asyncOnSuccess(element, data, contentType) {
var mode;
if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
return;
}
mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
$(element.getAttribute("data-ajax-update")).each(function (i, update) {
var top;
switch (mode) {
case "BEFORE":
top = update.firstChild;
$("<div />").html(data).contents().each(function () {
update.insertBefore(this, top);
});
break;
case "AFTER":
$("<div />").html(data).contents().each(function () {
update.appendChild(this);
});
break;
case "REPLACE-WITH":
$(update).replaceWith(data);
break;
default:
$(update).html(data);
break;
}
});
}
function asyncRequest(element, options) {
var confirm, loading, method, duration;
confirm = element.getAttribute("data-ajax-confirm");
if (confirm && !window.confirm(confirm)) {
return;
}
loading = $(element.getAttribute("data-ajax-loading"));
duration = parseInt(element.getAttribute("data-ajax-loading-duration"), 10) || 0;
$.extend(options, {
type: element.getAttribute("data-ajax-method") || undefined,
url: element.getAttribute("data-ajax-url") || undefined,
cache: !!element.getAttribute("data-ajax-cache"),
beforeSend: function (xhr) {
var result;
asyncOnBeforeSend(xhr, method);
result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);
if (result !== false) {
loading.show(duration);
}
return result;
},
complete: function () {
loading.hide(duration);
getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);
},
success: function (data, status, xhr) {
asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(element, arguments);
},
error: function () {
getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"]).apply(element, arguments);
}
});
options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
method = options.type.toUpperCase();
if (!isMethodProxySafe(method)) {
options.type = "POST";
options.data.push({ name: "X-HTTP-Method-Override", value: method });
}
$.ajax(options);
}
function validate(form) {
var validationInfo = $(form).data(data_validation);
return !validationInfo || !validationInfo.validate || validationInfo.validate();
}
$(document).on("click", "a[data-ajax=true]", function (evt) {
evt.preventDefault();
asyncRequest(this, {
url: this.href,
type: "GET",
data: []
});
});
$(document).on("click", "form[data-ajax=true] input[type=image]", function (evt) {
var name = evt.target.name,
target = $(evt.target),
form = $(target.parents("form")[0]),
offset = target.offset();
form.data(data_click, [
{ name: name + ".x", value: Math.round(evt.pageX - offset.left) },
{ name: name + ".y", value: Math.round(evt.pageY - offset.top) }
]);
setTimeout(function () {
form.removeData(data_click);
}, 0);
});
$(document).on("click", "form[data-ajax=true] :submit", function (evt) {
var name = evt.currentTarget.name,
target = $(evt.target),
form = $(target.parents("form")[0]);
form.data(data_click, name ? [{ name: name, value: evt.currentTarget.value }] : []);
form.data(data_target, target);
setTimeout(function () {
form.removeData(data_click);
form.removeData(data_target);
}, 0);
});
$(document).on("submit", "form[data-ajax=true]", function (evt) {
var clickInfo = $(this).data(data_click) || [],
clickTarget = $(this).data(data_target),
isCancel = clickTarget && clickTarget.hasClass("cancel");
evt.preventDefault();
if (!isCancel && !validate(this)) {
return;
}
asyncRequest(this, {
url: this.action,
type: this.method || "GET",
data: clickInfo.concat($(this).serializeArray())
});
});
}(jQuery));

@ -0,0 +1,19 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*
** Unobtrusive Ajax support library for jQuery
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
(function(a){var b="unobtrusiveAjaxClick",d="unobtrusiveAjaxClickTarget",h="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function e(a){return a==="GET"||a==="POST"}function g(b,a){!e(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function i(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(f,c){var e;switch(d){case"BEFORE":e=c.firstChild;a("<div />").html(b).contents().each(function(){c.insertBefore(this,e)});break;case"AFTER":a("<div />").html(b).contents().each(function(){c.appendChild(this)});break;case"REPLACE-WITH":a(c).replaceWith(b);break;default:a(c).html(b)}})}function f(b,d){var j,k,f,h;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));h=parseInt(b.getAttribute("data-ajax-loading-duration"),10)||0;a.extend(d,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,cache:!!b.getAttribute("data-ajax-cache"),beforeSend:function(d){var a;g(d,f);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(b,arguments);a!==false&&k.show(h);return a},complete:function(){k.hide(h);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(b,arguments)},success:function(a,e,d){i(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(b,arguments)},error:function(){c(b.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(b,arguments)}});d.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});f=d.type.toUpperCase();if(!e(f)){d.type="POST";d.data.push({name:"X-HTTP-Method-Override",value:f})}a.ajax(d)}function j(c){var b=a(c).data(h);return!b||!b.validate||b.validate()}a(document).on("click","a[data-ajax=true]",function(a){a.preventDefault();f(this,{url:this.href,type:"GET",data:[]})});a(document).on("click","form[data-ajax=true] input[type=image]",function(c){var g=c.target.name,e=a(c.target),f=a(e.parents("form")[0]),d=e.offset();f.data(b,[{name:g+".x",value:Math.round(c.pageX-d.left)},{name:g+".y",value:Math.round(c.pageY-d.top)}]);setTimeout(function(){f.removeData(b)},0)});a(document).on("click","form[data-ajax=true] :submit",function(e){var g=e.currentTarget.name,f=a(e.target),c=a(f.parents("form")[0]);c.data(b,g?[{name:g,value:e.currentTarget.value}]:[]);c.data(d,f);setTimeout(function(){c.removeData(b);c.removeData(d)},0)});a(document).on("submit","form[data-ajax=true]",function(h){var e=a(this).data(b)||[],c=a(this).data(d),g=c&&c.hasClass("cancel");h.preventDefault();if(!g&&!j(this))return;f(this,{url:this.action,type:this.method||"GET",data:e.concat(a(this).serializeArray())})})})(jQuery);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,429 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*!
** Unobtrusive validation support library for jQuery and jQuery Validate
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
function setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if (options.message) {
options.messages[ruleName] = options.message;
}
}
function splitAndTrim(value) {
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
}
function escapeAttributeValue(value) {
// As mentioned on http://api.jquery.com/category/selectors/
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
}
function getModelPrefix(fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
}
function appendModelPrefix(value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
function onErrors(event, validator) { // 'this' is the form element
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
if (container) {
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container.empty();
}
}
}
function onReset(event) { // 'this' is the form element
var $form = $(this),
key = '__jquery_unobtrusive_validation_form_reset';
if ($form.data(key)) {
return;
}
// Set a flag that indicates we're currently resetting the form.
$form.data(key, true);
try {
$form.data("validator").resetForm();
} finally {
$form.removeData(key);
}
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
}
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
}
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement: function (element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var $element = $(element),
form = $element.parents("form")[0],
valInfo, rules, messages;
if (!form) { // Cannot do client-side validation without a form
return;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
message = $element.attr(prefix),
paramValues = {};
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
prefix += "-";
$.each(this.params, function () {
paramValues[this] = $element.attr(prefix + this);
});
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
$.extend(rules, { "__dummy__": true });
if (!skipAttach) {
valInfo.attachValidation();
}
},
parse: function (selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
.addBack()
.filter("form")
.add($selector.find("form"))
.has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add = function (adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if (!fn) { // Called with no params, just a function
fn = params;
params = [];
}
this.push({ name: adapterName, params: params, adapt: fn });
return this;
};
adapters.addBool = function (adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, function (options) {
setValidationValues(options, ruleName || adapterName, true);
});
};
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
var min = options.params.min,
max = options.params.max;
if (min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else if (min) {
setValidationValues(options, minRuleName, min);
}
else if (max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [attribute || "val"], function (options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod("__dummy__", function (value, element, params) {
return true;
});
$jQval.addMethod("regex", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
var match;
if (nonalphamin) {
match = value.match(/\W/g);
match = match && match.length >= nonalphamin;
}
return match;
});
if ($jQval.methods.extension) {
adapters.addSingleVal("accept", "mimtype");
adapters.addSingleVal("extension", "extension");
} else {
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
// validating the extension, and ignore mime-type validations as they are not supported.
adapters.addSingleVal("extension", "extension", "accept");
}
adapters.addSingleVal("regex", "pattern");
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
setValidationValues(options, "equalTo", element);
});
adapters.add("required", function (options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
setValidationValues(options, "required", true);
}
});
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] = function () {
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
// For checkboxes and radio buttons, only pick up values from checked fields.
if (field.is(":checkbox")) {
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
}
else if (field.is(":radio")) {
return field.filter(":checked").val() || '';
}
return field.val();
};
});
setValidationValues(options, "remote", value);
});
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
if (options.params.min) {
setValidationValues(options, "minlength", options.params.min);
}
if (options.params.nonalphamin) {
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
}
if (options.params.regex) {
setValidationValues(options, "regex", options.params.regex);
}
});
$(function () {
$jQval.unobtrusive.parse(document);
});
}(jQuery));

File diff suppressed because one or more lines are too long

@ -0,0 +1,57 @@
(function() {
(function(jQuery) {
return jQuery.widget('Yavsc.rate', {
options: {
target: null,
disabled: false
},
sendRate: function (rating,callback) {
Yavsc.ajax(this.options.target+'/Rate', rating, callback);
},
_create: function() {
var $ratectl = $(this.element);
var _this = this;
$ratectl.onChanged = function (newrate) {
// build the five stars
_this.updateRate($ratectl,newrate);
};
var id = $ratectl.data('id');
$ratectl.addClass('rate');
$ratectl.click(function (e) {
var oset = $ratectl.offset();
var x = ((e.pageX - oset.left) * 100 ) / $ratectl.width();
// here, x may be greater than 100, or lower than 0 here,
// depending on padding & mergin on the $ratectl node,
// when it's a span, and there is a line return within,
// the values on second star line are false.
// time to sanitize
x = Math.ceil(x);
if (x<0) x = 0;
if (x>100) x = 100;
var data = { Id: id, Rate: x };
_this.sendRate(data, function () {
$ratectl.onChanged(x); });
});
},
updateRate: function (ctl,rate) {
var rounded = Math.round(rate / 10);
var HasHalf = (rounded % 2 == 1);
var NbFilled = Math.floor(rounded / 2);
var NbEmpty = (5 - NbFilled) - ((HasHalf)?1:0) ;
ctl.empty();
var i=0;
for (i=0; i<NbFilled; i++)
ctl.append('<i class="fa fa-star"></i>');
if (HasHalf)
ctl.append('<i class="fa fa-star-half-o"></i>');
for (var j=0; j<NbEmpty; j++, i++ )
ctl.append('<i class="fa fa-star-o"></i>');
},
})})(jQuery);
}).call(this);
$(document).ready(function(){
$('[data-type="rate-skill"]').rate({target: 'Skill/RateSkill'});
$('[data-type="rate-user-skill"]').rate({target: 'Skill/RateUserSkill'});
$('[data-type="rate-bill"]').rate({target: 'Blogs/Rate'});
});

@ -0,0 +1,20 @@

var Skills = (function(){
var self = {};
self.updateSkill = function () { } ;
self.createSkill = function (skillname,callback) {
var skill = { name: skillname } ;
console.log('creating the skill : '+skill.name+' ... ');
Yavsc.ajax('Skill/DeclareSkill',skill,callback);
};
self.deleteSkill = function (sid,callback) {
Yavsc.ajax('Skill/DeleteSkill',sid,callback);
};
self.declareUserSkill = function (usersdec,callback) {
console.log("creating the user's skill [ "+usersdec.skillid +', '+usersdec.comment+' ] ... ');
Yavsc.ajax('Skill/DeclareUserSkill',usersdec,callback);
};
return self;
})();

@ -0,0 +1,29 @@
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.ValidationSummary() %>
<% using(Html.BeginForm("AddUserToRole", "Admin"))
{ %>
<fieldset>
<div id="roleaddedresult"></div>
<% if (ViewData ["UserName"] != null) { %>
<%= Html.Hidden("RoleName",ViewData ["RoleName"]) %>
<% } else { %>
<div>
<label for="UserName" >Utilisateur : </label><input type="text" name="UserName" id="UserName">
<%= Html.ValidationMessage("UserName", "*") %>
</div>
<% } %>
<% if (ViewData ["RoleName"] != null) { %>
<%= Html.Hidden("RoleName",ViewData ["RoleName"]) %>
<% } else { %>
<div>
<label for="RoleName" >Nom du rôle : </label>
<input type="text" name="RoleName" id="RoleName">
<%= Html.ValidationMessage("RoleName", "*") %>
</div>
<% } %>
<%= Html.Hidden("ReturnUrl", Request.Url.PathAndQuery ) %>
<input type="submit">
</fieldset>
<% } %>

@ -0,0 +1,3 @@
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

@ -0,0 +1,6 @@
<%@ Control Language="C#" Inherits="Yavsc.RateControl<IRating>" %>
<div data-id="<%=Model.Id%>" data-type="rate-bill" ><% int i = 0; for (; i<NbFilled; i++) {
%><i class="fa fa-star" ></i><% }
%><% if (HasHalf) { %><i class="fa fa-star-half-o"></i><% i++; }
%><% for (int j=0; j<NbEmpty; j++, i++ ) { %><i class="fa fa-star-o"></i><% }
%></div>

@ -0,0 +1,6 @@
<%@ Control Language="C#" Inherits="Yavsc.RateControl<IRating>" %>
<div data-id="<%=Model.Id%>" data-type="rate-bill" ><% int i = 0; for (; i<NbFilled; i++) {
%><i class="fa fa-star" ></i><% }
%><% if (HasHalf) { %><i class="fa fa-star-half-o"></i><% i++; }
%><% for (int j=0; j<NbEmpty; j++, i++ ) { %><i class="fa fa-star-o"></i><% }
%></div>

@ -0,0 +1,7 @@
<%@ Control Language="C#" Inherits="Yavsc.RateControl<IRating>" %>
<% Rate = Model.Rate; %>
<div data-id="<%=Model.Id%>" data-type="rate-skill" ><% int i = 0; for (; i<NbFilled; i++) {
%><i class="fa fa-star" ></i><% }
%><% if (HasHalf) { %><i class="fa fa-star-half-o"></i><% i++; }
%><% for (int j=0; j<NbEmpty; j++, i++ ) { %><i class="fa fa-star-o"></i><% }
%></div>

@ -0,0 +1,7 @@
<%@ Control Language="C#" Inherits="Yavsc.RateControl<IRating>" %>
<% Rate = Model.Rate; %>
<div data-id="<%=Model.Id%>" data-type="rate-user-skill" ><% int i = 0; for (; i<NbFilled; i++) {
%><i class="fa fa-star" ></i><% }
%><% if (HasHalf) { %><i class="fa fa-star-half-o"></i><% i++; }
%><% for (int j=0; j<NbEmpty; j++, i++ ) { %><i class="fa fa-star-o"></i><% }
%></div>

@ -0,0 +1,38 @@
<%@ Page Title="Skills" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Skill>>" %>
<asp:Content ID="headContent" ContentPlaceHolderID="head" runat="server">
<script src="<%=Url.Content("~/Scripts/yavsc.skills.js")%>"></script>
</asp:Content>
<asp:Content ID="MainContentContent" ContentPlaceHolderID="MainContent" runat="server">
<aside class="control">
<form method="post" action="DeclareSkill">
<fieldset>
<div id="Err_skillName" class="field-validation-error"></div>
<input type="text" name="SkillName" id="SkillName" >
<input type="button" value="Créer la compétence" id="btncreate" >
</fieldset>
</form>
<script type="text/javascript">
$(document).ready(function () {
$('#btncreate').click( function() {
Skills.createSkill(sname, function(sid) {
var sname = $('#SkillName').val();
console.log(' Skill created id : '+sid);
$('<li>'+sname+'</li>').data('sid',sid).addClass('skillname').appendTo('#skills');
$('#SkillName').val('');
}); } ); });
</script>
</aside>
<ul id="skills">
<% foreach (var skill in Model) { %>
<li class="skillname" data-sid="<%= skill.Id %>">
<%= skill.Name %> <%=Html.Partial("RateSkillControl", skill) %>
</li>
<% } %>
</ul>
</asp:Content>

@ -0,0 +1,2 @@
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

@ -0,0 +1,51 @@
<%@ Page Title="Skills" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage<PerformerProfile>" %>
<asp:Content ID="headContent" ContentPlaceHolderID="head" runat="server">
<script src="<%=Url.Content("~/Scripts/yavsc.skills.js")%>"></script>
</asp:Content>
<asp:Content ID="MainContentContent" ContentPlaceHolderID="MainContent" runat="server">
<aside class="control">
<form method="post" action="DeclareUserSkill">
<fieldset>
<legend>Declarer une compétence supplémentaire</legend>
<div id="Err_skillId" class="field-validation-error"></div>
<h2>
<select id="SkillId" >
<% foreach (var skill in (Skill[]) ViewData["SiteSkills"]) {
if (Model.HasSkill(skill.Id)) {%>
<option value="<%=skill.Id%>" disabled>
<%=skill.Name%></option>
<% } else { %>
<option value="<%=skill.Id%>"><%=skill.Name%></option>
<% } } %>
</select></h2>
<label for="Comment">Si vous le désirez, faites un commentaire sur cette compétence</label>
<textarea id="Comment"></textarea>
<input type="button" value="Ajouter la compétence à votre profile" id="btndeclare" >
</fieldset>
</form>
<script type="text/javascript">
$(document).ready(function () {
$('#btndeclare').click( function() {
var sid = $('#SkillId').val();
var cmnt = $('#Comment').val();
var sname = $('#SkillId').text();
Skills.declareUserSkill({ username: <%=YavscAjaxHelper.QuoteJavascriptString(Model.UserName) %> ,
skillid: sid, rate: 50, comment: cmnt }, function(usid) {
console.log('User skill created, id : '+usid);
$('<li>'+sname+'</li>').data('sid',sid).data('id',usid).addClass('skillname').appendTo('#userskills');
$('#SkillId').val(0);
}); }); });
</script>
</aside>
<ul id="userskills">
<% foreach (var userskill in Model.Skills) { %>
<li class="skillname" data-sid="<%= userskill.Id %>">
<h2><%= userskill.SkillName %></h2><br> <div data-type="comment"><%= userskill.Comment %></div> <%=Html.Partial("RateUserSkillControl", userskill) %>
</li>
<% } %>
</ul>
</asp:Content>

@ -0,0 +1,37 @@
<%@ Page Title="Contact" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server">
<div class="panel">
<p>
Directeur : <br>
Adresse postale : <br>
Tél. : +33 <br>
Tél. : +33 <br>
SIREN : <br>
SIRET : <br>
Activité Principalement Exercée (APE) : <br>
</p>
<% using (Html.BeginForm("Contact", "Home")) { %>
<fieldset>
<legend>Message</legend>
<p>
<%= Html.Label("email") %>:
<%= Html.ValidationMessage("email") %><br/>
<%= Html.TextBox("email") %>
</p>
<p>
<%= Html.Label("reason") %>:
<%= Html.ValidationMessage("reason") %><br/>
<%= Html.TextBox("reason") %>
</p>
<p>
<%= Html.Label("body") %>:
<%= Html.ValidationMessage("body") %><br/>
<%= Html.TextArea("body") %>
</p>
</fieldset>
<input type="submit" value="<%=Html.Translate("Submit")%>">
<% } %>
</div>
</asp:Content>

@ -0,0 +1,7 @@
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<BlogEntryCollection>" MasterPageFile="~/Models/App.master"%>
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server">
Ce contenu est d'accès restreint : &lt;<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>&gt;
Demandez à l'administrateur les autorisations suffisantes pour accèder à cet emplacement.
</asp:Content>

@ -0,0 +1,79 @@
//
// AskForADate.cs
//
// Author:
// Paul Schneider <paulschneider@free.fr>
//
// Copyright (c) 2014 Paul Schneider
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Yavsc.Model.Calendar
{
/// <summary>
/// Ask for A date.
/// </summary>
public class BookingQuery
{
/// <summary>
/// Gets or sets the prefered date.
/// </summary>
/// <value>The prefered date.</value>
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
[Display(ResourceType=typeof(LocalizedText),Name="StartDate")]
public DateTime StartDate { get; set; }
/// <summary>
/// Gets or sets the minimum time.
/// </summary>
/// <value>The minimum time.</value>
[RegularExpression("\\d\\d:\\d\\d")]
[Display(ResourceType=typeof(LocalizedText),Name="StartHour")]
[Required(ErrorMessage= "S'il vous plait, saisissez une heure de début d'intervention")]
public string StartHour { get; set; }
/// <summary>
/// Gets or sets the max date.
/// </summary>
/// <value>The max date.</value>
[Display(Name="EndDate",ResourceType=typeof(LocalizedText))]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
public DateTime EndDate { get; set; }
/// <summary>
/// Gets or sets the minimal duration.
/// </summary>
/// <value>The duration.</value>
[RegularExpression("\\d\\d:\\d\\d")]
[Required(ErrorMessage= "S'il vous plait, saisissez une heure de fin d'intervention")]
[Display(Name="EndHour",ResourceType=typeof(LocalizedText))]
public string EndHour { get; set; }
/// <summary>
/// Gets or sets the role.
/// </summary>
/// <value>The role.</value>
[Required(ErrorMessage= "S'il vous plait, saisissez le ou les types d'intervention souhaité")]
[Display(Name="Role",ResourceType=typeof(LocalizedText))]
public string [] Roles { get; set; }
}
}

@ -0,0 +1,37 @@
//
// IAuthorized.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model
{
/// <summary>
/// I authorized.
/// </summary>
public interface IAuthorized {
/// <summary>
/// Gets or sets the author.
/// </summary>
/// <value>The author.</value>
string Author { get; set; }
}
}

@ -0,0 +1,30 @@
//
// ICommented.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model
{
public interface IComment: IIdentified {
string Comment { get; set; }
}
}

@ -0,0 +1,30 @@
//
// IIdentified.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model
{
public interface IIdentified
{
long Id { get; set; }
}
}

@ -0,0 +1,38 @@
//
// IIdentified.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model
{
/// <summary>
/// I rating.
/// </summary>
public interface IRating: IIdentified
{
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
int Rate { get; set; }
}
}

@ -0,0 +1,63 @@
//
// Manager.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Configuration;
using System.Reflection;
using System.Configuration.Provider;
namespace Yavsc.Model {
/// <summary>
/// Manager.
/// </summary>
public static class ManagerHelper {
/// <summary>
/// Gets the provider.
/// </summary>
/// <value>The provider.</value>
public static TProvider GetDefaultProvider<TProvider> (string configSetion) where TProvider: ProviderBase
{
DataProviderConfigurationSection config = ConfigurationManager.GetSection (configSetion) as DataProviderConfigurationSection;
if (config == null)
throw new ConfigurationErrorsException (
string.Format(
"The providers configuration bloc `{0}` was not found",
configSetion));
ProviderSettings celt =
config.Providers [config.DefaultProvider];
if (config == null)
throw new ConfigurationErrorsException (
string.Format (
"The default provider `{0}` was not found ",
config.DefaultProvider));
Type provtype = Type.GetType (celt.Type);
if (provtype == null)
throw new ProviderException (
string.Format (
"Provider type '{0}' was not found",celt.Type));
ConstructorInfo ci = provtype.GetConstructor (Type.EmptyTypes);
ProviderBase bp = ci.Invoke (Type.EmptyTypes) as ProviderBase;
bp.Initialize (celt.Name, celt.Parameters);
return bp as TProvider;
}
}
}

@ -0,0 +1,39 @@
//
// UserNameBase.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Yavsc.Model.RolesAndMembers
{
public class UserNameBase {
/// <summary>
/// Gets or sets the name of the user.
/// </summary>
/// <value>The name of the user.</value>
[Localizable(true), Required(ErrorMessage = "S'il vous plait, entrez un nom d'utilisateur")
,Display(ResourceType=typeof(LocalizedText),Name="User_name"),RegularExpression("([a-z]|[A-Z]|[0-9] )+")]
public string UserName { get; set; }
}
}

@ -0,0 +1,43 @@
//
// UserRole.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace Yavsc.Model.RolesAndMembers
{
/// <summary>
/// User role.
/// </summary>
public class UserRole : UserNameBase
{
/// <summary>
/// Gets or sets the role.
/// </summary>
/// <value>The role.</value>
[Required]
[StringLength(255)]
[DisplayName("Nom du rôle")]
public string Role
{ get; set; }
}
}

@ -0,0 +1,110 @@
//
// PerformerProfile.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using Yavsc.Model.RolesAndMembers;
using Yavsc.Model.Skill;
using System.Web.Security;
using System.Web.Profile;
using System.Collections.Generic;
using Yavsc.Model;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Performer profile.
/// </summary>
public class PerformerProfile: IRating, IIdentified
{
/// <summary>
/// Initializes a new instance of the <see cref="Yavsc.Model.Skill.PerformerProfile"/> class.
/// </summary>
public PerformerProfile()
{
}
/// <summary>
/// Gets or sets the name of the user.
/// </summary>
/// <value>The name of the user.</value>
[Localizable(true), Required(ErrorMessage = "S'il vous plait, entrez un nom d'utilisateur")
,Display(ResourceType=typeof(LocalizedText),Name="User_name"),RegularExpression("([a-z]|[A-Z]|[0-9] )+")]
public string UserName { get; set; }
public long Id { get; set; }
/// <summary>
/// Gets or sets the skills.
/// </summary>
/// <value>The skills.</value>
public virtual IEnumerable<UserSkill> Skills { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="Yavsc.FrontOffice.PerformerProfile"/> class.
/// </summary>
/// <param name="username">Username.</param>
public PerformerProfile(string username)
{
UserName = username;
}
/// <summary>
/// Gets the user.
/// </summary>
/// <returns>The user.</returns>
public MembershipUser GetUser()
{
return Membership.GetUser (UserName);
}
private Profile yavscCLientProfile = null;
/// <summary>
/// Gets the yavsc C lient profile.
/// </summary>
/// <value>The yavsc C lient profile.</value>
public Profile YavscCLientProfile
{
get {
if (yavscCLientProfile == null)
yavscCLientProfile = new Profile (
ProfileBase.Create (UserName));
return yavscCLientProfile;
}
}
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
public int Rate {
get ;
set ;
}
/// <summary>
/// Determines whether this instance references the specified skillId.
/// </summary>
/// <returns><c>true</c> if this instance has skill the specified skillId; otherwise, <c>false</c>.</returns>
/// <param name="skillId">Skill identifier.</param>
public bool HasSkill(long skillId)
{
return Skills.Any (x => x.SkillId == skillId);
}
}
}

@ -0,0 +1,55 @@
//
// Skill.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Configuration;
using System.Reflection;
using System.Configuration.Provider;
using System.ComponentModel.DataAnnotations;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Skill.
/// </summary>
public class Skill : IRating {
/// <summary>
/// Gets or sets the identifier.
/// </summary>
/// <value>The identifier.</value>
public long Id { get; set; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
[Required(ErrorMessage = "Please, specify a skill name")]
public string Name { get; set; }
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
public int Rate { get; set; }
}
}

@ -0,0 +1,127 @@
//
// SkillManager.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Configuration;
using System.Reflection;
using System.Configuration.Provider;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Skill manager.
/// </summary>
public static class SkillManager
{
private static SkillProvider provider = null;
/// <summary>
/// Gets the provider.
/// </summary>
/// <value>The provider.</value>
private static SkillProvider Provider {
get {
if (provider == null)
provider = ManagerHelper.GetDefaultProvider<SkillProvider>
("system.web/skillProviders");
return provider;
}
}
/// <summary>
/// Create or modifies the specified skill.
/// </summary>
/// <param name="skill">the skill.</param>
public static long DeclareSkill(Skill skill) {
Provider.Declare(skill);
return skill.Id;
}
/// <summary>
/// Declares the skill.
/// </summary>
/// <returns>The skill.</returns>
/// <param name="dec">Dec.</param>
public static long DeclareUserSkill(UserSkillDeclaration dec) {
return Provider.Declare(dec);
}
/// <summary>
/// Rates the user skill.
/// </summary>
/// <returns>The user skill.</returns>
/// <param name="username">Username.</param>
/// <param name="userSkill">User skill.</param>
public static long RateUserSkill(string username, UserSkillRating userSkill) {
return Provider.Rate(userSkill);
}
/// <summary>
/// Rates the skill.
/// </summary>
/// <param name="username">Username.</param>
/// <param name="skill">Skill.</param>
public static void RateSkill(string username, SkillRating skill) {
Provider.Rate(skill);
}
/// <summary>
/// Finds the skills.
/// </summary>
/// <returns>The skill identifier.</returns>
/// <param name="pattern">Pattern.</param>
public static Skill [] FindSkill(string pattern){
return Provider.FindSkill(pattern);
}
/// <summary>
/// Finds the performer.
/// </summary>
/// <returns>The performer.</returns>
/// <param name="skillIds">Skill identifiers.</param>
public static string [] FindPerformer(long []skillIds){
return Provider.FindPerformer(skillIds);
}
/// <summary>
/// Deletes the skill.
/// </summary>
/// <param name="skillId">Skill identifier.</param>
public static void DeleteSkill (long skillId)
{
Provider.DeleteSkill (skillId);
}
/// <summary>
/// Deletes the user skill.
/// </summary>
/// <param name="skillId">Skill identifier.</param>
public static void DeleteUserSkill (long skillId)
{
Provider.DeleteUserSkill (skillId);
}
/// <summary>
/// Gets the user skills.
/// </summary>
/// <returns>The user skills.</returns>
/// <param name="userName">User name.</param>
public static PerformerProfile GetUserSkills(string userName)
{
return Provider.GetUserSkills (userName);
}
}
}

@ -0,0 +1,89 @@
//
// SkillProvider.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Configuration.Provider;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Skill provider.
/// </summary>
public abstract class SkillProvider: ProviderBase
{
/// <summary>
/// Declare the specified skill.
/// </summary>
/// <param name="skill">Skill.</param>
public abstract long Declare(Skill skill) ;
/// <summary>
/// Declare the specified user skill.
/// </summary>
/// <param name="userskill">Userskill.</param>
public abstract long Declare(UserSkillDeclaration userskill) ;
/// <summary>
/// Rate the specified user skill.
/// </summary>
/// <param name="userskill">Userskill.</param>
public abstract long Rate(UserSkillRating userskill) ;
/// <summary>
/// Rate the specified skill.
/// </summary>
/// <param name="skill">Skill.</param>
public abstract void Rate(SkillRating skill) ;
/// <summary>
/// Finds the skill identifier.
/// </summary>
/// <returns>The skill identifier.</returns>
/// <param name="pattern">Pattern.</param>
public abstract Skill [] FindSkill(string pattern);
/// <summary>
/// Gets the user skills.
/// </summary>
/// <returns>The user skills.</returns>
/// <param name="username">Username.</param>
public abstract PerformerProfile GetUserSkills(string username) ;
/// <summary>
/// Finds the performer.
/// </summary>
/// <returns>The performer.</returns>
/// <param name="skillIds">Skill identifiers.</param>
public abstract string [] FindPerformer(long []skillIds);
/// <summary>
/// Deletes the skill.
/// </summary>
/// <param name="skillId">Skill identifier.</param>
public abstract void DeleteSkill(long skillId);
/// <summary>
/// Deletes the user skill.
/// </summary>
/// <param name="userSkillId">User skill identifier.</param>
public abstract void DeleteUserSkill(long userSkillId);
}
}

@ -0,0 +1,49 @@
//
// SkillRating.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Skill rating.
/// </summary>
public class SkillRating : IRating, IAuthorized
{
/// <summary>
/// Gets or sets the skill identifier.
/// </summary>
/// <value>The skill identifier.</value>
public long Id { get;set ; }
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
public int Rate { get; set; }
/// <summary>
/// Gets or sets the author.
/// </summary>
/// <value>The author.</value>
public string Author { get; set; }
}
}

@ -0,0 +1,64 @@
//
// SkillDeclaration.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
/// <summary>
/// User skill.
/// </summary>
public class UserSkill : IComment, IRating
{
/// <summary>
/// Gets or sets the identifier for this
/// user's skill.
/// </summary>
/// <value>The user's skill identifier.</value>
public long Id { get ; set ; }
/// <summary>
/// Gets or sets the skill identifier.
/// </summary>
/// <value>The skill identifier.</value>
public long SkillId { get ; set ; }
/// <summary>
/// Gets or sets the name of the skill.
/// </summary>
/// <value>The name of the skill.</value>
public string SkillName { get; set; }
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
public int Rate { get ; set ; }
/// <summary>
/// Gets or sets the comment.
/// </summary>
/// <value>The comment.</value>
public string Comment { get; set; }
}
}

@ -0,0 +1,40 @@
//
// UserSkillComment.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
/// <summary>
/// User skill comment.
/// </summary>
public class UserSkillComment: UserSkillReference, IComment
{
/// <summary>
/// Gets or sets the comment.
/// </summary>
/// <value>The comment.</value>
public string Comment { get; set; }
}
}

@ -0,0 +1,36 @@
//
// UserSkillDeclaration.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
public class UserSkillDeclaration : UserSkill {
/// <summary>
/// Gets or sets the name of the user.
/// </summary>
/// <value>The name of the user.</value>
public string UserName { get; set; }
}
}

@ -0,0 +1,45 @@
//
// SkillRating.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
/// <summary>
/// Skill rating.
/// </summary>
public class UserSkillRating: UserSkillReference, IRating, IAuthorized
{
/// <summary>
/// Gets or sets the rate.
/// </summary>
/// <value>The rate.</value>
public int Rate { get; set; }
/// <summary>
/// Gets or sets the author.
/// </summary>
/// <value>The author.</value>
public string Author { get; set; }
}
}

@ -0,0 +1,49 @@
//
// UserSkillReference.cs
//
// Author:
// Paul Schneider <paul@pschneider.fr>
//
// Copyright (c) 2015 GNU GPL
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace Yavsc.Model.Skill
{
/// <summary>
/// User skill reference.
/// </summary>
public class UserSkillReference {
/// <summary>
/// Gets or sets the user's skill identifier.
/// </summary>
/// <value>The skill identifier.</value>
public long Id { get;set ; }
/// <summary>
/// Gets or sets the skill identifier.
/// </summary>
/// <value>The skill identifier.</value>
public long SkillId { get;set ; }
/// <summary>
/// Gets or sets the name of the performer.
/// </summary>
/// <value>The name of the user.</value>
public string Performer { get; set; }
}
}
Loading…