red_base 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -10
- data/app/assets/javascripts/red_base/dashboard/app.js +10 -2
- data/app/assets/javascripts/red_base/dashboard/lib/ng-quick-date.js +297 -0
- data/app/assets/javascripts/red_base/dashboard/locale/translations.js~ +4 -0
- data/app/assets/javascripts/red_base/dashboard/modules/auth/user.js +1 -1
- data/app/assets/javascripts/red_base/dashboard/modules/list-view.js~ +20 -0
- data/app/assets/javascripts/red_base/dashboard/modules/user.js~ +4 -0
- data/app/assets/javascripts/red_base/dashboard/templates/application.handlebars.erb~ +39 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/groups/details.handlebars.erb~ +15 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/groups/index.handlebars.erb~ +7 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/index.handlebars.erb~ +4 -0
- data/app/assets/javascripts/red_base/dashboard/{init.js~ → templates/auth/users/details.handlebars.erb~} +0 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/users/index.handlebars.erb~ +7 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/users/new.handlebars.erb~ +1 -0
- data/app/assets/javascripts/red_base/dashboard/templates/auth/users/new.handlebars~ +1 -0
- data/app/assets/javascripts/red_base/dashboard/templates/components/model-form.handlebars.erb~ +1 -0
- data/app/assets/javascripts/red_base/dashboard/templates/components/model-from.handlebars.erb~ +1 -0
- data/app/assets/javascripts/red_base/i18n.js~ +2 -0
- data/app/assets/javascripts/red_base/locale/fa.json~ +27 -0
- data/app/assets/stylesheets/red_base/#base.css.scss# +403 -0
- data/app/assets/stylesheets/red_base/application.ltr.css~ +4 -0
- data/app/assets/stylesheets/red_base/application.rtl.css~ +4 -0
- data/app/assets/stylesheets/red_base/dashboard/ltr/application.css +2 -0
- data/app/assets/stylesheets/red_base/dashboard/ltr/application.css~ +19 -0
- data/app/assets/stylesheets/red_base/dashboard/ltr/buttons.css.scss.erb~ +48 -0
- data/app/assets/stylesheets/red_base/dashboard/ltr/direction.css.scss~ +14 -0
- data/app/assets/stylesheets/red_base/dashboard/ltr/foundation_and_overrides.css.scss~ +1039 -0
- data/app/assets/stylesheets/red_base/dashboard/ng-quick-date-default-theme.css.scss +20 -0
- data/app/assets/stylesheets/red_base/dashboard/ng-quick-date.css.scss +19 -0
- data/app/assets/stylesheets/red_base/foundation_and_overrides.ltr.scss.erb~ +1012 -0
- data/app/assets/stylesheets/red_base/foundation_and_overrides.rtl.scss.erb~ +1012 -0
- data/app/assets/{stylesheets/red_base/dashboard/rtl/base.css.scss~ → templates/list-view/index.html~} +0 -0
- data/app/assets/templates/modules.html~ +1 -0
- data/app/controllers/red_base/omniauth/callbacks_controller.rb~ +46 -0
- data/app/views/angularjs_templates/#index.html# +8 -0
- data/app/views/layouts/red_base/dashboard.html.erb~ +17 -0
- data/config/initializers/fast_gettext.rb~ +4 -0
- data/lib/generators/red_base/js_scaffold_generator.rb +1 -0
- data/lib/generators/red_base/templates/angularjs/index.html.erb +1 -1
- data/lib/generators/red_base/templates/angularjs/new.html.erb +5 -1
- data/lib/generators/red_base/templates/fast_gettext.rb~ +4 -0
- data/lib/red_base/dashboard/{module.rb~ → controller.rb~} +2 -2
- data/lib/red_base/omniauth/callbacks.rb~ +44 -0
- data/lib/red_base/version.rb +1 -1
- data/lib/tasks/gettext.rb~ +7 -0
- data/{lib/generators/red_base/templates/angularjs/details.html.erb~ → spec/dummy/db/test.sqlite3} +0 -0
- data/{lib/generators/red_base/templates/views/index.json.jbuilder.erb~ → spec/dummy/log/development.log} +0 -0
- data/spec/dummy/log/test.log +15 -0
- data/spec/dummy/tmp/ember-rails/ember-data.js +10204 -0
- data/spec/dummy/tmp/ember-rails/ember.js +36991 -0
- metadata +246 -216
- data/app/assets/stylesheets/red_base/dashboard/ltr/base.css.scss~ +0 -15
- data/app/assets/stylesheets/red_base/mixins.css.scss~ +0 -7
- data/app/controllers/red_base/users/omniauth_callbacks_controller.rb~ +0 -2
- data/app/views/angularjs_templates/nav.html.erb~ +0 -43
- data/lib/devise_patch.rb~ +0 -5
- data/lib/generators/red_base/templates/README~ +0 -4
- data/lib/generators/red_base/templates/api/controller.rb.erb~ +0 -37
- data/lib/generators/red_base/templates/red_base.rb~ +0 -251
- data/lib/red_base/active_record.rb~ +0 -0
- data/lib/red_base/dashboard.rb~ +0 -18
- data/lib/red_base/omniauth.rb~ +0 -1
- data/lib/red_base/omniauth/callbakcs.rb~ +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 625f6ddeb49abf49aaa741b3ee142d807727c1bb
|
4
|
+
data.tar.gz: 710c799f08341f0c52a92cf5fc3de86b173c6979
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 510f3184262feb9d751988935abe7c74aec8ae2e928ae1e1e1838b390fee83d76e29c5667f9e575bdb585e2f68b1f86bbbefd40289bad98bc3c1c7f1370c8a0a
|
7
|
+
data.tar.gz: d731ba3e54fc1e09403ecb960dcce8c0c83a07d9e46de4ae3f30177a5e3b5dda4f7e3207bc6649b0d95e3ee7775b300db403f71b3b78a8d5aa1994179c6db7a7
|
data/README.md
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
{<img src="https://badge.fury.io/rb/red_base.png" alt="Gem Version" />}[http://badge.fury.io/rb/red_base]
|
1
|
+
# RedBase [![Gem Version](https://badge.fury.io/rb/red_base.png)](http://badge.fury.io/rb/red_base)
|
4
2
|
|
5
3
|
RedBase is a ruby on rails engine which provides a basic features of a web application. It provide a very
|
6
4
|
robust dashboard subsystem with some fantastic generators which provide rapid productivity.
|
7
5
|
|
8
|
-
|
6
|
+
## Dependencies
|
9
7
|
|
10
8
|
* Add this to your Gemfile:
|
11
9
|
|
10
|
+
```ruby
|
12
11
|
group :development, :test do
|
13
12
|
gem 'rspec-rails', '~> 3.0.0.beta'
|
14
13
|
gem "capybara"
|
@@ -17,13 +16,14 @@ group :development, :test do
|
|
17
16
|
gem "email_spec"
|
18
17
|
gem "cucumber-rails", :require => false
|
19
18
|
end
|
19
|
+
```
|
20
20
|
|
21
|
-
|
21
|
+
## Installation
|
22
22
|
|
23
23
|
1. Add this to your `config/environments/development.rb`
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
|
26
|
+
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
|
27
27
|
```
|
28
28
|
|
29
29
|
In production, :host should be set to the actual host of your application.
|
@@ -31,10 +31,10 @@ In production, :host should be set to the actual host of your application.
|
|
31
31
|
2. Ensure you have flash messages in app/views/layouts/application.html.erb.
|
32
32
|
For example (Only if you want to change default layout):
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
```rhtml
|
35
|
+
<p class="notice"><%= notice %></p>
|
36
|
+
<p class="alert"><%= alert %></p>
|
37
|
+
```
|
38
38
|
|
39
39
|
|
40
40
|
3. Perfrom `rails generate red_base:install_all` to copy necessary files.
|
@@ -22,7 +22,7 @@
|
|
22
22
|
//= require_self
|
23
23
|
//= require ./locale/translations
|
24
24
|
|
25
|
-
var dependencies = ["gettext", "Modules", "Navigation", "ngAnimate", "ngRoute", "restangular"].concat(dashboard_dependencies);
|
25
|
+
var dependencies = ["gettext", "Modules", "Navigation", "ngAnimate", "ngRoute", "restangular", "ngQuickDate"].concat(dashboard_dependencies);
|
26
26
|
|
27
27
|
console.log("Dashboard dependencies:");
|
28
28
|
console.log(dependencies);
|
@@ -37,7 +37,15 @@ Dashboard.config(['$routeProvider', function($routeProvider) {
|
|
37
37
|
|
38
38
|
}]);
|
39
39
|
|
40
|
-
Dashboard.config(["RestangularProvider", "$httpProvider", function(RestangularProvider, $httpProvider) {
|
40
|
+
Dashboard.config(["RestangularProvider", "$httpProvider", "ngQuickDateDefaultsProvider", function(RestangularProvider, $httpProvider, ngQuickDateDefaultsProvider) {
|
41
|
+
|
42
|
+
ngQuickDateDefaultsProvider.set({
|
43
|
+
closeButtonHtml: "<i class='fa fa-times'></i>",
|
44
|
+
buttonIconHtml: "<i class='fa fa-calendar'></i>",
|
45
|
+
nextLinkHtml: "<i class='fa fa-chevron-right'></i>",
|
46
|
+
prevLinkHtml: "<i class='fa fa-chevron-left'></i>"
|
47
|
+
});
|
48
|
+
|
41
49
|
RestangularProvider.setBaseUrl('/api/v1');
|
42
50
|
|
43
51
|
$httpProvider.defaults.headers.common.lang = $("html").attr("lang");
|
@@ -0,0 +1,297 @@
|
|
1
|
+
(function() {
|
2
|
+
var app;
|
3
|
+
|
4
|
+
app = angular.module("ngQuickDate", []);
|
5
|
+
|
6
|
+
app.provider("ngQuickDateDefaults", function() {
|
7
|
+
return {
|
8
|
+
options: {
|
9
|
+
dateFormat: 'M/d/yyyy',
|
10
|
+
timeFormat: 'h:mm a',
|
11
|
+
labelFormat: null,
|
12
|
+
placeholder: 'Click to Set Date',
|
13
|
+
hoverText: null,
|
14
|
+
buttonIconHtml: null,
|
15
|
+
closeButtonHtml: 'X',
|
16
|
+
nextLinkHtml: 'Next',
|
17
|
+
prevLinkHtml: 'Prev',
|
18
|
+
disableTimepicker: false,
|
19
|
+
disableClearButton: false,
|
20
|
+
dayAbbreviations: ["Su", "M", "Tu", "W", "Th", "F", "Sa"],
|
21
|
+
parseDateFunction: function(str) {
|
22
|
+
var seconds;
|
23
|
+
seconds = Date.parse(str);
|
24
|
+
if (isNaN(seconds)) {
|
25
|
+
return null;
|
26
|
+
} else {
|
27
|
+
return new Date(seconds);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
},
|
31
|
+
$get: function() {
|
32
|
+
return this.options;
|
33
|
+
},
|
34
|
+
set: function(keyOrHash, value) {
|
35
|
+
var k, v, _results;
|
36
|
+
if (typeof keyOrHash === 'object') {
|
37
|
+
_results = [];
|
38
|
+
for (k in keyOrHash) {
|
39
|
+
v = keyOrHash[k];
|
40
|
+
_results.push(this.options[k] = v);
|
41
|
+
}
|
42
|
+
return _results;
|
43
|
+
} else {
|
44
|
+
return this.options[keyOrHash] = value;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
};
|
48
|
+
});
|
49
|
+
|
50
|
+
app.directive("datepicker", [
|
51
|
+
'ngQuickDateDefaults', '$filter', '$sce', function(ngQuickDateDefaults, $filter, $sce) {
|
52
|
+
return {
|
53
|
+
restrict: "E",
|
54
|
+
require: "ngModel",
|
55
|
+
scope: {
|
56
|
+
ngModel: "=",
|
57
|
+
onChange: "&"
|
58
|
+
},
|
59
|
+
replace: true,
|
60
|
+
link: function(scope, element, attrs, ngModel) {
|
61
|
+
var dateToString, datepickerClicked, datesAreEqual, debug, getDaysInMonth, initialize, parseDateString, setCalendarDateFromModel, setCalendarRows, setConfigOptions, setInputDateFromModel;
|
62
|
+
debug = attrs.debug && attrs.debug.length;
|
63
|
+
initialize = function() {
|
64
|
+
scope.toggleCalendar(false);
|
65
|
+
scope.weeks = [];
|
66
|
+
scope.inputDate = null;
|
67
|
+
if (typeof scope.ngModel === 'string') {
|
68
|
+
scope.ngModel = parseDateString(scope.ngModel);
|
69
|
+
}
|
70
|
+
setConfigOptions();
|
71
|
+
setInputDateFromModel();
|
72
|
+
return setCalendarDateFromModel();
|
73
|
+
};
|
74
|
+
setConfigOptions = function() {
|
75
|
+
var key, value;
|
76
|
+
for (key in ngQuickDateDefaults) {
|
77
|
+
value = ngQuickDateDefaults[key];
|
78
|
+
if (key.match(/[Hh]tml/)) {
|
79
|
+
scope[key] = $sce.trustAsHtml(ngQuickDateDefaults[key] || "");
|
80
|
+
} else if (attrs[key]) {
|
81
|
+
scope[key] = attrs[key];
|
82
|
+
} else {
|
83
|
+
scope[key] = ngQuickDateDefaults[key];
|
84
|
+
}
|
85
|
+
}
|
86
|
+
if (!scope.labelFormat) {
|
87
|
+
scope.labelFormat = scope.dateFormat;
|
88
|
+
if (!scope.disableTimepicker) {
|
89
|
+
scope.labelFormat += " " + scope.timeFormat;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
if (attrs.iconClass && attrs.iconClass.length) {
|
93
|
+
return scope.buttonIconHtml = $sce.trustAsHtml("<i ng-show='iconClass' class='" + attrs.iconClass + "'></i>");
|
94
|
+
}
|
95
|
+
};
|
96
|
+
datepickerClicked = false;
|
97
|
+
window.document.addEventListener('click', function(event) {
|
98
|
+
if (!datepickerClicked) {
|
99
|
+
scope.toggleCalendar(false);
|
100
|
+
scope.$apply();
|
101
|
+
}
|
102
|
+
return datepickerClicked = false;
|
103
|
+
});
|
104
|
+
angular.element(element[0])[0].addEventListener('click', function(event) {
|
105
|
+
return datepickerClicked = true;
|
106
|
+
});
|
107
|
+
setInputDateFromModel = function() {
|
108
|
+
if (scope.ngModel) {
|
109
|
+
scope.inputDate = $filter('date')(scope.ngModel, ngQuickDateDefaults.dateFormat);
|
110
|
+
return scope.inputTime = $filter('date')(scope.ngModel, ngQuickDateDefaults.timeFormat);
|
111
|
+
} else {
|
112
|
+
scope.inputDate = null;
|
113
|
+
return scope.inputTime = null;
|
114
|
+
}
|
115
|
+
};
|
116
|
+
setCalendarDateFromModel = function() {
|
117
|
+
var d;
|
118
|
+
d = scope.ngModel ? new Date(scope.ngModel) : new Date();
|
119
|
+
if (d.toString() === "Invalid Date") {
|
120
|
+
d = new Date();
|
121
|
+
}
|
122
|
+
d.setDate(1);
|
123
|
+
return scope.calendarDate = new Date(d);
|
124
|
+
};
|
125
|
+
setCalendarRows = function() {
|
126
|
+
var curDate, d, day, daysInMonth, numRows, offset, row, selected, today, weeks, _i, _j, _ref;
|
127
|
+
offset = scope.calendarDate.getDay();
|
128
|
+
daysInMonth = getDaysInMonth(scope.calendarDate.getFullYear(), scope.calendarDate.getMonth());
|
129
|
+
numRows = Math.ceil((offset + daysInMonth) / 7);
|
130
|
+
weeks = [];
|
131
|
+
curDate = new Date(scope.calendarDate);
|
132
|
+
curDate.setDate(curDate.getDate() + (offset * -1));
|
133
|
+
for (row = _i = 0, _ref = numRows - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; row = 0 <= _ref ? ++_i : --_i) {
|
134
|
+
weeks.push([]);
|
135
|
+
for (day = _j = 0; _j <= 6; day = ++_j) {
|
136
|
+
d = new Date(curDate);
|
137
|
+
selected = scope.ngModel && d && datesAreEqual(d, scope.ngModel);
|
138
|
+
today = datesAreEqual(d, new Date());
|
139
|
+
weeks[row].push({
|
140
|
+
date: d,
|
141
|
+
selected: selected,
|
142
|
+
other: d.getMonth() !== scope.calendarDate.getMonth(),
|
143
|
+
today: today
|
144
|
+
});
|
145
|
+
curDate.setDate(curDate.getDate() + 1);
|
146
|
+
}
|
147
|
+
}
|
148
|
+
return scope.weeks = weeks;
|
149
|
+
};
|
150
|
+
dateToString = function(date, format) {
|
151
|
+
return $filter('date')(date, format);
|
152
|
+
};
|
153
|
+
parseDateString = ngQuickDateDefaults.parseDateFunction;
|
154
|
+
datesAreEqual = function(d1, d2, compareTimes) {
|
155
|
+
if (compareTimes == null) {
|
156
|
+
compareTimes = false;
|
157
|
+
}
|
158
|
+
if (compareTimes) {
|
159
|
+
return (d1 - d2) === 0;
|
160
|
+
} else {
|
161
|
+
return d1 && d2 && (d1.getYear() === d2.getYear()) && (d1.getMonth() === d2.getMonth()) && (d1.getDate() === d2.getDate());
|
162
|
+
}
|
163
|
+
};
|
164
|
+
getDaysInMonth = function(year, month) {
|
165
|
+
return [31, ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
|
166
|
+
};
|
167
|
+
scope.$watch('ngModel', function(newVal, oldVal) {
|
168
|
+
if (newVal !== oldVal) {
|
169
|
+
setInputDateFromModel();
|
170
|
+
return setCalendarDateFromModel();
|
171
|
+
}
|
172
|
+
});
|
173
|
+
scope.$watch('calendarDate', function(newVal, oldVal) {
|
174
|
+
if (newVal !== oldVal) {
|
175
|
+
return setCalendarRows();
|
176
|
+
}
|
177
|
+
});
|
178
|
+
scope.$watch('calendarShown', function(newVal, oldVal) {
|
179
|
+
var dateInput;
|
180
|
+
dateInput = angular.element(element[0].querySelector(".quickdate-date-input"))[0];
|
181
|
+
return dateInput.select();
|
182
|
+
});
|
183
|
+
scope.mainButtonStr = function() {
|
184
|
+
if (scope.ngModel) {
|
185
|
+
return $filter('date')(scope.ngModel, scope.labelFormat);
|
186
|
+
} else {
|
187
|
+
return scope.placeholder;
|
188
|
+
}
|
189
|
+
};
|
190
|
+
scope.toggleCalendar = function(show) {
|
191
|
+
if (isFinite(show)) {
|
192
|
+
return scope.calendarShown = show;
|
193
|
+
} else {
|
194
|
+
return scope.calendarShown = !scope.calendarShown;
|
195
|
+
}
|
196
|
+
};
|
197
|
+
scope.setDate = function(date, closeCalendar) {
|
198
|
+
var changed;
|
199
|
+
if (closeCalendar == null) {
|
200
|
+
closeCalendar = true;
|
201
|
+
}
|
202
|
+
changed = (!scope.ngModel && date) || (scope.ngModel && !date) || (date.getTime() !== scope.ngModel.getTime());
|
203
|
+
scope.ngModel = date;
|
204
|
+
if (closeCalendar) {
|
205
|
+
scope.toggleCalendar(false);
|
206
|
+
}
|
207
|
+
if (changed && scope.onChange) {
|
208
|
+
return scope.onChange();
|
209
|
+
}
|
210
|
+
};
|
211
|
+
scope.setDateFromInput = function(closeCalendar) {
|
212
|
+
var err, tmpDate, tmpDateAndTime, tmpTime;
|
213
|
+
if (closeCalendar == null) {
|
214
|
+
closeCalendar = false;
|
215
|
+
}
|
216
|
+
try {
|
217
|
+
tmpDate = parseDateString(scope.inputDate);
|
218
|
+
if (!tmpDate) {
|
219
|
+
throw 'Invalid Date';
|
220
|
+
}
|
221
|
+
if (!scope.disableTimepicker && scope.inputTime && scope.inputTime.length && tmpDate) {
|
222
|
+
tmpTime = scope.disableTimepicker ? '00:00:00' : scope.inputTime;
|
223
|
+
tmpDateAndTime = parseDateString("" + scope.inputDate + " " + tmpTime);
|
224
|
+
if (!tmpDateAndTime) {
|
225
|
+
throw 'Invalid Time';
|
226
|
+
}
|
227
|
+
scope.setDate(tmpDateAndTime, false);
|
228
|
+
} else {
|
229
|
+
scope.setDate(tmpDate, false);
|
230
|
+
}
|
231
|
+
if (closeCalendar) {
|
232
|
+
scope.toggleCalendar(false);
|
233
|
+
}
|
234
|
+
scope.inputDateErr = false;
|
235
|
+
return scope.inputTimeErr = false;
|
236
|
+
} catch (_error) {
|
237
|
+
err = _error;
|
238
|
+
if (err === 'Invalid Date') {
|
239
|
+
return scope.inputDateErr = true;
|
240
|
+
} else if (err === 'Invalid Time') {
|
241
|
+
return scope.inputTimeErr = true;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
};
|
245
|
+
scope.onDateInputTab = function(param) {
|
246
|
+
if (scope.disableTimepicker) {
|
247
|
+
scope.toggleCalendar(false);
|
248
|
+
}
|
249
|
+
return true;
|
250
|
+
};
|
251
|
+
scope.onTimeInputTab = function(param) {
|
252
|
+
scope.toggleCalendar(false);
|
253
|
+
return true;
|
254
|
+
};
|
255
|
+
scope.nextMonth = function() {
|
256
|
+
return scope.calendarDate = new Date(new Date(scope.calendarDate).setMonth(scope.calendarDate.getMonth() + 1));
|
257
|
+
};
|
258
|
+
scope.prevMonth = function() {
|
259
|
+
return scope.calendarDate = new Date(new Date(scope.calendarDate).setMonth(scope.calendarDate.getMonth() - 1));
|
260
|
+
};
|
261
|
+
scope.clear = function() {
|
262
|
+
scope.ngModel = null;
|
263
|
+
return scope.toggleCalendar(false);
|
264
|
+
};
|
265
|
+
initialize();
|
266
|
+
setCalendarRows();
|
267
|
+
if (debug) {
|
268
|
+
return console.log("quick date scope:", scope);
|
269
|
+
}
|
270
|
+
},
|
271
|
+
template: "<div class='quickdate'>\n <a href='' ng-focus='toggleCalendar(true)' ng-click='toggleCalendar()' class='quickdate-button' title='{{hoverText}}'><div ng-hide='iconClass' ng-bind-html='buttonIconHtml'></div>{{mainButtonStr()}}</a>\n <div class='quickdate-popup' ng-class='{open: calendarShown}'>\n <a href='' tabindex='-1' class='quickdate-close' ng-click='toggleCalendar()'><div ng-bind-html='closeButtonHtml'></div></a>\n <div class='quickdate-text-inputs'>\n <div class='quickdate-input-wrapper'>\n <label>Date</label>\n <input class='quickdate-date-input' name='inputDate' type='text' ng-model='inputDate' placeholder='1/1/2013' ng-blur=\"setDateFromInput()\" ng-enter=\"setDateFromInput(true)\" ng-class=\"{'ng-quick-date-error': inputDateErr}\" ng-tab='onDateInputTab()' />\n </div>\n <div class='quickdate-input-wrapper' ng-hide='disableTimepicker'>\n <label>Time</label>\n <input class='quickdate-time-input' name='inputTime' type='text' ng-model='inputTime' placeholder='12:00 PM' ng-blur=\"setDateFromInput(false)\" ng-enter=\"setDateFromInput(true)\" ng-class=\"{'quickdate-error': inputTimeErr}\" ng-tab='onTimeInputTab()'>\n </div>\n </div>\n <div class='quickdate-calendar-header'>\n <a href='' class='quickdate-prev-month quickdate-action-link' tabindex='-1' ng-click='prevMonth()'><div ng-bind-html='prevLinkHtml'></div></a>\n <span class='quickdate-month'>{{calendarDate | date:'MMMM yyyy'}}</span>\n <a href='' class='quickdate-next-month quickdate-action-link' ng-click='nextMonth()' tabindex='-1' ><div ng-bind-html='nextLinkHtml'></div></a>\n </div>\n <table class='quickdate-calendar'>\n <thead>\n <tr>\n <th ng-repeat='day in dayAbbreviations'>{{day}}</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat='week in weeks'>\n <td ng-mousedown='setDate(day.date)' ng-class='{\"other-month\": day.other, \"selected\": day.selected, \"is-today\": day.today}' ng-repeat='day in week'>{{day.date | date:'d'}}</td>\n </tr>\n </tbody>\n </table>\n <div class='quickdate-popup-footer'>\n <a href='' class='quickdate-clear' tabindex='-1' ng-hide='disableClearButton' ng-click='clear()'>Clear</a>\n </div>\n </div>\n</div>"
|
272
|
+
};
|
273
|
+
}
|
274
|
+
]);
|
275
|
+
|
276
|
+
app.directive('ngEnter', function() {
|
277
|
+
return function(scope, element, attr) {
|
278
|
+
return element.bind('keydown keypress', function(e) {
|
279
|
+
if (e.which === 13) {
|
280
|
+
scope.$apply(attr.ngEnter);
|
281
|
+
return e.preventDefault();
|
282
|
+
}
|
283
|
+
});
|
284
|
+
};
|
285
|
+
});
|
286
|
+
|
287
|
+
app.directive('ngTab', function() {
|
288
|
+
return function(scope, element, attr) {
|
289
|
+
return element.bind('keydown keypress', function(e) {
|
290
|
+
if (e.which === 9) {
|
291
|
+
return scope.$apply(attr.ngTab);
|
292
|
+
}
|
293
|
+
});
|
294
|
+
};
|
295
|
+
});
|
296
|
+
|
297
|
+
}).call(this);
|
@@ -111,7 +111,7 @@ User.controller("AddUsersController", ["$scope","Restangular","$location" ,"$rou
|
|
111
111
|
}else{
|
112
112
|
API.all("users").post(user).then(function(){
|
113
113
|
success_message(gettext("User created Successfully"));
|
114
|
-
|
114
|
+
$location.path("/auth/users");
|
115
115
|
}).catch(catch_error);
|
116
116
|
}
|
117
117
|
};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/* -----------------------------------------------------------------------------
|
2
|
+
Red Base - Basic website skel engine
|
3
|
+
Copyright (C) 2012-2013 Yellowen
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License along
|
16
|
+
with this program; if not, write to the Free Software Foundation, Inc.,
|
17
|
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
18
|
+
----------------------------------------------------------------------------- */
|
19
|
+
|
20
|
+
var ListView = angular.module("ListView", []);
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<div id="mainloader">
|
2
|
+
<div class="text">
|
3
|
+
<p><i class="fa fa-spin fa-refresh fa-2x"></i></p>
|
4
|
+
<h5><%= _("Please wait") %> . . .</h5>
|
5
|
+
</div>
|
6
|
+
</div>
|
7
|
+
<div id="content" class="hide">
|
8
|
+
<header>
|
9
|
+
{{ render "navigation" }}
|
10
|
+
</header>
|
11
|
+
|
12
|
+
<section class="dashboard-body">
|
13
|
+
<div class="row">
|
14
|
+
<aside class="modulebar small-2 columns">
|
15
|
+
{{ render "modules"}}
|
16
|
+
</aside>
|
17
|
+
<section class="small-10 columns dashboard-content">
|
18
|
+
|
19
|
+
<div class="row content">
|
20
|
+
<div id="flash" class="row success">
|
21
|
+
<div class="small-12 columns">
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="row">
|
27
|
+
<div class="small-4 columns text-right search-bar right">
|
28
|
+
<input type="search" class="small-12 columns left" placeholder="Search ..."/>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="row content">
|
32
|
+
{{ outlet }}
|
33
|
+
</div>
|
34
|
+
|
35
|
+
</section>
|
36
|
+
|
37
|
+
</div>
|
38
|
+
</section>
|
39
|
+
</div>
|