* bg.gif:
* asc.gif:
* desc.gif:
* style.css: moved to App_Themes
* style.css:
* bg.gif:
* asc.gif:
* bg.png:
* rect.png:
* asc.png:
* desc.gif:
* jquery-ui.css:
* mdd_styles.css:
* croix.png:
* desc.png:
* style.css:
* jquery-ui.min.css:
* mdd_gripper.png:
* mdd_toolbar.png:
* jquery.timepicker.css:
* mdd_ajax_loader.gif:
* mdd_modal_background.png: moved to /App_Themes
* NpgsqlBlogProvider.cs: * Remove post by id
* Manage collections of entries on a couple (user,title), not a single
post
* NpgsqlCircleProvider.cs: Fixes the "Match" method.
* IDbModule.cs:
* Edit.aspx:
* Estimates.aspx:
* WorkFlowManager.cs:
* NpgsqlContentProvider.cs: refactoring
* NpgsqlMRPProviders.csproj: new NpgsqlUserName provider
* NpgsqlRoleProvider.cs: simpler init method
* NpgsqlUserNameProvider.cs: impements a UserNameProvider
* MyClass.cs: refactoring from Yavsc.Model
* BlogsController.cs: access control simplified
* FrontOfficeController.cs: Pdf generation made public ni case of
formatting exception
* mdd_styles.css: Theme -> App_Themes
* style.css: yet another style impact
* AccountController.cs: Fixes the user name modification
* BlogsController.cs: * Fixes the removal process
* On a title and user name, we get collection of posts, not only one.
* Implements an Access on circle
* FrontOfficeController.cs: * implements a new Get method.
* ensure a membership existence before delivering an estimate.
* GoogleController.cs: Fixes the user name modification on a Google
account
* ErrorHtmlFormatter.cs: nice error message in html (using Markdown
helper)
* FormatterException.cs: formatter exception exposes error and
standard output of the process
* TexToPdfFormatter.cs: * generates temporary files in the folder
returned by Path.GetTempPath()
* throws FormatterException
* Global.asax.cs: new route map:
Blogs/{action}/{user}/{title}
Blog/{user}/{title}
B/{id}
{controller}/{action}/{id}
* App.master: * refactoring: Theme moved to App_Themes
* a link to the logged user's blog
*
* NoLogin.master: refactoring: Theme moved to App_Themes
* Circles.aspx: refactoring : circles now are given as select items
* Login.aspx: fixes the html presentation
* Register.aspx: Fixes a Typo
* Index.aspx: Implements a blog index, due to M&C changes with this
commit
* RemovePost.aspx: links to the new route to the "RemovePost" action,
giving it a post id
* RemoveTitle.aspx: fixes a not yet linked page to remove a post
collection under a given title
* EventPub.aspx: code refactoring
* Writting.ascx: cleans the code
* Web.config: fills the config with new names in the space
* Web.config: configures the new NpgsqlUserNameProvider
* Web.csproj: refactoring and others
* BlogEntryCollection.cs: implement the BlogEntryCollection
* BlogManager.cs: the manager helps to filter on access
* BlogProvider.cs: The title is not unique anymore, and one can modify
it, post a lot under it, drop all posts under it.
A Post is deleted by id.
* UUBlogEntryCollection.cs: implements a collection of post under a
given user name.
* UUTBlogEntryCollection.cs: implements a collection of post under a
given couple (user name, title).
* ListItem.cs: ListItem is declared obsolete in this model, helpers
can build MVC SelectListItem on data returned by the manager.
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: autogenerated from xml
* LocalizedText.resx:
* LocalizedText.fr.resx: new labels
* ChangeUserNameProvider.cs: xml doc
* Profile.cs: the UserName property is read only, and comes from
authentication, to change it, we set a Name and validate it agains
the "Profile" method
* UserManager.cs: simpler code a init time
* IContentProvider.cs: implements the new IDataProvider interface
* IDataProvider.cs: defines the new IDataProvider interface
* YavscModel.csproj: includes new classes
* UserPosts.aspx: adds a link to remove a post
* UserPost.aspx: now uses the new BlogEntryCollection object
9 years ago
|
|
|
<%@ Page Title="Bill_edition" Language="C#" Inherits="System.Web.Mvc.ViewPage<BlogEntry>" MasterPageFile="~/Models/App.master" %>
|
|
|
|
<%@ Register Assembly="Yavsc.WebControls" TagPrefix="yavsc" Namespace="Yavsc.WebControls" %>
|
|
|
|
<asp:Content ContentPlaceHolderID="head" ID="HeadContent1" runat="server">
|
|
|
|
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/rangy-core.js")%>"></script>
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/rangy-selectionsaverestore.js")%>"></script>
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery.htmlClean.min.js")%>"></script>
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/hallo.js")%>"></script>
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/to-markdown.js")%>"></script>
|
|
|
|
<script type="text/javascript" src="<%=Url.Content("~/Scripts/showdown.js")%>"></script>
|
|
|
|
</asp:Content>
|
|
|
|
|
|
|
|
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server">
|
|
|
|
<span class="placard editable" for="Photo">
|
|
|
|
<img src="<%=Model.Photo%>" alt="photo" id="vphoto" >
|
|
|
|
</span>
|
|
|
|
<!-- TODO? Model.Photo.(Legend|Date|Location|ref) -->
|
|
|
|
<h1 id="vtitle" for="Title" class="editable" ><%=Html.Markdown(Model.Title)%></h1>
|
|
|
|
<div id="vcontent" for="Content" class="editable">
|
|
|
|
<%=Html.Markdown(Model.Content,"/bfiles/"+Model.Id+"/")%>
|
|
|
|
</div>
|
|
|
|
<hr><h2>Fichiers attachées</h2>
|
|
|
|
|
|
|
|
<%= Html.FileList("~/bfiles/"+Model.Id) %>
|
|
|
|
|
|
|
|
<hr>
|
|
|
|
<script>
|
|
|
|
function dumpprops(obj) {
|
|
|
|
var str = "";
|
|
|
|
for(var k in obj)
|
|
|
|
if (obj.hasOwnProperty(k))
|
|
|
|
str += k + " = " + obj[k] + "\n";
|
|
|
|
return (str); }
|
|
|
|
|
|
|
|
$(document).ready(function(){
|
|
|
|
|
|
|
|
$('#hidesource').click(function(){
|
|
|
|
$('#source').addClass('hidden');
|
|
|
|
$('#viewsource').removeClass('hidden');
|
|
|
|
$('#hidesource').addClass('hidden');
|
|
|
|
});
|
|
|
|
$('#viewsource').click(function(){
|
|
|
|
$('#source').removeClass('hidden');
|
|
|
|
$('#viewsource').addClass('hidden');
|
|
|
|
$('#hidesource').removeClass('hidden');
|
|
|
|
});
|
|
|
|
|
|
|
|
jQuery('.placard').hallo({plugins: {'hallo-image-insert-edit': { lang: 'fr' } } });
|
|
|
|
|
|
|
|
jQuery('#vtitle').hallo({
|
|
|
|
plugins: {
|
|
|
|
'halloformat': {},
|
|
|
|
'halloreundo': {}
|
|
|
|
},
|
|
|
|
toolbar: 'halloToolbarFixed',
|
|
|
|
lang: 'fr'
|
|
|
|
});
|
|
|
|
|
|
|
|
jQuery('#vcontent').hallo({
|
|
|
|
plugins: {
|
|
|
|
'halloformat': {},
|
|
|
|
'halloheadings': {},
|
|
|
|
'hallolists': {},
|
|
|
|
'hallo-image-insert-edit': {
|
|
|
|
lang: 'fr'
|
|
|
|
},
|
|
|
|
'halloreundo': {},
|
|
|
|
'hallocleanhtml': {
|
|
|
|
format: false,
|
|
|
|
allowedTags: [
|
|
|
|
'i',
|
|
|
|
'p',
|
|
|
|
'em',
|
|
|
|
'strong',
|
|
|
|
'br',
|
|
|
|
'ol',
|
|
|
|
'ul',
|
|
|
|
'li',
|
|
|
|
'a',
|
|
|
|
'audio',
|
|
|
|
'video',
|
|
|
|
'img',
|
|
|
|
'table',
|
|
|
|
'tr',
|
|
|
|
'td',
|
|
|
|
'th',
|
|
|
|
'style'
|
|
|
|
]
|
|
|
|
},
|
|
|
|
'halloblacklist': {tags: ['style']},
|
|
|
|
},
|
|
|
|
toolbar: 'halloToolbarFixed'
|
|
|
|
});
|
|
|
|
|
|
|
|
var markdownize = function(content) {
|
|
|
|
if (!content) return '';
|
|
|
|
var html = content.split("\n").map($.trim).filter(function(line) {
|
|
|
|
return line != "";
|
|
|
|
}).join("\n");
|
|
|
|
return toMarkdown(html);
|
|
|
|
};
|
|
|
|
|
|
|
|
var converter = new showdown.Converter(),
|
|
|
|
htmlize = function(content) {
|
|
|
|
return converter.makeHtml(content);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Method that converts the HTML contents to Markdown
|
|
|
|
var showSource = function(id,content) {
|
|
|
|
if (!content) content = '';
|
|
|
|
var markdown = markdownize(content);
|
|
|
|
if (jQuery('#'+id).val() === markdown) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
jQuery('#'+id).val( markdown );
|
|
|
|
};
|
|
|
|
|
|
|
|
var updateHtml = function(id,content) {
|
|
|
|
var jView = jQuery('*[for="'+id+'"]');
|
|
|
|
if (markdownize(jView.html()) === content) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var html = htmlize(content);
|
|
|
|
jView.html(html);
|
|
|
|
};
|
|
|
|
|
|
|
|
jQuery('.placard').bind('hallomodified', function(event, data) {
|
|
|
|
// TODO get image source from data.content
|
|
|
|
$('#'+this.attributes["for"].value).val(
|
|
|
|
$('#vphoto').attr('src'));
|
|
|
|
});
|
|
|
|
|
|
|
|
// Update Markdown every time content is modified
|
|
|
|
var onMDModified = ( function (event, data) {
|
|
|
|
showSource(this.attributes["for"].value, data.content);
|
|
|
|
});
|
|
|
|
jQuery('#vtitle').bind('hallomodified', onMDModified);
|
|
|
|
jQuery('#vcontent').bind('hallomodified', onMDModified);
|
|
|
|
|
|
|
|
jQuery('#Content').bind('keyup', function() {
|
|
|
|
updateHtml(this.id, this.value);
|
|
|
|
});
|
|
|
|
jQuery('#Title').bind('keyup', function() {
|
|
|
|
updateHtml(this.id, this.value);
|
|
|
|
});
|
|
|
|
|
|
|
|
showSource("Title",jQuery('#vtitle').html());
|
|
|
|
showSource("Content",jQuery('#vcontent').html());
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
|
|
function submitFilesTo(method)
|
|
|
|
{
|
|
|
|
var data = new FormData($('#frmajax').get()[0]);
|
|
|
|
Yavsc.notice('Submitting via '+method);
|
|
|
|
$.ajax({
|
|
|
|
url: apiBaseUrl+'/Blogs/'+method+'/'+$('#Id').val(),
|
|
|
|
type: "POST",
|
|
|
|
data: data,
|
|
|
|
processData: false,
|
|
|
|
contentType: false,
|
|
|
|
success: function(data) {
|
|
|
|
$('#Content').val(data+"\n"+$('#Content').val());
|
|
|
|
Yavsc.notice(false);
|
|
|
|
},
|
|
|
|
error: Yavsc.onAjaxError,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function submitImport()
|
|
|
|
{ submitFilesTo('Import'); }
|
|
|
|
|
|
|
|
function submitFile()
|
|
|
|
{ submitFilesTo('PostFile'); }
|
|
|
|
|
|
|
|
function submitBaseDoc()
|
|
|
|
{
|
|
|
|
var data = new FormData($('#frmajax').get()[0]);
|
|
|
|
Yavsc.notice('Submitting via '+method);
|
|
|
|
$.ajax({
|
|
|
|
url: apiBaseUrl+'/Blogs/'+method+'/'+$('#Id').val(),
|
|
|
|
type: "POST",
|
|
|
|
data: data,
|
|
|
|
processData: false,
|
|
|
|
contentType: false,
|
|
|
|
success: function(data) {
|
|
|
|
$('#Content').val(data+"\n"+$('#Content').val());
|
|
|
|
Yavsc.notice('Posted updated');
|
|
|
|
},
|
|
|
|
error: Yavsc.onAjaxError,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
</script>
|
|
|
|
<form id="frmajax">
|
|
|
|
<fieldset>
|
|
|
|
<legend>Fichiers attachés</legend>
|
|
|
|
<input type="file" name="attached" id="postedfile" multiple>
|
|
|
|
<input type="button" value="attacher les ficher" onclick="submitFile()">
|
|
|
|
<input type="button" value="importer les documents" onclick="submitImport()">
|
|
|
|
</fieldset>
|
|
|
|
</form>
|
|
|
|
<% using(Html.BeginForm("ValidateEdit","Blogs")) { %>
|
|
|
|
<fieldset>
|
|
|
|
<legend>Contrôle d'accès au Billet</legend>
|
|
|
|
<%= Html.LabelFor(model => model.Visible) %> : <%= Html.CheckBox( "Visible" ) %>
|
|
|
|
<i id="note_visible">Note: Si un ou plusieurs cercles sont séléctionnés ici,
|
|
|
|
le billet ne sera visible qu'aux membres de ces cercles.</i>
|
|
|
|
<%= Html.ValidationMessage("Visible", "*") %>
|
|
|
|
<%= Html.LabelFor(model => model.AllowedCircles) %>
|
|
|
|
<%= Html.ListBox("AllowedCircles") %>
|
|
|
|
<%= Html.ValidationMessage("AllowedCircles", "*") %>
|
|
|
|
</fieldset>
|
|
|
|
<fieldset id="source" class="hidden">
|
|
|
|
<%=Html.Hidden("Author")%>
|
|
|
|
<%=Html.Hidden("Id")%>
|
|
|
|
<%= Html.LabelFor(model => model.Photo) %>
|
|
|
|
<%=Html.TextBox("Photo")%>
|
|
|
|
<%=Html.ValidationMessage("Photo")%><br>
|
|
|
|
<%= Html.LabelFor(model => model.Title) %>
|
|
|
|
<%=Html.TextBox("Title")%>
|
|
|
|
<%=Html.ValidationMessage("Title")%><br>
|
|
|
|
<%=Html.TextArea("Content")%>
|
|
|
|
<%=Html.ValidationMessage("Content")%>
|
|
|
|
</fieldset>
|
|
|
|
<i class="af af-check actionlink"><input type="submit" id="validate" value="Valider"></i>
|
|
|
|
<% } %>
|
|
|
|
|
|
|
|
<span id="viewsource" class="actionlink">
|
|
|
|
<i class="fa fa-code">View Source</i></span>
|
|
|
|
<span id="hidesource" class="actionlink hidden">
|
|
|
|
<i class="fa fa-code">Hide Source</i>
|
|
|
|
</span>
|
|
|
|
<aside>
|
|
|
|
Id:<%= Html.ActionLink( Model.Id.ToString() , "UserPost", new { user= Model.Author, title=Model.Title, id = Model.Id }, new { @class = "usertitleref actionlink" }) %>
|
|
|
|
, Posted: <%= Model.Posted.ToString("yyyy/MM/dd") %> - Modified: <%= Model.Modified.ToString("yyyy/MM/dd") %>
|
|
|
|
Visible: <%= Model.Visible? "oui":"non" %> <%= Html.ActionLink("Supprimer","RemovePost", new { user=Model.Author, title = Model.Title, id = Model.Id }, new { @class="actionlink" } ) %>
|
|
|
|
</aside>
|
|
|
|
|
|
|
|
</asp:Content>
|