* yavsc.js:

* yavsc.circles.js: js refactoring

* Credits.aspx: A credit about to add

* CircleBase.cs: The Circle base

* NpgsqlCircleProvider.cs: * refactoring
* updates the circle

* InputCircle.cs: using the new CircleBase class

* ResultPages.cs: Using a new "None" attribute

* CircleController.cs: refactoring : drops the NewCircle class The
  `List` method now resterns collection of circlebase

* style.css: * a new `dirty` css class, could be used to tag data to
  validate ala ajax
* removed quite all of the `float` usages

* AccountController.cs: xml doc

* BlogsController.cs: Avatar method moved to the Account controller

* YavscHelpers.cs: An avatar url

* App.master: Login div moved up

* Circles.aspx: a new `private` filed in the `Circle` object, in order
  to keep circle names from being published as user's information,
should be true by default

* Profile.aspx: removed the tables

* Index.aspx: Un message plus explicite

* Web.config: nothing to view

* Web.csproj: * new page : Credit
* new script: yavsc.circle.js

* instdbws.sql: circles are uniques for a given user against a given
  app

* Circle.cs: Now inherits CircleBase to implement a member list

* CircleProvider.cs: implements a circle update method

* LocalizedText.resx:
* LocalizedText.Designer.cs: no content!!!

* LocalizedText.fr.resx:
* LocalizedText.fr.Designer.cs: pas content

* YavscModel.csproj: a new CircleBAse class
This commit is contained in:
Paul Schneider 2015-09-10 00:55:19 +02:00
commit b7fa996dbc
30 changed files with 730 additions and 460 deletions

View file

@ -58,7 +58,7 @@ namespace Yavsc.ApiControllers
public void Add(long id, string username)
{
checkIsOwner (CircleManager.DefaultProvider.Get (id));
CircleManager.DefaultProvider.Add (id, username);
CircleManager.DefaultProvider.AddMember (id, username);
}
@ -70,7 +70,7 @@ namespace Yavsc.ApiControllers
AcceptVerbs ("GET")]
public void Delete(long id)
{
checkIsOwner (CircleManager.DefaultProvider.Get(id));
checkIsOwner (CircleManager.DefaultProvider.Get (id));
CircleManager.DefaultProvider.Delete (id);
}
@ -88,7 +88,7 @@ namespace Yavsc.ApiControllers
CircleManager.DefaultProvider.RemoveMembership (id,username);
}
private void checkIsOwner(Circle c)
private void checkIsOwner(CircleBase c)
{
string user = Membership.GetUser ().UserName;
if (c.Owner != user)
@ -103,7 +103,7 @@ namespace Yavsc.ApiControllers
AcceptVerbs ("GET")]
public Circle Get(long id)
{
var c = CircleManager.DefaultProvider.Get (id);
var c = CircleManager.DefaultProvider.GetMembers (id);
checkIsOwner (c);
return c;
}
@ -113,11 +113,26 @@ namespace Yavsc.ApiControllers
/// </summary>
[Authorize,
AcceptVerbs ("GET")]
public IEnumerable<Circle> List()
public IEnumerable<CircleBase> List()
{
string user = Membership.GetUser ().UserName;
return CircleManager.DefaultProvider.List (user);
}
/// <summary>
/// List the circles
/// </summary>
[Authorize,
AcceptVerbs ("POST")]
public void Update(CircleBase circle)
{
string user = Membership.GetUser ().UserName;
CircleBase current = CircleManager.DefaultProvider.Get (circle.Id);
if (current.Owner != user)
throw new AuthorizationDenied ("Your not owner of circle at id "+circle.Id);
CircleManager.DefaultProvider.UpdateCircle (circle);
}
}
}

View file

@ -29,7 +29,6 @@ main {
fieldset {
background-color: rgba(32,16,16,0.8);
border-radius:5px; border: solid 1px #000060;
float:left;
}
video,img {
@ -69,27 +68,30 @@ footer {
border-radius:5px;
margin:.5em;
padding: .5em;
float:left;
}
.bsh { float: right; }
#login {
#appmenu {
margin: .5em;
padding: .5em;
border-radius:10px;
color: #ff8;
background-color: rgba(32,16,16,.6);
position: fixed;
top:0;
right:0;
justify-content: space-around;
text-align: center;
max-width:40%;
font-size:75%;
}
#login img { max-height:5em; max-width:5em; }
#appmenu img { max-height:2em; max-width:2em; }
.hint {
display: inline;
font-style: italic;
}
.hint::before {
content: "(";
}
.hint::after {
content: ")";
}
header {
background-color:rgba(16,16,0,0.8);
top:0;
@ -221,7 +223,10 @@ a.actionlink img { top:4px; }
border-radius:25px;
font-size: smaller;
}
.menuitem {
display: block;
}
.onhover {
display:none;
position: absolute;
@ -241,7 +246,7 @@ a.actionlink img { top:4px; }
@media print {
body {background-color:white;color:black;}
header,footer,.postcomment,.actionlink,.metablog,#login
header,footer,.postcomment,.actionlink,.metablog,#appmenu
{ display:none;}
}
@ -250,11 +255,24 @@ a.actionlink img { top:4px; }
.bsh { display: none; }
.c3 { display:initial; }
.c3-alt { display:none; }
#appmenu {position: fixed;
top:0;
right:0;}
}
@media all and (max-width: 640px) {
.bshpanel { cursor:zoom-in; }
#appmenu {position:relative;}
.menuitem {
display: inline;
}
.menuitem:not(:last-child):after {
content:' |';
}
.bshpanel { cursor:zoom-in; }
footer {
clear:both;
font-size: x-small;
}
.c2 { display:initial; }

View file

@ -1,3 +1,44 @@
2015-09-10 Paul Schneider <paul@pschneider.fr>
* yavsc.js:
* yavsc.circles.js: js refactoring
* Credits.aspx: A credit about to add
* CircleController.cs: refactoring : drops the NewCircle class
The `List` method now resterns collection of circlebase
* style.css: * a new `dirty` css class, could be used to tag
data to validate ala ajax
* removed quite all of the `float` usages
* AccountController.cs: xml doc
* BlogsController.cs: Avatar method moved to the Account
controller
* YavscHelpers.cs: An avatar url
* App.master: Login div moved up
* Circles.aspx: a new `private` filed in the `Circle` object,
in order to keep circle names from being published as user's
information,
should be true by default
* Profile.aspx: removed the tables
* Index.aspx: Un message plus explicite
* Web.config: nothing to view
* Web.csproj: * new page : Credit
* new script: yavsc.circle.js
* instdbws.sql: circles are uniques for a given user against a
given app
2015-08-22 Paul Schneider <paul@pschneider.fr>
* yavsc.js: factorize some javascript

View file

@ -14,6 +14,8 @@ using System.Web.Mvc;
using Yavsc.Model.Circles;
using System.Collections.Specialized;
using System.Text;
using System.Net;
using System.Configuration;
namespace Yavsc.Controllers
{
@ -23,8 +25,40 @@ namespace Yavsc.Controllers
public class AccountController : Controller
{
string avatarDir = "~/avatars";
string avatarDir = "~/avatars";
string defaultAvatar;
string defaultAvatarMimetype;
/// <summary>
/// Avatar the specified user.
/// </summary>
/// <param name="user">User.</param>
[AcceptVerbs (HttpVerbs.Get)]
public ActionResult Avatar (string user)
{
ProfileBase pr = ProfileBase.Create (user);
string avpath = (string ) pr.GetPropertyValue("avatar") ;
if (avpath == null) {
FileInfo fia = new FileInfo (Server.MapPath (defaultAvatar));
return File (fia.OpenRead (), defaultAvatarMimetype);
}
if (avpath.StartsWith ("~/")) {
avpath = Server.MapPath (avpath);
}
WebRequest wr = WebRequest.Create (avpath);
FileContentResult res;
using (WebResponse resp = wr.GetResponse ()) {
using (Stream str = resp.GetResponseStream ()) {
byte[] content = new byte[str.Length];
str.Read (content, 0, (int)str.Length);
res = File (content, resp.ContentType);
wr.Abort ();
return res;
}
}
}
/// <summary>
/// Gets or sets the avatar dir.
/// This value is past to <c>Server.MapPath</c>,
@ -69,7 +103,17 @@ namespace Yavsc.Controllers
ViewData ["returnUrl"] = returnUrl;
return View (model);
}
/// <summary>
/// Initializes a new instance of the <see cref="Yavsc.Controllers.BlogsController"/> class.
/// </summary>
private void GetAvatarConfig ()
{
string[] defaultAvatarSpec = ConfigurationManager.AppSettings.Get ("DefaultAvatar").Split (';');
if (defaultAvatarSpec.Length != 2)
throw new ConfigurationErrorsException ("the DefaultAvatar spec should be found as <fileName>;<mime-type> ");
defaultAvatar = defaultAvatarSpec [0];
defaultAvatarMimetype = defaultAvatarSpec [1];
}
/// <summary>
/// Login the specified returnUrl.

View file

@ -27,7 +27,6 @@ namespace Yavsc.Controllers
/// </summary>
public class BlogsController : Controller
{
string defaultAvatarMimetype;
private string sitename =
WebConfigurationManager.AppSettings ["Name"];
string avatarDir = "~/avatars";
@ -41,17 +40,7 @@ namespace Yavsc.Controllers
set { avatarDir = value; }
}
/// <summary>
/// Initializes a new instance of the <see cref="Yavsc.Controllers.BlogsController"/> class.
/// </summary>
public BlogsController ()
{
string[] defaultAvatarSpec = ConfigurationManager.AppSettings.Get ("DefaultAvatar").Split (';');
if (defaultAvatarSpec.Length != 2)
throw new ConfigurationErrorsException ("the DefaultAvatar spec should be found as <fileName>;<mime-type> ");
defaultAvatar = defaultAvatarSpec [0];
defaultAvatarMimetype = defaultAvatarSpec [1];
}
/// <summary>
/// Index the specified user, title, pageIndex and pageSize.
@ -256,7 +245,7 @@ namespace Yavsc.Controllers
ViewData ["UserName"] = un;
ViewData ["AllowedCircles"] = CircleManager.DefaultProvider.List (Membership.GetUser ().UserName).Select (x => new SelectListItem {
Value = x.Id.ToString(),
Text = YavscHelpers.FormatCircle(x).ToHtmlString()
Text = x.Title
});
return View ("Edit", new BlogEntry { Title = title });
@ -325,36 +314,7 @@ namespace Yavsc.Controllers
return GetPost (model.PostId);
}
string defaultAvatar;
/// <summary>
/// Avatar the specified user.
/// </summary>
/// <param name="user">User.</param>
[AcceptVerbs (HttpVerbs.Get)]
public ActionResult Avatar (string user)
{
ProfileBase pr = ProfileBase.Create (user);
string avpath = (string)pr.GetPropertyValue ("avatar");
if (avpath == null) {
FileInfo fia = new FileInfo (Server.MapPath (defaultAvatar));
return File (fia.OpenRead (), defaultAvatarMimetype);
}
if (avpath.StartsWith ("~/")) {
}
WebRequest wr = WebRequest.Create (avpath);
FileContentResult res;
using (WebResponse resp = wr.GetResponse ()) {
using (Stream str = resp.GetResponseStream ()) {
byte[] content = new byte[str.Length];
str.Read (content, 0, (int)str.Length);
res = File (content, resp.ContentType);
wr.Abort ();
return res;
}
}
}
/// <summary>
/// Remove the specified blog entry, by its author and title,

View file

@ -13,6 +13,7 @@ using System.Web.Mvc;
using Yavsc.Model.Circles;
using System.Web.UI;
using System.Linq.Expressions;
using System.Web.Profile;
namespace Yavsc.Helpers
{
@ -162,6 +163,14 @@ namespace Yavsc.Helpers
foreach (MembershipUser u in users)
YavscHelpers.SendActivationMessage (u);
}
public static string AvatarUrl (this HtmlHelper helper, string username) {
ProfileBase pr = ProfileBase.Create (username);
string avpath = (string ) pr.GetPropertyValue("avatar") ;
if (avpath != null)
return helper.Encode (avpath);
return "/avatars/" + helper.Encode(username)+".png";
}
}
}

View file

@ -12,6 +12,9 @@ ViewState["orgtitle"] = Html.Translate(Page.Title);
<link rel="stylesheet" href="~/App_Themes/style.css" />
<link rel="icon" type="image/png" href="/favicon.png?v=3" />
<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-2.1.4.min.js")%>"></script>
<script type="text/javascript">
var apiBaseUrl = '<%=Url.Content(Yavsc.WebApiConfig.UrlPrefixRelative)%>';
</script>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
<link href='http://fonts.googleapis.com/css?family=Dancing+Script:400,700' rel='stylesheet' type='text/css'/>
@ -32,28 +35,39 @@ ViewState["orgtitle"] = Html.Translate(Page.Title);
%><div class="message"><%= Html.Encode(ViewData["Message"]) %></div><% }
%>
</header>
<div id="appmenu" >
<% if (Membership.GetUser()==null) { %>
<div class="menuitem">
<%= Html.ActionLink("Authentification", "Login", "Account", new { returnUrl=Request.Url.PathAndQuery },null) %>
<div class="hint">Pour pouvoir publier</div>
</div>
<% } else { %><div class="menuitem">
<a href="/Blog/<%= HttpContext.Current.User.Identity.Name%>">
<img src="<%=Html.AvatarUrl(HttpContext.Current.User.Identity.Name)%>" width="25%" alt="vos posts" /></a>
<div class="hint">Votre Blog</div>
</div>
<div class="menuitem">
<%= Html.ActionLink(HttpContext.Current.User.Identity.Name, "Profile", "Account", new { id = HttpContext.Current.User.Identity.Name }, null) %>
<div class="hint"> &Eacute;dition de votre profile </div></div>
<div class="menuitem">
<a href="/Blogs/Post" >Poster</a>
<div class="hint">
&Eacute;dition d'un nouveau billet </div></div>
<div class="menuitem">
<%= Html.ActionLink( "Deconnexion", "Logout", "Account", new { returnUrl=Request.Url.PathAndQuery }, null) %>
<% } %>
</div>
</div>
<main>
<asp:ContentPlaceHolder ID="MainContent" runat="server">
</asp:ContentPlaceHolder>
</main>
<asp:ContentPlaceHolder ID="MASContent" runat="server">
</asp:ContentPlaceHolder>
<div id="login" ><span class="ohinside">
<a href="<%= Url.Content("~/")%>">
<span ><%=Html.Encode(YavscHelpers.SiteName) %></span></a><br/>
<span class="onhover">Page d'accueil<br/></span></span>
<% if (Membership.GetUser()==null) { %>
<div class="ohinside"><%= Html.ActionLink("Authentification", "Login", "Account", new { returnUrl=Request.Url.PathAndQuery },null) %>
<span class="onhover">Pourquoi s'authentifier?</span></div><br/>
<% } else { %>
<a href="/Blog/<%= HttpContext.Current.User.Identity.Name%>"><img src="/favicon.png" width="25%"/> Votre Blog</a><br/>
<span class="ohinside">
<%= Html.ActionLink(HttpContext.Current.User.Identity.Name, "Profile", "Account", new { id = HttpContext.Current.User.Identity.Name }, null) %>
<span class="onhover"> &Eacute;dition de votre profile </span></span><br/>
<a href="/Blogs/Post" class="ohafter">Poster</a>
<span class="onhover"> &Eacute;dition d'un nouveau billet </span><br/>
<%= Html.ActionLink( "Deconnexion", "Logout", "Account", new { returnUrl=Request.Url.PathAndQuery }, null) %>
<% } %></div>
<footer>
<script src="/Scripts/yavsc.js" async defer>
<script src="https://apis.google.com/js/platform.js" defer>
@ -68,9 +82,7 @@ ViewState["orgtitle"] = Html.Translate(Page.Title);
<% }} %>
<div class="g-plusone" data-annotation="inline" data-width="230"></div>
</footer>
<script type="text/javascript">
var apiBaseUrl = '<%=Url.Content(Yavsc.WebApiConfig.UrlPrefixRelative)%>';
</script>
</body>
</html>

View file

@ -0,0 +1,106 @@

var errspanid="msg";
var CirclesApiUrl = apiBaseUrl + "/Circle";
function editNewCircle() {
if ($('#fncirc').hasClass('hidden')) $('#fncirc').removeClass('hidden')
$('#lgdnvcirc').html("Creation d'un cercle");
$('#fncirc').removeClass("dirty");
$("#title").val( '' );
$('#btnnewcircle').show();
$('#btneditcircle').hide();
}
function selectCircle() {
if ($('#fncirc').hasClass('hidden')) $('#fncirc').removeClass('hidden')
var id = $(this).attr('cid');
$('#lgdnvcirc').html("Edition du cercle");
$('#btnnewcircle').hide();
$('#btneditcircle').show();
// get it from the server
$.getJSON(CirclesApiUrl+"/Get/"+id, function(json) {
$("#title").val( json.Title); });
$('#id').val(id);
$('#fncirc').removeClass("dirty");
}
function onCircleChanged()
{ $('#fncirc').addClass("dirty"); }
function removeCircle() {
Yavsc.message(false);
var id = $(this).attr('cid');
$.ajax({
url: CirclesApiUrl+"/Delete/"+id,
type: "GET",
success: function (data) {
// Drops the row
$("#c_"+id).remove();
},
statusCode: {
400: function(data) {
$.each(data.responseJSON, function (key, value) {
var errspanid = "Err_cr_" + value.key.replace("model.","");
var errspan = document.getElementById(errspanid);
if (errspan==null)
alert('enoent '+errspanid);
else
errspan.innerHTML=value.errors.join("<br/>");
});
}
},
error: function (xhr, ajaxOptions, thrownError) {
if (xhr.status!=400)
Yavsc.message(xhr.status+" : "+xhr.responseText);
else Yavsc.message(false);
}});
}
function modifyCircle() {
Yavsc.message(false);
var circle = { title: $("#title").val(), id: $('#id').val(), isprivate: $('#isprivate').val() } ;
}
function addCircle()
{
Yavsc.message(false);
var circle = { title: $("#title").val() } ;
$("#title").text('');
$.ajax({
url: CirclesApiUrl+"/Create",
type: "POST",
data: circle,
success: function (id) {
// Adds a node rendering the new circle
$('<tr id="c_'+id+'"/>').addClass('selected row')
.appendTo('#tbcb');
$('<td>'+circle.title+' <br><i>'+
circle.members+
'</i></td></td>')
.appendTo('#c_'+id);
$('<td><input class="btnremovecircle actionlink" cid="'+id+'" type="button" value="Remove" onclick="removeCircle"></td>').appendTo('#c_'+id);
},
statusCode: {
400: function(data) {
$.each(data.responseJSON, function (key, value) {
var errspanid = "Err_cr_" + value.key.replace("model.","");
var errspan = document.getElementById(errspanid);
if (errspan==null)
alert('enoent '+errspanid);
else
errspan.innerHTML=value.errors.join("<br/>");
});
}
},
error: function (xhr, ajaxOptions, thrownError) {
if (xhr.status!=400)
Yavsc.message(xhr.status+" : "+xhr.responseText);
else Yavsc.message(false);
}});
}

View file

@ -1,6 +1,9 @@

var Yavsc = (function(apiBaseUrl){
var self = {};
function showHide() {
self.apiBaseUrl = (apiBaseUrl || '/api');
self.showHide = function () {
var id = $(this).attr('did');
var target = $('#'+id);
if (target.hasClass('hidden')) {
@ -13,11 +16,14 @@ function showHide() {
target.addClass('hidden');
$(this).html(this.oldhtml);
}
}
};
function message(msg) {
self.message = function (msg) {
if (msg) {
$("#msg").removeClass("hidden");
$("#msg").text(msg);
} else { $("#msg").addClass("hidden"); } }
} else { $("#msg").addClass("hidden"); } };
return self;
})();

View file

@ -14,9 +14,10 @@
</thead>
<tbody id="tbcb">
<% int lc=0;
foreach (var ci in (IEnumerable<Circle>) ViewData["Circles"]) { lc++; %>
foreach (var ci in (IEnumerable<CircleBase>) ViewData["Circles"]) { lc++; %>
<tr class="<%= (lc%2==0)?"even ":"odd " %>row" id="c_<%=ci.Id%>">
<td cid="<%=ci.Id%>" style="cursor: pointer;" class="btnselcircle" ><%=Html.FormatCircle(ci)%></td>
<td cid="<%=ci.Id%>" style="cursor: pointer;" class="btnselcircle" >
<%=ci.Title%></td>
<td>
<input type="button" value="<%=Html.Translate("Remove")%>"
class="btnremovecircle actionlink" cid="<%=ci.Id%>"/>
@ -42,149 +43,35 @@ $("#tbc").stupidtable();
<fieldset>
<legend id="lgdnvcirc"></legend>
<span id="msg" class="field-validation-valid error"></span>
<label for="title"><b><%=Html.Translate("Title")%></b></label>
<input type="text" id="title" name="title" class="inputtext" onchange="onTitleChanged"/>
<span id="Err_cr_title" class="field-validation-valid error"></span>
<table id="tbmbrs">
<thead>
<tr>
<th data-sort="string"><%=Html.Translate("Members")%>
<span id="Err_cr_users" class="field-validation-valid error"></span>
<yavsc:InputUserName
id="users"
name="users"
emptyvalue="[aucun]"
onchange="onmembersChange(this.value);"
multiple="true"
runat="server" >
</yavsc:InputUserName>
</th>
</tr>
</thead>
<tbody id="tbmbrsb">
</tbody>
</table>
<input type="button" id="btnnewcircle" value="<%=Html.Translate("Create")%>" class="actionlink rowbtnct" />
<label for="title"><b><%=Html.Translate("Title")%></b></label>
<input type="text" id="title" name="title" class="inputtext" onchange="onCircleChanged"/>
<span id="Err_cr_title" class="field-validation-valid error"></span>
<label for="isprivate"><b><%=Html.Translate("Private circle")%></b></label>
<input type="checkbox" name="isprivate" id="isprivate" onchange="onCircleChanged" />
<input type="button" id="btnnewcircle"
value="<%=Html.Translate("Create")%>" class="actionlink rowbtnct" />
<input type="button" id="btneditcircle"
value="<%=Html.Translate("Modify")%>" class="actionlink rowbtnct" />
<input type="hidden" name="id" id="id" />
</fieldset>
</form>
</div>
</div>
<script type="text/javascript" src="<%=Url.Content("~/Scripts/yavsc.circles.js")%>" >
</script>
<script type="text/javascript">
<script>
var cformhidden=true;
var errspanid="msg";
function getCircle(id)
{
$.getJSON("<%=Url.Content("~/api/Circle/Get/")%>"+id,
function(json) { $("#title").val( json.Title); $("#users").val( json.Members ) ; });
}
function editNewCircle() {
if ($('#fncirc').hasClass('hidden')) $('#fncirc').removeClass('hidden')
$('#lgdnvcirc').html("Creation d'un cercle");
$('#btnnewcircle').val("Créer");
$('#fncirc').removeClass("dirty");
}
function selectCircle() {
if ($('#fncirc').hasClass('hidden')) $('#fncirc').removeClass('hidden')
var id = $(this).attr('cid');
$('#lgdnvcirc').html("Edition du cercle");
$('#btnnewcircle').val("Modifier");
// get it from the server
getCircle(id);
$('#fncirc').removeClass("dirty");
}
function onmembersChange(newval)
{$('#fncirc').addClass("dirty");}
function onTitleChanged()
{ $('#fncirc').addClass("dirty"); }
function removeCircle() {
message(false);
var id = $(this).attr('cid');
$.ajax({
url: "<%=Url.Content("~/api/Circle/Delete/")%>"+id,
type: "GET",
success: function (data) {
// Drops the row
$("#c_"+id).remove();
},
statusCode: {
400: function(data) {
$.each(data.responseJSON, function (key, value) {
var errspanid = "Err_cr_" + value.key.replace("model.","");
var errspan = document.getElementById(errspanid);
if (errspan==null)
alert('enoent '+errspanid);
else
errspan.innerHTML=value.errors.join("<br/>");
});
}
},
error: function (xhr, ajaxOptions, thrownError) {
if (xhr.status!=400)
message(xhr.status+" : "+xhr.responseText);
else message(false);
}});
}
function addCircle()
{
message(false);
var circle = { title: $("#title").val(), members: $("#users").val() } ;
$("#title").text('');
$("#users").val('');
$.ajax({
url: "<%=Url.Content("~/api/Circle/Create")%>",
type: "POST",
data: circle,
success: function (id) {
// Adds a node rendering the new circle
$('<tr id="c_'+id+'"/>').addClass('selected row')
.appendTo('#tbcb');
$('<td>'+circle.title+' <br><i>'+
circle.members+
'</i></td></td>')
.appendTo('#c_'+id);
$('<td><input class="btnremovecircle actionlink" cid="'+id+'" type="button" value="Remove" onclick="removeCircle"></td>').appendTo('#c_'+id);
},
statusCode: {
400: function(data) {
$.each(data.responseJSON, function (key, value) {
var errspanid = "Err_cr_" + value.key.replace("model.","");
var errspan = document.getElementById(errspanid);
if (errspan==null)
alert('enoent '+errspanid);
else
errspan.innerHTML=value.errors.join("<br/>");
});
}
},
error: function (xhr, ajaxOptions, thrownError) {
if (xhr.status!=400)
message(xhr.status+" : "+xhr.responseText);
else message(false);
}});
}
$(document).ready(function () {
$('#btednvcirc').click(editNewCircle);
$("#btnnewcircle").click(addCircle);
$("#btneditcircle").click(modifyCircle);
$(".btnremovecircle").click(removeCircle);
$(".btnselcircle").click(selectCircle);
});
</script>
</asp:Content>

View file

@ -17,145 +17,96 @@ table.layout TR TD { max-width:40%; }
<fieldset><legend>Informations publiques</legend>
<table class="layout">
<tr><td align="right" style="">
<%= Html.LabelFor(model => model.Name) %></td><td>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.WebSite) %></td><td>
<%= Html.LabelFor(model => model.Name) %> :
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>
<br>
<%= Html.LabelFor(model => model.WebSite) %> :
<%= Html.TextBox("WebSite") %>
<%= Html.ValidationMessage("WebSite", "*") %></td></tr>
<%= Html.ValidationMessage("WebSite", "*") %>
<br>
<tr><td align="right">
Avatar </td><td> <img class="avatar" src="<%=Model.avatar%>?version=<%=Html.Encode(DateTime.Now.ToString())%>" alt=""/>
Avatar : <img class="avatar" src="<%=Model.avatar%>?version=<%=Html.Encode(DateTime.Now.ToString())%>" alt=""/>
<input type="file" id="AvatarFile" name="AvatarFile"/>
<%= Html.ValidationMessage("AvatarFile", "*") %></td></tr>
<%= Html.ValidationMessage("AvatarFile", "*") %>
</table>
</fieldset>
</fieldset>
<fieldset><legend>Blog</legend>
<table class="layout">
<tr><td align="right">
<%= Html.LabelFor(model => model.BlogVisible) %></td><td>
<%= Html.LabelFor(model => model.BlogVisible) %> :
<%= Html.CheckBox("BlogVisible") %>
<%= Html.ValidationMessage("BlogVisible", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.BlogTitle) %></td><td>
<%= Html.ValidationMessage("BlogVisible", "*") %>
<br>
<%= Html.LabelFor(model => model.BlogTitle) %> :
<%= Html.TextBox("BlogTitle") %>
<%= Html.ValidationMessage("BlogTitle", "*") %></td></tr>
</table>
<%= Html.ValidationMessage("BlogTitle", "*") %>
</fieldset>
<fieldset><legend>Contact</legend>
<table class="layout">
<tr><td align="right">
<%= Html.LabelFor(model => model.Phone) %></td><td>
<%= Html.LabelFor(model => model.Phone) %>
<%= Html.TextBox("Phone") %>
<%= Html.ValidationMessage("Phone", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.Mobile) %></td><td>
<%= Html.ValidationMessage("Phone", "*") %>
<%= Html.LabelFor(model => model.Mobile) %>
<%= Html.TextBox("Mobile") %>
<%= Html.ValidationMessage("Mobile", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.Address) %></td><td>
<%= Html.ValidationMessage("Mobile", "*") %>
<%= Html.LabelFor(model => model.Address) %>
<%= Html.TextBox("Address") %>
<%= Html.ValidationMessage("Address", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.CityAndState) %></td><td>
<%= Html.ValidationMessage("Address", "*") %>
<%= Html.LabelFor(model => model.CityAndState) %>
<%= Html.TextBox("CityAndState") %>
<%= Html.ValidationMessage("CityAndState", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.ZipCode) %></td><td>
<%= Html.ValidationMessage("CityAndState", "*") %>
<%= Html.LabelFor(model => model.ZipCode) %>
<%= Html.TextBox("ZipCode") %>
<%= Html.ValidationMessage("ZipCode", "*") %></td></tr>
<tr><td align="right">
<%= Html.LabelFor(model => model.Country) %></td><td>
<%= Html.ValidationMessage("ZipCode", "*") %>
<%= Html.LabelFor(model => model.Country) %>
<%= Html.TextBox("Country") %>
<%= Html.ValidationMessage("Country", "*") %></td></tr>
</table>
</fieldset>
<fieldset><legend>Disponibilité</legend>
<table class="layout">
<tr><td align="right">
<%= Html.LabelFor(model => model.GoogleCalendar) %>:
</td>
<td> <%= Html.Encode(Model.GoogleCalendar) %>
<%= Html.ValidationMessage("Country", "*") %>
</fieldset>
<fieldset><legend>Disponibilité</legend>
<%= Html.LabelFor(model => model.GoogleCalendar) %> :
<%= Html.Encode(Model.GoogleCalendar) %>
<%= Html.ActionLink("Choisir l'agenda","ChooseCalendar","Google",new { returnUrl= Request.Url.AbsolutePath }, new { @class="actionlink" }) %>
</td>
</tr>
</table>
</fieldset>
<fieldset><legend>Informations de facturation</legend>
<table class="layout">
<tr>
<td align="right">
<%= Html.LabelFor(model => model.BankCode) %>
</td>
<td>
</fieldset>
<fieldset><legend>Informations de facturation</legend>
<%= Html.LabelFor(model => model.BankCode) %> :
<%= Html.TextBox("BankCode") %>
<%= Html.ValidationMessage("BankCode", "*") %>
</td>
</tr>
<tr>
<td align="right">
<%= Html.LabelFor(model => model.WicketCode) %></td>
<td>
<br>
<%= Html.LabelFor(model => model.WicketCode) %> :
<%= Html.TextBox("WicketCode") %>
<%= Html.ValidationMessage("WicketCode", "*") %>
</td>
</tr>
<tr>
<td align="right">
<%= Html.LabelFor(model => model.AccountNumber) %></td>
<td>
<br>
<%= Html.LabelFor(model => model.AccountNumber) %> :
<%= Html.TextBox("AccountNumber") %>
<%= Html.ValidationMessage("AccountNumber", "*") %>
</td>
</tr>
<tr>
<td align="right">
<%= Html.LabelFor(model => model.BankedKey) %></td>
<td>
<br>
<%= Html.LabelFor(model => model.BankedKey) %> :
<%= Html.TextBox("BankedKey") %>
<%= Html.ValidationMessage("BankedKey", "*") %>
</td>
</tr>
<tr>
<td align="right">
<%= Html.LabelFor(model => model.BIC) %></td>
<td>
<br>
<%= Html.LabelFor(model => model.BIC) %> :
<%= Html.TextBox("BIC") %>
<%= Html.ValidationMessage("BIC", "*") %>
</td>
</tr>
<tr>
<td align="right">
<%= Html.LabelFor(model => model.IBAN) %></td>
<td>
<br>
<%= Html.LabelFor(model => model.IBAN) %> :
<%= Html.TextBox("IBAN") %>
<%= Html.ValidationMessage("IBAN", "*") %>
</td>
</tr>
</table>
</fieldset>
</fieldset>
<input type="submit"/>
<% } %>

View file

@ -28,7 +28,9 @@ le <%=p.Posted.ToString("D") %>
<form runat="server" id="form1" method="GET">
<% rp1.ResultCount = Model.Count; rp1.ResultsPerPage = 50; %>
<% rp1.CurrentPage = (int) ViewData["PageIndex"]; %>
<yavsc:ResultPages id="rp1" Action = "?pageIndex={0}" runat="server" ></yavsc:ResultPages>
<% rp1.None = Html.Translate("no content"); %>
<yavsc:ResultPages id="rp1" Action = "?pageIndex={0}" runat="server" >
</yavsc:ResultPages>
</form>
</asp:Content>

View file

@ -0,0 +1,14 @@
<%@ Page Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="initContent" ContentPlaceHolderID="init" runat="server">
</asp:Content>
<asp:Content ID="headContent" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="overHeaderOneContent" ContentPlaceHolderID="overHeaderOne" runat="server">
</asp:Content>
<asp:Content ID="headerContent" ContentPlaceHolderID="header" runat="server">
</asp:Content>
<asp:Content ID="MainContentContent" ContentPlaceHolderID="MainContent" runat="server">
<div>Icons made by <a href="http://www.flaticon.com/authors/vectorgraphit" title="Vectorgraphit">Vectorgraphit</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0">CC BY 3.0</a></div>
</asp:Content>
<asp:Content ID="MASContentContent" ContentPlaceHolderID="MASContent" runat="server">
</asp:Content>

View file

@ -116,6 +116,7 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
<add name="NpgsqlProfileProvider" type="Npgsql.Web.NpgsqlProfileProvider, NpgsqlMRPProviders" connectionStringName="yavsc" applicationName="/" description="ProfileProvider for yavsc" />
</providers>
<properties>
<add name="avatar" />
<add name="BlogVisible" type="System.Boolean" />
<add name="Address" />
<add name="BlogTitle" />
@ -136,7 +137,6 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
<add name="grefreshtoken" />
<add name="gtokentype" />
<add name="gtokenexpir" />
<add name="avatar" />
<add name="gcalapi" />
<add name="gcalid" />
<add name="gregid" />

View file

@ -337,6 +337,8 @@
<Content Include="Scripts\jquery-2.1.4.min.js" />
<Content Include="Scripts\MarkdownDeepLib.min.js" />
<Content Include="Scripts\yavsc.js" />
<Content Include="Scripts\yavsc.circles.js" />
<Content Include="Views\Home\Credits.aspx" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View file

@ -648,31 +648,34 @@ CREATE TABLE histowritting
WITH (
OIDS=FALSE
);
-- Table: circle
-- DROP TABLE circle;
CREATE TABLE circle
(
_id bigserial NOT NULL, -- Circle identifier
owner character varying(255) NOT NULL, -- creator of this circle
applicationname character varying(255) NOT NULL, -- Application name
title character varying(512) NOT NULL,
public boolean default FALSE, -- true when this circle is a public circle, from which the title would be available from an anonymous access to the owner's profile
public boolean DEFAULT false, -- true when this circle is a public circle, from which the title would be available from an anonymous access to the owner's profile
CONSTRAINT circle_pkey PRIMARY KEY (_id),
CONSTRAINT circle_owner_fkey FOREIGN KEY (owner, applicationname)
REFERENCES users (username, applicationname) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT circle_owner_title_key UNIQUE (owner, title)
CONSTRAINT circle_owner_applicationname_title_key UNIQUE (owner, applicationname, title)
)
WITH (
OIDS=FALSE
);
ALTER TABLE circle
OWNER TO yavscdev;
COMMENT ON COLUMN circle._id IS 'Circle identifier';
COMMENT ON COLUMN circle.owner IS 'creator of this circle';
COMMENT ON COLUMN circle.applicationname IS 'Application name';
COMMENT ON COLUMN circle.public IS 'true when this circle is a public circle, from which the title would be available from an anonymous access to the owner''s profile';
-- Table: circle_members
-- DROP TABLE circle_members;