Fixe la recherche d'un préstataire.

* Makefile: Fixe: ne pas déployer sans hôte de destination
Ajoute: le déployement de tous des sites en prod, avec la cible
  `syncall`

* NpgsqlContentProvider.cs: Renseigne le code APE et la côte à la création du
  profile préstataire

* SkillController.cs:
* FrontOfficeController.cs:
* NpgsqlSkillProvider.cs:
* SimpleBookingQuery.cs:
* AuthentificatedSkillRating.cs: refabrication

* ResultPages.cs:
* Title.aspx:
* YavscHelpers.cs: ajoute une classe css au bloc de liens vers les
  autres pages de resultat

* style.css: mise en forme du code

* style.css: du style

* Booking.aspx:
* FrontOfficeController.cs: Modifie la recherche des prestataire, pour
  qu'un resultat soit donné dès qu'un utilisateur est déclaré
  prestataire.

* PerformerProfile.cs: doc xml

* LocalizedText.resx:
* LocalizedText.fr.resx:
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: internationalisation

* Profile.cs: Décore la valeur de profile "GoogleRegId"

* SkillEntity.cs: refabrication pour l'instant inutile ...

* SkillManager.cs: présente à l'espace de travail la nouvelle methode
  de recherche d'un préstataire

* SkillProvider.cs: définit la nouvelle methode de recherche d'un
  préstataire

* WorkFlowManager.cs: présente à l'espace de travail une
nouvelle methode de recherche d'un préstataire,
renvoyant toute l'information relative à chaque prestataire listé.

* YavscModel.csproj: refabrication des cotes de compétences
This commit is contained in:
Paul Schneider 2015-11-30 15:16:24 +01:00
commit dbcbf8b318
30 changed files with 373 additions and 155 deletions

View file

@ -202,7 +202,7 @@ namespace Yavsc.ApiControllers
/// </summary>
/// <param name="rate">Skill rating.</param>
[Authorize()]
public void RateSkill (SkillRating rate) {
public void RateSkill (AuthentificatedSkillRating rate) {
throw new NotImplementedException ();
}
}

View file

@ -74,7 +74,7 @@ namespace Yavsc.ApiControllers
/// </summary>
/// <param name="rate">Skill rating.</param>
[Authorize()]
public void RateSkill (SkillRating rate) {
public void RateSkill (AuthentificatedSkillRating rate) {
SkillManager.RateSkill(User.Identity.Name,rate);
}
@ -91,9 +91,11 @@ namespace Yavsc.ApiControllers
/// Finds the performer.
/// </summary>
/// <returns>The performer.</returns>
/// <param name="skillIds">Skill identifiers.</param>
public string [] FindPerformer (long []skillIds){
return SkillManager.FindPerformer(skillIds);
/// <param name="MEACode">MEA Code.</param>
/// <param name="skills">Skill ratings.</param>
public string [] FindPerformer (string MEACode, SkillRating []skills)
{
return SkillManager.FindPerformer(MEACode, skills);
}
/// <summary>
/// Deletes the skill.

View file

@ -17,6 +17,7 @@ body {
background-color: rgba(20,20,20,.8);
color: yellow;
}
.rate:hover { border-color: green;
background-color:rgba(30,0,124,0.9); }
@ -181,6 +182,7 @@ header h1, header a , .actionlink, .menuitem, a { padding:.5em;}
.usertitleref{
padding:.3em;
}
.bshpanel { cursor:zoom-in; }
.c2 { display:initial; }

View file

@ -14,6 +14,8 @@ body.loading .modal {
border-radius:1em;
border-style: solid;
border-width: 1px;
padding:.2em;
display: inline-block;
}
header {
@ -273,7 +275,7 @@ input, select, textarea {
padding:5px; margin:5px;
background-color: rgba(0,0,40,.8);
}
.skillname {
.skillname, .performer, .usercard, .pagelink {
padding:.5em;
margin:.25em;
max-width: 24em;
@ -282,6 +284,7 @@ input, select, textarea {
border-radius:1em;
border-style: solid;
border-width: 1px;
font-size: large;
}
.input-validation-error { border: solid 1px red; background-color: rgba(180,256,256,.5); }

View file

@ -1,3 +1,21 @@
2015-11-30 Paul Schneider <paul@pschneider.fr>
* SkillController.cs:
* FrontOfficeController.cs: refabrication
* style.css: mise en forme du code
* style.css: du style
* Booking.aspx:
* FrontOfficeController.cs: Modifie la recherche des
prestataire, pour qu'un resultat soit donné dès qu'un
utilisateur est déclaré prestataire.
* Title.aspx:
* YavscHelpers.cs: ajoute une classe css au bloc de liens vers
les autres pages de resultat
2015-11-28 Paul Schneider <paul@pschneider.fr>
* p8-av4.xxs.jpg:

View file

@ -321,7 +321,7 @@ namespace Yavsc.Controllers
// actually performed via the Web API :-°
// else if (ModelState.IsValid) {}
var usp = SkillManager.GetUserSkills (id);
var skills = SkillManager.FindSkill ("%");
var skills = SkillManager.FindSkill ("%",usp.MEACode);
ViewData ["SiteSkills"] = skills;
return View (usp);
}
@ -346,7 +346,8 @@ namespace Yavsc.Controllers
var result = new List<PerformerProfile> ();
foreach (string meacode in model.MEACodes) {
foreach (PerformerProfile profile in WorkFlowManager.FindPerformer(meacode)) {
foreach (PerformerProfile profile in WorkFlowManager.FindPerformer(meacode,null)) {
if (profile.HasCalendar())
try {
var events = ProfileBase.Create (profile.UserName).GetEvents (model.StartDate, model.EndDate);
if (events.items.Length == 0)
@ -376,25 +377,34 @@ namespace Yavsc.Controllers
/// <summary>
/// Booking the specified model.
/// </summary>
/// <param name="MEACode">MEA Code.</param>
/// <param name="model">Model.</param>
public ActionResult Booking (SimpleBookingQuery model)
{
// assert (model.MEACode!=null), since it's the required part of the route data
var needs = SkillManager.FindSkill ("%", model.MEACode);
var specification = new List<SkillRating> ();
ViewData ["Needs"] = needs;
if (model.Need != null) {
if (model.Need != "none")
foreach (string specitem in model.Need.Split(',')) {
string[] specvals = specitem.Split (' ');
specification.Add (new SkillRating () { Id = long.Parse (specvals [0]),
Rate = int.Parse (specvals [1])
});
}
}
// In order to present this form
// with no need selected and without
// validation error display,
// we only check the need here, not at validation time.
// Although, the need is indeed cruxial requirement,
// but we already have got a MEA code
if (ModelState.IsValid)
if (model.Needs != null) {
if (ModelState.IsValid && model.Need!=null) {
var result = new List<PerformerAvailability> ();
foreach (PerformerProfile profile in WorkFlowManager.FindPerformer(model.MEACode)) {
foreach (PerformerProfile profile in WorkFlowManager.FindPerformer(model.MEACode,specification.ToArray()))
if (profile.HasCalendar ()) {
try {
var events = ProfileBase.Create (profile.UserName)
.GetEvents (
var events = ProfileBase.Create (profile.UserName).GetEvents (
model.PreferedDate.Date,
model.PreferedDate.AddDays (1).Date);
// TODO replace (events.items.Length == 0)
@ -406,17 +416,17 @@ namespace Yavsc.Controllers
}
} else
result.Add (profile.CreateAvailability (model.PreferedDate, false));
}
return View ("Performers", result.ToArray ());
} else {
// A first Get
var needs = SkillManager.FindSkill ("%", model.MEACode);
ViewData ["Needs"] = needs;
model.Needs = needs.Select (
x => string.Format ("{0}:{1}", x.Id, x.Rate)).ToArray ();
}
if (model.Need==null) {
// A first Get, or no skill available
model.Need =
string.Join(",", needs.Select (x => string.Format ("{0}:{1}", x.Id, x.Rate)).ToArray ());
if (string.IsNullOrWhiteSpace (model.Need))
model.Need = "none";
}
var activity = WorkFlowManager.GetActivity (model.MEACode);
ViewData ["Activity"] = activity;
ViewData ["Title"] = activity.Title;

View file

@ -299,23 +299,33 @@ namespace Yavsc.Helpers
/// </summary>
/// <returns>The page links.</returns>
/// <param name="helper">Helper.</param>
/// <param name="ResultCount">Result count.</param>
/// <param name="PageSize">Page size.</param>
/// <param name="PageIndex">Page index.</param>
/// <param name="PageSize">Page size.</param>
/// <param name="ResultCount">Result count.</param>
/// <param name="args">Arguments.</param>
/// <param name="pagesLabel">Pages label.</param>
/// <param name="singlePage">Single page.</param>
/// <param name="none">None.</param>
/// <param name="cssClass">Css class.</param>
public static IHtmlString RenderPageLinks (
this HtmlHelper helper,
int PageIndex, int PageSize, int ResultCount,
string args="?PageIndex={0}",
string pagesLabel="Pages: ", string singlePage="",
string none="néant"
string none="néant", string cssClass = "pagelink"
)
{
StringWriter strwr = new StringWriter ();
HtmlTextWriter writer = new HtmlTextWriter(strwr);
if (PageSize <= 0)
PageSize = 0;
if (ResultCount > 0 && ResultCount > PageSize ) {
int pageCount = ((ResultCount-1) / PageSize) + 1;
if ( pageCount > 1 ) {
if (cssClass!=null)
writer.AddAttribute ("class", cssClass);
writer.RenderBeginTag ("div");
writer.WriteEncodedText (pagesLabel);
for (int pi = (PageIndex < 5) ? 0 : PageIndex - 5; pi < pageCount && pi < PageIndex + 5; pi++) {
if (PageIndex == pi)
@ -329,6 +339,7 @@ namespace Yavsc.Helpers
writer.RenderEndTag ();
writer.Write ("&nbsp;");
}
writer.RenderEndTag ();
}
else {
writer.Write (singlePage);

View file

@ -18,7 +18,7 @@ if (((int) ViewData["ResultCount"]) > ((int) ViewData["PageSize"])) {
rp1.PageIndex = (int) ViewData["PageIndex"];
rp1.PageSize = (int) ViewData["PageSize"];
%><aside><form runat="server" id="form1">
<yavsc:ResultPages id="rp1" Action = "?pageIndex={0}" runat="server">
<yavsc:ResultPages id="rp1" Action = "?pageIndex={0}" CssClass="pagelink" runat="server">
<None><i>Pas de contenu</i></None>
</yavsc:ResultPages>
</form>

View file

@ -30,13 +30,14 @@
<%= Html.Hidden("MEACode") %>
<fieldset>
<legend><%= Html.Translate("YourNeed") %></legend>
<input type="hidden" name="Needs" id="Needs" value="">
<ul>
<% foreach (var need in (SkillEntity[])(ViewData["Needs"])) { %>
<li><%= need.Name %> <%= Html.Partial("RateSkillControl", need)%></li>
<input type="hidden" name="Need" id="Need" value="">
<ul >
<% if (ViewData ["Needs"]!=null)
foreach (var need in (SkillEntity[])(ViewData ["Needs"])) { %>
<li class="skillname"><%= need.Name %> <%= Html.Partial("RateSkillControl", need)%></li>
<% } %>
</ul>
<%= Html.ValidationMessageFor(model=>model.Needs) %>
<%= Html.ValidationMessageFor(model=>model.Need) %>
</fieldset>
<fieldset>
<legend><%= Html.Translate("PerformanceDate") %></legend>
@ -46,12 +47,10 @@ Intervention souhaitée le
</fieldset>
<script>
$(document).ready(function(){
var needs = <%= Ajax.JSonString((SkillEntity[])(ViewData["Needs"])) %>;
var fneeds = needs.map( function (need) {
return need.Id+' '+need.Rate; } );
fneeds.forEach(function(elt) { console.log(Yavsc.dumpprops(elt)) } );
$('#Needs').val(fneeds);
var needs = <%= Ajax.JSonString((SkillEntity[])(ViewData ["Needs"])) %>;
var fneeds = [];
needs.forEach(function(elt) { fneeds.push (''+elt.Id+' '+elt.Rate); } );
if (needs.length>0) $('#Need').val(fneeds); else $('#Need').val('none');
$('[data-type="rate-site-skill"]').rate({jsTarget: function (rating)
{
// console.log(Yavsc.dumpprops(rating));