latest changes

This commit is contained in:
Dobie Wollert
2014-12-15 02:36:41 -05:00
parent b35bb3f1d5
commit 966152a631
57 changed files with 6842 additions and 42 deletions

View File

@ -43,7 +43,7 @@
.navbar-inner {
background-color: @navbarSecondaryBackground;
min-height: auto;
min-height: 40px;
}
.nav > li {
@ -75,4 +75,4 @@
color: @navbarSecondaryLinkColorActive;
background-color: @navbarSecondaryLinkBackgroundActive;
}
}
}

View File

@ -1,6 +1,7 @@
body {
background-image: url('/img/bodyBg.png');
min-width: 980px;
}
::-webkit-scrollbar {
@ -115,4 +116,4 @@ body::-webkit-scrollbar-corner {
-moz-box-shadow: inset 1px 1px 0 rgba(0,0,0,.14);
-webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,.14);
box-shadow: inset 1px 1px 0 rgba(0,0,0,.14);
}
}

View File

@ -43,4 +43,4 @@
// Sprite icons path
// -------------------------
@iconSpritePath: "/img/glyphicons-halflings.png";
@iconWhiteSpritePath: "/img/glyphicons-halflings-white.png";
@iconWhiteSpritePath: "/img/glyphicons-halflings-white.png";

View File

@ -305,3 +305,417 @@ header {
cursor: pointer;
}
}
/* The MIT License */
.dropzone,
.dropzone *,
.dropzone-previews,
.dropzone-previews * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.dropzone {
position: relative;
border: 1px solid rgba(0,0,0,0.08);
background: rgba(0,0,0,0.02);
padding: 1em;
}
.dropzone.dz-clickable {
cursor: pointer;
}
.dropzone.dz-clickable .dz-message,
.dropzone.dz-clickable .dz-message span {
cursor: pointer;
}
.dropzone.dz-clickable * {
cursor: default;
}
.dropzone .dz-message {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone.dz-drag-hover {
border-color: rgba(0,0,0,0.15);
background: rgba(0,0,0,0.04);
}
.dropzone.dz-started .dz-message {
display: none;
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
background: rgba(255,255,255,0.8);
position: relative;
display: inline-block;
margin: 17px;
vertical-align: top;
border: 1px solid #acacac;
padding: 6px 6px 6px 6px;
}
.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
display: none;
}
.dropzone .dz-preview .dz-details,
.dropzone-previews .dz-preview .dz-details {
width: 100px;
height: 100px;
position: relative;
background: #ebebeb;
padding: 5px;
margin-bottom: 22px;
}
.dropzone .dz-preview .dz-details .dz-filename,
.dropzone-previews .dz-preview .dz-details .dz-filename {
overflow: hidden;
height: 100%;
}
.dropzone .dz-preview .dz-details img,
.dropzone-previews .dz-preview .dz-details img {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
}
.dropzone .dz-preview .dz-details .dz-size,
.dropzone-previews .dz-preview .dz-details .dz-size {
position: absolute;
bottom: -28px;
left: 3px;
height: 28px;
line-height: 28px;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
display: block;
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
display: block;
}
.dropzone .dz-preview:hover .dz-details img,
.dropzone-previews .dz-preview:hover .dz-details img {
display: none;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark,
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
display: none;
position: absolute;
width: 40px;
height: 40px;
font-size: 30px;
text-align: center;
right: -10px;
top: -10px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
color: #8cc657;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
color: #ee162d;
}
.dropzone .dz-preview .dz-progress,
.dropzone-previews .dz-preview .dz-progress {
position: absolute;
top: 100px;
left: 6px;
right: 6px;
height: 6px;
background: #d7d7d7;
display: none;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 0%;
background-color: #8cc657;
}
.dropzone .dz-preview.dz-processing .dz-progress,
.dropzone-previews .dz-preview.dz-processing .dz-progress {
display: block;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
display: none;
position: absolute;
top: -5px;
left: -20px;
background: rgba(245,245,245,0.8);
padding: 8px 10px;
color: #800;
min-width: 140px;
max-width: 500px;
z-index: 500;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
display: block;
}
.dropzone {
border: 1px solid rgba(0,0,0,0.03);
min-height: 360px;
-webkit-border-radius: 3px;
border-radius: 3px;
background: rgba(0,0,0,0.03);
padding: 23px;
}
.dropzone .dz-default.dz-message {
opacity: 1;
-ms-filter: none;
filter: none;
-webkit-transition: opacity 0.3s ease-in-out;
-moz-transition: opacity 0.3s ease-in-out;
-o-transition: opacity 0.3s ease-in-out;
-ms-transition: opacity 0.3s ease-in-out;
transition: opacity 0.3s ease-in-out;
background-image: url("/img/spritemap.png");
background-repeat: no-repeat;
background-position: 0 0;
position: absolute;
width: 428px;
height: 123px;
margin-left: -214px;
margin-top: -61.5px;
top: 50%;
left: 50%;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-default.dz-message {
background-image: url("/img/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-default.dz-message span {
display: none;
}
.dropzone.dz-square .dz-default.dz-message {
background-position: 0 -123px;
width: 268px;
margin-left: -134px;
height: 174px;
margin-top: -87px;
}
.dropzone.dz-drag-hover .dz-message {
opacity: 0.15;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)";
filter: alpha(opacity=15);
}
.dropzone.dz-started .dz-message {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
-webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
font-size: 14px;
}
.dropzone .dz-preview.dz-image-preview:hover .dz-details img,
.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {
display: block;
opacity: 0.1;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
filter: alpha(opacity=10);
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone .dz-preview.dz-error .dz-progress .dz-upload,
.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {
background: #ee1e2d;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark,
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.4s ease-in-out;
-moz-transition: opacity 0.4s ease-in-out;
-o-transition: opacity 0.4s ease-in-out;
-ms-transition: opacity 0.4s ease-in-out;
transition: opacity 0.4s ease-in-out;
background-image: url("/img/spritemap.png");
background-repeat: no-repeat;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark,
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
background-image: url("/img/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-preview .dz-error-mark span,
.dropzone-previews .dz-preview .dz-error-mark span,
.dropzone .dz-preview .dz-success-mark span,
.dropzone-previews .dz-preview .dz-success-mark span {
display: none;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
background-position: -268px -123px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
background-position: -268px -163px;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
-webkit-animation: loading 0.4s linear infinite;
-moz-animation: loading 0.4s linear infinite;
-o-animation: loading 0.4s linear infinite;
-ms-animation: loading 0.4s linear infinite;
animation: loading 0.4s linear infinite;
-webkit-transition: width 0.3s ease-in-out;
-moz-transition: width 0.3s ease-in-out;
-o-transition: width 0.3s ease-in-out;
-ms-transition: width 0.3s ease-in-out;
transition: width 0.3s ease-in-out;
-webkit-border-radius: 2px;
border-radius: 2px;
position: absolute;
top: 0;
left: 0;
width: 0%;
height: 100%;
background-image: url("/img/spritemap.png");
background-repeat: repeat-x;
background-position: 0px -400px;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
background-image: url("/img/spritemap@2x.png");
-webkit-background-size: 428px 406px;
-moz-background-size: 428px 406px;
background-size: 428px 406px;
}
}
.dropzone .dz-preview.dz-success .dz-progress,
.dropzone-previews .dz-preview.dz-success .dz-progress {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.4s ease-in-out;
-moz-transition: opacity 0.4s ease-in-out;
-o-transition: opacity 0.4s ease-in-out;
-ms-transition: opacity 0.4s ease-in-out;
transition: opacity 0.4s ease-in-out;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
display: block;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
-webkit-transition: opacity 0.3s ease-in-out;
-moz-transition: opacity 0.3s ease-in-out;
-o-transition: opacity 0.3s ease-in-out;
-ms-transition: opacity 0.3s ease-in-out;
transition: opacity 0.3s ease-in-out;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
opacity: 1;
-ms-filter: none;
filter: none;
}
.dropzone a.dz-remove,
.dropzone-previews a.dz-remove {
background-image: -webkit-linear-gradient(top, #fafafa, #eee);
background-image: -moz-linear-gradient(top, #fafafa, #eee);
background-image: -o-linear-gradient(top, #fafafa, #eee);
background-image: -ms-linear-gradient(top, #fafafa, #eee);
background-image: linear-gradient(to bottom, #fafafa, #eee);
-webkit-border-radius: 2px;
border-radius: 2px;
border: 1px solid #eee;
text-decoration: none;
display: block;
padding: 4px 5px;
text-align: center;
color: #aaa;
margin-top: 26px;
}
.dropzone a.dz-remove:hover,
.dropzone-previews a.dz-remove:hover {
color: #666;
}
@-moz-keyframes loading {
from {
background-position: 0 -400px;
}
to {
background-position: -7px -400px;
}
}
@-webkit-keyframes loading {
from {
background-position: 0 -400px;
}
to {
background-position: -7px -400px;
}
}
@-o-keyframes loading {
from {
background-position: 0 -400px;
}
to {
background-position: -7px -400px;
}
}
@keyframes loading {
from {
background-position: 0 -400px;
}
to {
background-position: -7px -400px;
}
}

42
public/css/site.css Normal file
View File

@ -0,0 +1,42 @@
body {
min-width: initial;
}
input {
width: 100% !important;
box-sizing: border-box;
}
button {
width: 100% !important;
}
textarea {
width: 100% !important;
height: 300px;
box-sizing: border-box;
}
.dropzone {
min-height: initial !important;
}
.dz-message {
background-image: none !important;
position: initial !important;
width: initial !important;
height: initial !important;
margin-left: initial !important;
margin-top: initial !important;
}
.dz-message span {
display: block !important;
font-size: 24px;
text-align: center;
}
h1.msg {
text-align: center;
}

BIN
public/img/spritemap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
public/img/spritemap@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -73,6 +73,18 @@ angular.module('biomed', ['biomed.filters', 'biomed.services', 'biomed.directive
templateUrl: '/partials/techs/schedule.html',
controller: biomed.TechScheduleCtrl
})
.when('/posts', {
templateUrl: '/partials/posts/index.html',
controller: biomed.PostIndexCtrl
})
.when('/posts/add', {
templateUrl: '/partials/posts/add.html',
controller: biomed.PostAddCtrl
})
.when('/posts/:id', {
templateUrl: '/partials/posts/edit.html',
controller: biomed.PostEditCtrl
})
.when('/admin', {
templateUrl: '/partials/users/index.html',
controller: biomed.UsersIndexCtrl,

View File

@ -174,13 +174,206 @@ biomed.UsersIndexCtrl = function($scope, $filter, $routeParams, $location, Users
biomed.UserClockCtrl = function($scope, $routeParams, Users) {
Users.index({userid: $routeParams.id}, function(result) {
console.log(result);
$scope.tech = result[0];
});
$scope.clocks = Users.clocks($routeParams);
};
biomed.PostIndexCtrl = function($scope, $routeParams, Posts, LocationBinder) {
$scope.loading = true;
$scope.posts = Posts.index(function() {
$scope.loading = false;
});
};
biomed.PostAddCtrl = function($scope, Posts, $location) {
$scope.model = {
gallery: []
};
$scope.titleImageOptions = {
options: {
url: '/api/posts/upload',
maxFiles: 1,
addRemoveLinks: true
},
eventHandlers: {
success: function(file, response) {
console.log('adding file');
$scope.$apply(function() {
$scope.model.image = response.filename;
});
},
removedfile: function(file) {
console.log('removing file');
$scope.$apply(function() {
$scope.model.image = undefined;
});
},
maxfilesexceeded: function(file) {
this.removeAllFiles();
this.addFile(file);
}
}
};
var galleryImages = {};
$scope.galleryImageOptions = {
options: {
url: '/api/posts/upload',
addRemoveLinks: true
},
eventHandlers: {
success: function(file, response) {
console.log('Adding File');
file.filename = response.filename;
if (galleryImages[file.filename]) {
galleryImages[file.filename]++;
this.removeFile(file);
} else {
galleryImages[file.filename] = 1;
}
},
removedfile: function(file) {
console.log('Removing File');
galleryImages[file.filename]--;
if (galleryImages[file.filename] <= 0) {
delete galleryImages[file.filename];
}
}
}
};
var save = function(status) {
$scope.model.gallery = Object.keys(galleryImages);
$scope.model.status = status;
$scope.model.createdOn = new Date();
if (status === 'posted') {
$scope.model.postedOn = new Date();
}
Posts.create($scope.model, function(result) {
$location.path("/posts/" + result._id);
});
}
$scope.saveAsDraft = function() {
save('draft');
};
$scope.saveAsPosted = function() {
save('posted');
};
};
biomed.PostEditCtrl = function($scope, Posts, $routeParams, $location) {
var galleryImages = {};
$scope.model = Posts.get($routeParams, function() {
$scope.loading = false;
if ($scope.model.image) {
$scope.existingTitleImages = [$scope.model.image];
}
$scope.existingGalleryImages = $scope.model.gallery;
for (var i = 0; i < $scope.model.gallery.length; i++) {
galleryImages[$scope.model.gallery[i]] = 1;
}
});
$scope.titleImageOptions = {
options: {
url: '/api/posts/upload',
maxFiles: 1,
addRemoveLinks: true,
existing: []
},
eventHandlers: {
success: function(file, response) {
console.log('adding file');
$scope.$apply(function() {
$scope.model.image = response.filename;
});
},
removedfile: function(file) {
console.log('removing file');
$scope.$apply(function() {
$scope.model.image = undefined;
});
},
maxfilesexceeded: function(file) {
this.removeAllFiles();
this.addFile(file);
}
}
};
$scope.galleryImageOptions = {
options: {
url: '/api/posts/upload',
addRemoveLinks: true,
existing: []
},
eventHandlers: {
success: function(file, response) {
console.log('Adding File');
file.filename = response.filename;
if (galleryImages[file.filename]) {
galleryImages[file.filename]++;
this.removeFile(file);
} else {
galleryImages[file.filename] = 1;
}
},
removedfile: function(file) {
console.log('Removing File');
galleryImages[file.filename]--;
if (galleryImages[file.filename] <= 0) {
delete galleryImages[file.filename];
}
}
}
};
var save = function(status) {
$scope.model.gallery = Object.keys(galleryImages);
$scope.model.status = status;
if (status === 'posted') {
$scope.model.postedOn = new Date();
} else {
$scope.model.postedOn = null;
}
Posts.update({id: $scope.model._id}, $scope.model, function(result) {
$location.path("/posts/");
});
}
$scope.saveAsDraft = function() {
save('draft');
};
$scope.saveAsPosted = function() {
save('posted');
};
$scope.saveAsArchived = function() {
save('archived');
};
};
biomed.ClientIndexCtrl = function($scope, $filter, $routeParams, Clients, LocationBinder) {
$scope.loading = true;
@ -347,7 +540,7 @@ biomed.ClientEditCtrl = function($scope, $routeParams, Clients) {
}
$scope.toggleFrequency = function(frequency, month) {
if (accountHasPermission('system.edit')) {
if ($scope.accountHasPermission('system.edit')) {
$scope.master.frequencies[frequency][month] =! $scope.master.frequencies[frequency][month];
Clients.update({id: $scope.master._id}, $scope.master, function() {
updatePms();
@ -822,7 +1015,6 @@ biomed.PageCtrl = function($scope, $dialog, Account) {
};
$scope.accountHasPermission = function(perm) {
console.log($scope);
if ($scope.account && $scope.account.perms) {
return $scope.account.perms.indexOf(perm) > -1;
}

View File

@ -787,4 +787,36 @@ angular.module('biomed.directives', [])
};
}
};
})
.directive('dropzone', function() {
return {
scope: {
dropzone: '=',
existing: '='
},
controller: function($scope, $element, $attrs) {
var config, dropzone;
config = $scope.dropzone;
dropzone = new Dropzone($element[0], config.options);
angular.forEach(config.eventHandlers, function (handler, event) {
dropzone.on(event, handler);
});
$scope.$watch('existing', function() {
var existing = $scope.existing;
console.log(dropzone);
if (existing) {
for (var i = 0; i < existing.length; i++) {
var file = { name: existing[i], size: 0, accepted: true, filename: existing[i] };
dropzone.options.addedfile.call(dropzone, file);
dropzone.options.thumbnail.call(dropzone, file, "http://atlanticbiomedical.com/images/" + existing[i]);
dropzone.files.push(file);
}
}
});
}
};
});

1874
public/js/lib/dropzone.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,17 @@ angular.module('biomed.services', [])
tags: { method: 'GET', params: { id: 0, cmd: 'tags' }, isArray: true }
});
})
.factory("Posts", function($resource) {
return $resource('/api/posts/:id',
{ id: "@id" },
{
index: { method: 'GET', params: {}, isArray: true },
get: { method: 'GET', params: { id: 0} },
create: { method: 'POST', params: {} },
update: { method: 'POST', params: { id: 0} },
destroy: { method: 'DELETE', params: { id: 0 } },
});
})
.factory("Workorders", function($resource) {
return $resource('/api/workorders/:id',
{ id: "@id" },

View File

@ -0,0 +1,61 @@
<ul class="breadcrumb">
<li><a href="/posts"><i class="icon-briefcase"></i> Posts</a><span class="divider"></span><li>
<li class="active">New Post<li>
</ul>
<header>
<h1>New Post</h1>
</header>
<div class="form">
<div class="form-section">
<div class="section-label">Post</div>
<div class="section-container">
<div class="form-editor">
<div class="control-group">
<label class="control-label">Title</label>
<div class="controls">
<input ng-model="model.title" class="input-xlarge">
</div>
</div>
<div class="control-group">
<label class="control-label">Body</label>
<div class="controls">
<textarea ng-model="model.preview" class="input-xlarge"></textarea>
</div>
</div>
<div class="control-group">
<label class="control-label">Extended</label>
<div class="controls">
<textarea ng-model="model.details" class="input-xlarge"></textarea>
</div>
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="section-label">Images</div>
<div class="section-container">
<div class="form-editor">
<div class="control-group">
<label class="control-label">Title Image</label>
<div class="controls">
<div class="dropzone" dropzone="titleImageOptions"></div>
</div>
</div>
<div class="control-group">
<label class="control-label">Gallery</label>
<div class="controls">
<div class="dropzone" dropzone="galleryImageOptions"></div>
</div>
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="section-label">&nbsp;</div>
<div class="section-container">
<button ng-click="saveAsDraft()" type="button" class="btn btn-primary">Save as Draft</button>
<button ng-click="saveAsPosted()" type="button" class="btn">Save as Posted</button>
</div>
</div>
</div>

View File

@ -0,0 +1,62 @@
<ul class="breadcrumb">
<li><a href="/posts"><i class="icon-briefcase"></i> Posts</a><span class="divider"></span><li>
<li class="active">New Post<li>
</ul>
<header>
<h1>Edit Post</h1>
</header>
<div class="form">
<div class="form-section">
<div class="section-label">Post</div>
<div class="section-container">
<div class="form-editor">
<div class="control-group">
<label class="control-label">Title</label>
<div class="controls">
<input ng-model="model.title" class="input-xlarge">
</div>
</div>
<div class="control-group">
<label class="control-label">Body</label>
<div class="controls">
<textarea ng-model="model.preview" class="input-xlarge"></textarea>
</div>
</div>
<div class="control-group">
<label class="control-label">Extended</label>
<div class="controls">
<textarea ng-model="model.details" class="input-xlarge"></textarea>
</div>
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="section-label">Images</div>
<div class="section-container">
<div class="form-editor">
<div class="control-group">
<label class="control-label">Title Image</label>
<div class="controls">
<div class="dropzone" dropzone="titleImageOptions" existing="existingTitleImages"></div>
</div>
</div>
<div class="control-group">
<label class="control-label">Gallery</label>
<div class="controls">
<div class="dropzone" dropzone="galleryImageOptions" existing="existingGalleryImages"></div>
</div>
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="section-label">&nbsp;</div>
<div class="section-container">
<button ng-click="saveAsDraft()" type="button" class="btn btn-primary">Save as Draft</button>
<button ng-click="saveAsPosted()" type="button" class="btn">Save as Posted</button>
<button ng-click="saveAsArchived()" type="button" class="btn">Save as Archived</button>
</div>
</div>
</div>

View File

@ -0,0 +1,41 @@
<ul class="breadcrumb">
<li><a href="/posts"><i class="icon-briefcase"></i> Posts</a><li>
</ul>
<header>
<h1>Posts</h1>
</header>
<div class="row-fluid">
<div class="span12">
<div class="toolbelt">
<a href="/posts/add" class="btn btn-primary">Create new Post</a>
</div>
<table class="biomed-table" infinite-scroll="addItems()" can-load="canLoad" threshold="300">
<thead>
<tr>
<th style="width: 5%">Title</th>
<th style="width: 5%">Author</th>
<th style="width: 5%">Created on</th>
<th style="width: 5%">Posted on</th>
<th style="width: 5%">Status</th>
</tr>
</thead>
<tbody>
<tr ng-show="loading"><td colspan="4" class="table-loading"><i class="loader"></i></td></tr>
<tr ng-hide="loading || posts.length"><td colspan="4" class="table-message">There is no information to display.</td></tr>
<tr ng-hide="loading" ng-repeat="post in posts">
<td>
<a href="/posts/{{post._id}}">
<span ng-show="post.title">{{post.title}}</span>
<span ng-hide="post.title"><i>Missing Title</i></span>
</a>
</td>
<td>{{post.author.name.first}} {{post.author.name.last}}</td>
<td>{{post.createdOn | date:'medium'}}</td>
<td>{{post.postedOn | date:'medium'}}</td>
<td>{{post.status}}</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -21,7 +21,7 @@
<tr>
<th colspan="2"></th>
<th colspan="5">Groups</th>
<th colspan="5">Permissions</th>
<th colspan="6">Permissions</th>
</tr>
<tr>
<th style="width: 15%">Name</th>
@ -35,11 +35,12 @@
<th style="width: 5%">Tags</th>
<th style="width: 5%">Messages</th>
<th style="width: 5%">Edit</th>
<th style="width: 5%">Site</th>
<th style="width: 5%">Admin</th>
</tr>
</thead>
<tbody>
<tr ng-show="loading"><td colspan="11" class="table-loading"><i class="loader"></i></td></tr>
<tr ng-show="loading"><td colspan="13" class="table-loading"><i class="loader"></i></td></tr>
<tr ng-hide="loading || users.length"><td colspan="11" class="table-message">There is no information to display.</td></tr>
<tr ng-hide="loading" ng-repeat="user in users">
<td class="name"><a href="/admin/users/{{user._id}}">{{user.name.first}} {{user.name.last}}</a> <span class="new" ng-show="isNew(user)">NEW</span></td>
@ -54,6 +55,7 @@
<td class="{{ checkPerm(user, 'system.tags') }}"><a ng-click="togglePerm(user, 'system.tags')"><i ng-class="{ 'icon-ok': checkPerm(user, 'system.tags'), 'icon-remove': !checkPerm(user, 'system.tags')}"></i></a></td>
<td class="{{ checkPerm(user, 'messages.receive') }}"><a ng-click="togglePerm(user, 'messages.receive')"><i ng-class="{ 'icon-ok': checkPerm(user, 'messages.receive'), 'icon-remove': !checkPerm(user, 'messages.receive')}"></i></a></td>
<td class="{{ checkPerm(user, 'system.edit') }}"><a ng-click="togglePerm(user, 'system.edit')"><i ng-class="{ 'icon-ok': checkPerm(user, 'system.edit'), 'icon-remove': !checkPerm(user, 'system.edit')}"></i></a></td>
<td class="{{ checkPerm(user, 'system.site') }}"><a ng-click="togglePerm(user, 'system.site')"><i ng-class="{ 'icon-ok': checkPerm(user, 'system.site'), 'icon-remove': !checkPerm(user, 'system.site')}"></i></a></td>
<td class="{{ checkPerm(user, 'system.admin') }}"><a ng-click="togglePerm(user, 'system.admin')"><i ng-class="{ 'icon-ok': checkPerm(user, 'system.admin'), 'icon-remove': !checkPerm(user, 'system.admin')}"></i></a></td>
</tr>
</tbody>

126
public/site/app.js Normal file
View File

@ -0,0 +1,126 @@
site = {};
angular.module('site', ['ngResource'])
.factory("Posts", function($resource) {
return $resource('/api/posts/:id',
{ id: "@id" },
{
index: { method: 'GET', params: {}, isArray: true },
get: { method: 'GET', params: { id: 0} },
create: { method: 'POST', params: {} },
update: { method: 'POST', params: { id: 0} },
destroy: { method: 'DELETE', params: { id: 0 } },
});
})
.directive('dropzone', function() {
return {
scope: {
dropzone: '=',
existing: '='
},
controller: function($scope, $element, $attrs) {
var config, dropzone;
config = $scope.dropzone;
dropzone = new Dropzone($element[0], config.options);
angular.forEach(config.eventHandlers, function (handler, event) {
dropzone.on(event, handler);
});
$scope.$watch('existing', function() {
var existing = $scope.existing;
console.log(dropzone);
if (existing) {
for (var i = 0; i < existing.length; i++) {
var file = { name: existing[i], size: 0, accepted: true, filename: existing[i] };
dropzone.options.addedfile.call(dropzone, file);
dropzone.options.thumbnail.call(dropzone, file, "http://atlanticbiomedical.com/images/" + existing[i]);
dropzone.files.push(file);
}
}
});
}
};
});
site.PageCtrl = function($scope, Posts, $location) {
$scope.model = {
gallery: []
};
$scope.titleImageOptions = {
options: {
url: '/api/posts/upload',
maxFiles: 1,
addRemoveLinks: true
},
eventHandlers: {
success: function(file, response) {
console.log('adding file');
$scope.$apply(function() {
$scope.model.image = response.filename;
});
},
removedfile: function(file) {
console.log('removing file');
$scope.$apply(function() {
$scope.model.image = undefined;
});
},
maxfilesexceeded: function(file) {
this.removeAllFiles();
this.addFile(file);
}
}
};
var galleryImages = {};
$scope.galleryImageOptions = {
options: {
url: '/api/posts/upload',
addRemoveLinks: true
},
eventHandlers: {
success: function(file, response) {
console.log('Adding File');
file.filename = response.filename;
if (galleryImages[file.filename]) {
galleryImages[file.filename]++;
this.removeFile(file);
} else {
galleryImages[file.filename] = 1;
}
},
removedfile: function(file) {
console.log('Removing File');
galleryImages[file.filename]--;
if (galleryImages[file.filename] <= 0) {
delete galleryImages[file.filename];
}
}
}
};
$scope.save = function() {
$scope.model.gallery = Object.keys(galleryImages);
$scope.model.status = "draft";
$scope.model.createdOn = new Date();
Posts.create($scope.model, function(result) {
$scope.saved = true;
});
};
$scope.refresh = function() {
window.location.reload();
}
}

1874
public/site/dropzone.js Normal file

File diff suppressed because it is too large Load Diff