kms 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/kms/application.js +1 -0
- data/app/assets/javascripts/kms/application/controllers/assets_controller.coffee.erb +14 -4
- data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +12 -2
- data/app/assets/javascripts/kms/application/controllers/snippets_controller.coffee.erb +13 -3
- data/app/assets/javascripts/kms/application/controllers/templates_controller.coffee.erb +13 -3
- data/app/assets/javascripts/kms/application/controllers/users_controller.coffee +5 -5
- data/app/assets/javascripts/kms/application/module.coffee +6 -2
- data/app/assets/javascripts/kms/application/routes.coffee.erb +10 -0
- data/app/assets/javascripts/templates/assets/edit.html.slim +2 -1
- data/app/assets/javascripts/templates/assets/form.html.slim +1 -1
- data/app/assets/javascripts/templates/pages/edit.html.slim +1 -0
- data/app/assets/javascripts/templates/shared/hotkey_notification.html.slim +6 -0
- data/app/assets/javascripts/templates/snippets/edit.html.slim +1 -0
- data/app/assets/javascripts/templates/templates/edit.html.slim +1 -0
- data/app/assets/javascripts/templates/users/edit.html.slim +5 -0
- data/app/assets/javascripts/templates/users/form.html.slim +3 -2
- data/app/assets/javascripts/templates/users/index.html.slim +2 -1
- data/app/assets/stylesheets/kms/custom.css.scss +10 -0
- data/app/controllers/kms/assets_controller.rb +6 -3
- data/app/controllers/kms/users_controller.rb +14 -0
- data/app/services/kms/resource_service.rb +3 -1
- data/app/views/layouts/kms/kms.html.erb +1 -1
- data/config/initializers/devise.rb +9 -0
- data/config/locales/en.yml +12 -0
- data/config/locales/ru.yml +12 -0
- data/config/routes.rb +1 -1
- data/lib/kms/engine.rb +1 -1
- data/lib/kms/version.rb +1 -1
- data/spec/controllers/kms/assets_controller_spec.rb +28 -10
- data/spec/controllers/kms/users_controller_spec.rb +23 -0
- data/spec/internal/config/routes.rb +1 -1
- data/spec/internal/log/test.log +0 -105823
- data/vendor/assets/bower.json +5 -4
- data/vendor/assets/bower_components/angular-cookies/angular-cookies.js +22 -18
- data/vendor/assets/bower_components/angular-cookies/angular-cookies.min.js +4 -4
- data/vendor/assets/bower_components/angular-cookies/angular-cookies.min.js.map +2 -2
- data/vendor/assets/bower_components/angular-cookies/bower.json +2 -2
- data/vendor/assets/bower_components/angular-cookies/package.json +1 -1
- data/vendor/assets/bower_components/angular-hotkeys/Gruntfile.js +118 -0
- data/vendor/assets/bower_components/angular-hotkeys/LICENSE +20 -0
- data/vendor/assets/bower_components/angular-hotkeys/README.md +248 -0
- data/vendor/assets/bower_components/angular-hotkeys/bower.json +19 -0
- data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.css +110 -0
- data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.js +1661 -0
- data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.min.css +1 -0
- data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.min.js +7 -0
- data/vendor/assets/bower_components/angular-hotkeys/package.json +45 -0
- data/vendor/assets/bower_components/angular-hotkeys/src/hotkeys.css +104 -0
- data/vendor/assets/bower_components/angular-hotkeys/src/hotkeys.js +633 -0
- data/vendor/assets/bower_components/angular-loading-bar/CHANGELOG.md +33 -0
- data/vendor/assets/bower_components/angular-loading-bar/CONTRIBUTING.md +17 -0
- data/vendor/assets/bower_components/angular-loading-bar/Gruntfile.js +9 -1
- data/vendor/assets/bower_components/angular-loading-bar/ISSUE_TEMPLATE.md +14 -0
- data/vendor/assets/bower_components/angular-loading-bar/PULL_REQUEST_TEMPLATE.md +13 -0
- data/vendor/assets/bower_components/angular-loading-bar/README.md +30 -3
- data/vendor/assets/bower_components/angular-loading-bar/bower.json +11 -6
- data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.css +5 -5
- data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.js +39 -12
- data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.min.css +1 -8
- data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.min.js +3 -3
- data/vendor/assets/bower_components/angular-loading-bar/index.js +2 -0
- data/vendor/assets/bower_components/angular-loading-bar/package.json +12 -15
- data/vendor/assets/bower_components/angular-loading-bar/src/loading-bar.css +3 -3
- data/vendor/assets/bower_components/angular-loading-bar/src/loading-bar.js +37 -10
- data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.js +504 -386
- data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.min.js +13 -12
- data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
- data/vendor/assets/bower_components/angular-sanitize/bower.json +2 -2
- data/vendor/assets/bower_components/angular-sanitize/package.json +1 -1
- data/vendor/assets/bower_components/angular-ui-router/CHANGELOG.md +1410 -0
- data/vendor/assets/bower_components/angular-ui-router/CONTRIBUTING.md +64 -16
- data/vendor/assets/bower_components/angular-ui-router/DOCS.md +48 -0
- data/vendor/assets/bower_components/angular-ui-router/ISSUE_TEMPLATE.md +53 -0
- data/vendor/assets/bower_components/angular-ui-router/LICENSE +1 -1
- data/vendor/assets/bower_components/angular-ui-router/README.md +24 -211
- data/vendor/assets/bower_components/angular-ui-router/artifacts.json +8 -0
- data/vendor/assets/bower_components/angular-ui-router/bower.json +1 -23
- data/vendor/assets/bower_components/angular-ui-router/karma.conf.js +105 -0
- data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.js +9744 -3901
- data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.js.map +192 -0
- data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js +9 -4
- data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js.map +1679 -0
- data/vendor/assets/bower_components/angular-ui-router/release/resolveService.js +83 -0
- data/vendor/assets/bower_components/angular-ui-router/release/resolveService.js.map +19 -0
- data/vendor/assets/bower_components/angular-ui-router/release/resolveService.min.js +8 -0
- data/vendor/assets/bower_components/angular-ui-router/release/resolveService.min.js.map +47 -0
- data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.js +294 -0
- data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.js.map +17 -0
- data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.min.js +8 -0
- data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.min.js.map +102 -0
- data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.js +2014 -0
- data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.js.map +70 -0
- data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.min.js +9 -0
- data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.min.js.map +541 -0
- data/vendor/assets/bower_components/angular-ui-router/rollup.config.js +116 -0
- data/vendor/assets/bower_components/angular-ui-router/tslint.json +60 -0
- data/vendor/assets/bower_components/angular-ui-router/yarn.lock +4146 -0
- data/vendor/assets/bower_components/angular-ui-tree/yarn.lock +4945 -0
- data/vendor/assets/bower_components/angular/angular.js +4019 -2449
- data/vendor/assets/bower_components/angular/angular.min.js +331 -319
- data/vendor/assets/bower_components/angular/angular.min.js.gzip +0 -0
- data/vendor/assets/bower_components/angular/angular.min.js.map +3 -3
- data/vendor/assets/bower_components/angular/bower.json +1 -1
- data/vendor/assets/bower_components/angular/package.json +1 -1
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/LICENSE +21 -0
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/README.md +14 -14
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/bower.json +25 -12
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/development_index.html +59 -52
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/dist/angularjs-dropdown-multiselect.min.js +1 -1
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/index.html +73 -0
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/package.json +19 -7
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/javascripts/pages/home/ExampleCtrl.js +126 -3
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/javascripts/pages/home/home.html +1262 -852
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/stylesheets/stylesheet.css +10 -5
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/src/angularjs-dropdown-multiselect.js +612 -287
- metadata +66 -169
- data/spec/internal/config/database.yml +0 -7
- data/spec/internal/public/uploads/kms/asset/file/1/avatar.jpg +0 -0
- data/spec/internal/public/uploads/kms/asset/file/2/avatar.jpg +0 -0
- data/spec/internal/public/uploads/kms/asset/file/2/style.css +0 -1
- data/spec/internal/public/uploads/kms/asset/file/3/style.css +0 -1
- data/spec/internal/public/uploads/kms/asset/file/4/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500976987-41025-0002-0883/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977082-41195-0002-6495/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977109-41364-0002-4518/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977152-41405-0002-2345/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977327-41694-0002-5448/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977376-41732-0002-7916/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977392-41759-0002-7593/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977410-42259-0002-7527/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977429-42306-0002-5937/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500977437-42324-0002-5880/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983228-53594-0002-4559/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983284-53632-0002-6590/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983360-53784-0002-7289/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983469-54321-0002-0386/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500983469-54321-0004-5691/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983511-54352-0002-5720/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500983511-54352-0004-1399/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500983610-54507-0002-4280/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500983610-54507-0004-9758/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500984466-57012-0002-4146/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500984466-57012-0004-5895/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500984509-57158-0002-9657/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500984509-57158-0004-5003/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500984616-57697-0002-7201/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500984616-57697-0004-6255/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985257-58947-0002-3629/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500985257-58947-0004-5338/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985407-58947-0006-5929/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985473-59264-0002-0397/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500985473-59264-0004-6493/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985475-59264-0007-8674/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985538-59468-0002-9206/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500985538-59468-0004-2586/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500985538-59468-0007-6200/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988358-65877-0002-4528/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988358-65877-0004-5904/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988358-65877-0007-7320/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988407-65916-0002-3138/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988407-65916-0004-5400/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988407-65916-0007-1655/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988421-65950-0002-9415/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988421-65950-0004-7130/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988421-65950-0007-9886/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988435-65981-0002-3228/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988435-65981-0004-3682/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988435-65981-0007-1582/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988475-66122-0002-9516/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988475-66122-0004-5634/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988530-66122-0007-2272/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988554-66315-0002-6262/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500988554-66315-0004-6099/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500988554-66315-0007-1632/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500991751-73722-0002-9937/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1500991751-73722-0004-8034/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1500991751-73722-0007-7763/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1501233238-34385-0002-3210/avatar.jpg +0 -0
- data/spec/internal/public/uploads/tmp/1501233238-34385-0004-5881/style.css +0 -1
- data/spec/internal/public/uploads/tmp/1501233238-34385-0007-6280/style.css +0 -1
- data/spec/internal/tmp/cache/assets/test/sprockets/v3.0/1XyAFYlYI0pK7WAgjR4PgXV6BgU6huJSviWmHetdCRs.cache +0 -1
- data/vendor/assets/bower_components/angular-ui-router/api/angular-ui-router.d.ts +0 -126
- data/vendor/assets/bower_components/angular-ui-router/src/common.js +0 -292
- data/vendor/assets/bower_components/angular-ui-router/src/resolve.js +0 -252
- data/vendor/assets/bower_components/angular-ui-router/src/state.js +0 -1373
- data/vendor/assets/bower_components/angular-ui-router/src/stateDirectives.js +0 -268
- data/vendor/assets/bower_components/angular-ui-router/src/stateFilters.js +0 -39
- data/vendor/assets/bower_components/angular-ui-router/src/templateFactory.js +0 -110
- data/vendor/assets/bower_components/angular-ui-router/src/urlMatcherFactory.js +0 -1036
- data/vendor/assets/bower_components/angular-ui-router/src/urlRouter.js +0 -413
- data/vendor/assets/bower_components/angular-ui-router/src/view.js +0 -71
- data/vendor/assets/bower_components/angular-ui-router/src/viewDirective.js +0 -302
- data/vendor/assets/bower_components/angular-ui-router/src/viewScroll.js +0 -52
- data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/index.html +0 -67
- data/vendor/assets/bower_components/bootstrap/Gemfile.lock +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 706248cb2d7f607b5308dc373c44dcf914181239
|
4
|
+
data.tar.gz: 62c92d2c79550b7c38523df37e00ac90e179871e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 528337cf36325329bed39d101417d53338b6f46fe3d92d92a69528aab845ca27127a4bc08e19627cc10ed59c15f9adac9e866ac297f3fd2cba0e604ad5a92922
|
7
|
+
data.tar.gz: 56be7cf89aecc717a7e300abec0f4be70dd791976f42b1968ea79607d1880300152f3386bb1cdc776af0951781d3cd98e5880143389987ccdf18b8f3f29a839c
|
@@ -44,6 +44,7 @@
|
|
44
44
|
//= require "ng-alertify/ng-alertify"
|
45
45
|
//= require "angular-xeditable/dist/js/xeditable"
|
46
46
|
//= require "ng-sortable/dist/ng-sortable"
|
47
|
+
//= require "angular-hotkeys/build/hotkeys.min"
|
47
48
|
//= require "kms/application/module"
|
48
49
|
//= require "kms/application/routes"
|
49
50
|
//= require angular-rails-templates
|
@@ -1,4 +1,4 @@
|
|
1
|
-
AssetsController = ($scope, $state, $cookieStore, $cookies, Restangular, $stateParams, Alertify, ErrorsService) ->
|
1
|
+
AssetsController = ($scope, $state, $cookieStore, $cookies, Restangular, $stateParams, Alertify, ErrorsService, hotkeys) ->
|
2
2
|
|
3
3
|
$scope.editorOptions = (asset)->
|
4
4
|
lineNumbers: true
|
@@ -25,13 +25,23 @@ AssetsController = ($scope, $state, $cookieStore, $cookies, Restangular, $stateP
|
|
25
25
|
$scope.asset = asset
|
26
26
|
if /css|javascript/.test $scope.getAssetGroup(asset)
|
27
27
|
$scope.asset.performing_plain_text = true
|
28
|
-
|
29
|
-
|
28
|
+
|
29
|
+
hotkeys.add
|
30
|
+
combo: 'ctrl+s'
|
31
|
+
description: 'Saving an asset'
|
32
|
+
allowIn: ['INPUT', 'TEXTAREA']
|
33
|
+
callback: (event) ->
|
34
|
+
event.preventDefault()
|
35
|
+
$scope.update(event) if $scope.asset.id
|
36
|
+
|
37
|
+
$scope.handleUploadError = (file, message, flow) ->
|
38
|
+
Alertify.error ErrorsService.prepareErrorsString(JSON.parse(message).errors)
|
30
39
|
|
31
40
|
$scope.update = ($event)->
|
32
41
|
$scope.asset.put().then ->
|
33
42
|
if $event.target.attributes['data-redirect']
|
34
43
|
$state.go('assets')
|
44
|
+
Alertify.success('<%= I18n.t(:asset_successfully_updated) %>')
|
35
45
|
,(response)->
|
36
46
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
37
47
|
|
@@ -77,4 +87,4 @@ AssetsController = ($scope, $state, $cookieStore, $cookies, Restangular, $stateP
|
|
77
87
|
|
78
88
|
|
79
89
|
angular.module('KMS')
|
80
|
-
.controller('AssetsController', ['$scope', '$state', '$cookieStore', '$cookies', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', AssetsController])
|
90
|
+
.controller('AssetsController', ['$scope', '$state', '$cookieStore', '$cookies', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'hotkeys', AssetsController])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Alertify, ErrorsService, TransliterationService) ->
|
1
|
+
PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Alertify, ErrorsService, TransliterationService, hotkeys) ->
|
2
2
|
$scope.editorOptions =
|
3
3
|
filebrowserUploadUrl: '/kms/assets/ckeditor'
|
4
4
|
entities: false
|
@@ -71,10 +71,19 @@ PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
|
|
71
71
|
if $scope.parentPages.length > 0 and $scope.page and !$scope.page.parent_id and !$stateParams.id
|
72
72
|
$scope.page.parent_id = $scope.parentPages[0].id
|
73
73
|
|
74
|
+
hotkeys.add
|
75
|
+
combo: 'ctrl+s'
|
76
|
+
description: 'Saving a page'
|
77
|
+
allowIn: ['INPUT', 'SELECT', 'TEXTAREA']
|
78
|
+
callback: (event) ->
|
79
|
+
event.preventDefault()
|
80
|
+
if $scope.page.id then $scope.update(event) else $scope.create()
|
81
|
+
|
74
82
|
|
75
83
|
$scope.create = ->
|
76
84
|
$scope.store.post($scope.page).then ->
|
77
85
|
$state.go('pages')
|
86
|
+
Alertify.success('<%= I18n.t(:page_successfully_created) %>')
|
78
87
|
,(response)->
|
79
88
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
80
89
|
|
@@ -82,6 +91,7 @@ PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
|
|
82
91
|
$scope.page.put().then ->
|
83
92
|
if $event.target.attributes['data-redirect']
|
84
93
|
$state.go('pages')
|
94
|
+
Alertify.success('<%= I18n.t(:page_successfully_updated) %>')
|
85
95
|
,(response)->
|
86
96
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
87
97
|
|
@@ -101,4 +111,4 @@ PagesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
|
|
101
111
|
}
|
102
112
|
|
103
113
|
angular.module('KMS')
|
104
|
-
.controller('PagesController', ['$scope', '$state', '$cookieStore', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'TransliterationService', PagesController])
|
114
|
+
.controller('PagesController', ['$scope', '$state', '$cookieStore', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'TransliterationService', 'hotkeys', PagesController])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsService) ->
|
1
|
+
SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsService, hotkeys) ->
|
2
2
|
$scope.editorOptions =
|
3
3
|
lineNumbers: true
|
4
4
|
mode:'htmlmixed'
|
@@ -26,11 +26,20 @@ SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, Error
|
|
26
26
|
$scope.store.get($stateParams.id).then (snippet)->
|
27
27
|
$scope.snippet = snippet
|
28
28
|
else
|
29
|
-
$scope.snippet = {}
|
29
|
+
$scope.snippet = {content: ''}
|
30
|
+
|
31
|
+
hotkeys.add
|
32
|
+
combo: 'ctrl+s'
|
33
|
+
description: 'Saving a snippet'
|
34
|
+
allowIn: ['INPUT', 'SELECT', 'TEXTAREA']
|
35
|
+
callback: (event) ->
|
36
|
+
event.preventDefault()
|
37
|
+
if $scope.snippet.id then $scope.update(event) else $scope.create()
|
30
38
|
|
31
39
|
$scope.create = ->
|
32
40
|
$scope.store.post($scope.snippet).then ->
|
33
41
|
$state.go('snippets')
|
42
|
+
Alertify.success('<%= I18n.t(:snippet_successfully_created) %>')
|
34
43
|
, (response)->
|
35
44
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
36
45
|
|
@@ -38,6 +47,7 @@ SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, Error
|
|
38
47
|
$scope.snippet.put().then ->
|
39
48
|
if event.target.attributes['data-redirect']
|
40
49
|
$state.go('snippets')
|
50
|
+
Alertify.success('<%= I18n.t(:snippet_successfully_updated) %>')
|
41
51
|
,(response)->
|
42
52
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
43
53
|
|
@@ -47,4 +57,4 @@ SnippetsController = ($scope, $state, Restangular, $stateParams, Alertify, Error
|
|
47
57
|
$scope.snippets = _.without($scope.snippets, snippet)
|
48
58
|
|
49
59
|
angular.module('KMS')
|
50
|
-
.controller('SnippetsController', ['$scope', '$state', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', SnippetsController])
|
60
|
+
.controller('SnippetsController', ['$scope', '$state', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'hotkeys', SnippetsController])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Alertify, ErrorsService) ->
|
1
|
+
TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams, Alertify, ErrorsService, hotkeys) ->
|
2
2
|
$scope.editorOptions =
|
3
3
|
lineNumbers: true
|
4
4
|
mode:'htmlmixed'
|
@@ -26,11 +26,20 @@ TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams,
|
|
26
26
|
$scope.store.get($stateParams.id).then (template)->
|
27
27
|
$scope.template = template
|
28
28
|
else
|
29
|
-
$scope.template = {}
|
29
|
+
$scope.template = {name: '', content: ''}
|
30
|
+
|
31
|
+
hotkeys.add
|
32
|
+
combo: 'ctrl+s'
|
33
|
+
description: 'Saving a template'
|
34
|
+
allowIn: ['INPUT', 'SELECT', 'TEXTAREA']
|
35
|
+
callback: (event) ->
|
36
|
+
event.preventDefault()
|
37
|
+
if $scope.template.id then $scope.update(event) else $scope.create()
|
30
38
|
|
31
39
|
$scope.create = ->
|
32
40
|
$scope.store.post($scope.template).then ->
|
33
41
|
$state.go('templates')
|
42
|
+
Alertify.success('<%= I18n.t(:template_successfully_created) %>')
|
34
43
|
, (response)->
|
35
44
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
36
45
|
|
@@ -38,6 +47,7 @@ TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams,
|
|
38
47
|
$scope.template.put().then ->
|
39
48
|
if $event.target.attributes['data-redirect']
|
40
49
|
$state.go('templates')
|
50
|
+
Alertify.success('<%= I18n.t(:template_successfully_updated) %>')
|
41
51
|
,(response)->
|
42
52
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
43
53
|
|
@@ -48,4 +58,4 @@ TemplatesController = ($scope, $state, $cookieStore, Restangular, $stateParams,
|
|
48
58
|
|
49
59
|
|
50
60
|
angular.module('KMS')
|
51
|
-
.controller('TemplatesController', ['$scope', '$state', '$cookieStore', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', TemplatesController])
|
61
|
+
.controller('TemplatesController', ['$scope', '$state', '$cookieStore', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'hotkeys', TemplatesController])
|
@@ -15,11 +15,11 @@ UsersController = ($scope, $state, $cookieStore, Restangular, $stateParams, Aler
|
|
15
15
|
, (response)->
|
16
16
|
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
$scope.update = ->
|
19
|
+
$scope.user.put().then ->
|
20
|
+
$state.go('users')
|
21
|
+
, (response) ->
|
22
|
+
Alertify.error(ErrorsService.prepareErrorsString(response.data.errors))
|
23
23
|
|
24
24
|
$scope.destroy = (user)->
|
25
25
|
if(confirm('<%= I18n.t(:are_you_sure) %>'))
|
@@ -1,4 +1,8 @@
|
|
1
|
-
angular.module('KMS', ['ui.bootstrap', 'ui.router', 'ngCookies', 'restangular',
|
1
|
+
angular.module('KMS', ['ui.bootstrap', 'ui.router', 'ngCookies', 'restangular',
|
2
|
+
'templates', 'ui.tree', 'ui.codemirror', 'flow', 'ui.select',
|
3
|
+
'ngSanitize', 'ngCkeditor', 'toggle-switch', 'angular-loading-bar',
|
4
|
+
'angularjs-dropdown-multiselect', 'Alertify', 'xeditable', 'as.sortable', 'cfp.hotkeys'
|
5
|
+
])
|
2
6
|
|
3
7
|
angular.module('KMS').config ['$httpProvider', '$locationProvider', 'RestangularProvider', 'flowFactoryProvider', 'cfpLoadingBarProvider', ($httpProvider, $locationProvider, RestangularProvider, flowFactoryProvider, cfpLoadingBarProvider) ->
|
4
8
|
cfpLoadingBarProvider.includeSpinner = false
|
@@ -10,7 +14,7 @@ angular.module('KMS').config ['$httpProvider', '$locationProvider', 'Restangular
|
|
10
14
|
|
11
15
|
flowFactoryProvider.defaults =
|
12
16
|
target: '/kms/assets.json'
|
13
|
-
permanentErrors: [404, 500, 501]
|
17
|
+
permanentErrors: [404, 422, 500, 501]
|
14
18
|
maxChunkRetries: 1
|
15
19
|
chunkSize: 50*1024*1024
|
16
20
|
chunkRetryInterval: 5000
|
@@ -138,6 +138,16 @@ angular.module('KMS').config ['$stateProvider', '$urlRouterProvider', ($statePro
|
|
138
138
|
controllerAs: 'users',
|
139
139
|
templateUrl: 'users/new.html',
|
140
140
|
})
|
141
|
+
.state('users.edit', {
|
142
|
+
url: '/:id/edit',
|
143
|
+
views:
|
144
|
+
"header@":
|
145
|
+
template: "<%= I18n.t(:edit_user) %>"
|
146
|
+
"@":
|
147
|
+
controller: 'UsersController',
|
148
|
+
controllerAs: 'users',
|
149
|
+
templateUrl: 'users/edit.html',
|
150
|
+
})
|
141
151
|
.state('snippets', {
|
142
152
|
url: '/kms/snippets',
|
143
153
|
views:
|
@@ -7,7 +7,8 @@
|
|
7
7
|
.btn-group
|
8
8
|
button.btn.btn-default type="submit" data-redirect="true" ng-click="update($event)" = I18n.t(:update_asset)
|
9
9
|
button.btn.btn-default type="submit" ng-click="update($event)" = I18n.t(:update_asset_and_continue)
|
10
|
-
|
10
|
+
ng-include src="'shared/hotkey_notification.html'"
|
11
|
+
.center-block ng-unless="asset.performing_plain_text" flow-init="{headers: setHeaders, singleFile: true, uploadMethod: 'PUT', target: updateTarget, initFileFn: initFlowFile}" flow-files-submitted="$flow.upload()" flow-file-success="$file.msg = $message" flow-complete="$state.go('assets')" flow-drop="" flow-error="handleUploadError( $file, $message, $flow )"
|
11
12
|
.jumbotron.vertical-center.text-center
|
12
13
|
.container
|
13
14
|
h1
|
@@ -1,4 +1,4 @@
|
|
1
|
-
.center-block flow-init="{headers: setHeaders}" flow-files-submitted="$flow.upload()" flow-file-success="$file.msg = $message" flow-complete="$state.go('assets')" flow-drop=""
|
1
|
+
.center-block flow-init="{headers: setHeaders}" flow-files-submitted="$flow.upload()" flow-file-success="$file.msg = $message" flow-complete="$state.go('assets')" flow-drop="" flow-error="handleUploadError( $file, $message, $flow )"
|
2
2
|
.jumbotron.vertical-center.text-center
|
3
3
|
.container
|
4
4
|
h1
|
@@ -5,3 +5,4 @@
|
|
5
5
|
.btn-group
|
6
6
|
button.btn.btn-default type="submit" data-redirect="true" ng-click="update($event)" = I18n.t(:update_snippet)
|
7
7
|
button.btn.btn-default type="submit" ng-click="update($event)" = I18n.t(:update_snippet_and_continue)
|
8
|
+
ng-include src="'shared/hotkey_notification.html'"
|
@@ -5,3 +5,4 @@
|
|
5
5
|
.btn-group
|
6
6
|
button.btn.btn-default type="submit" data-redirect="true" ng-click="update($event)" = I18n.t(:update_template)
|
7
7
|
button.btn.btn-default type="submit" ng-click="update($event)" = I18n.t(:update_template_and_continue)
|
8
|
+
ng-include src="'shared/hotkey_notification.html'"
|
@@ -3,12 +3,13 @@
|
|
3
3
|
input#email.form-control type="email" ng-model="user.email" required=""
|
4
4
|
.form-group
|
5
5
|
label for="password" = Kms::User.human_attribute_name(:password)
|
6
|
-
input#password.form-control type="password" ng-model="user.password" required=""
|
6
|
+
input#password.form-control type="password" ng-model="user.password" ng-attr-required="{{user.id ? undefined : ''}}"
|
7
7
|
.form-group
|
8
8
|
label for="password_confirmation" = Kms::User.human_attribute_name(:password_confirmation)
|
9
|
-
input#password_confirmation.form-control type="password" ng-model="user.password_confirmation" required=""
|
9
|
+
input#password_confirmation.form-control type="password" ng-model="user.password_confirmation" ng-attr-required="{{user.id ? undefined : ''}}"
|
10
10
|
.form-group
|
11
11
|
label for="role" = Kms::User.human_attribute_name(:role)
|
12
12
|
select#role.form-control ng-model="user.role" required=""
|
13
13
|
- Kms::User::ROLES.each do |role|
|
14
14
|
option value=role.to_s = I18n.t("roles.#{role.to_s}")
|
15
|
+
small = I18n.t(:roles_description)
|
@@ -124,3 +124,13 @@ ul.sidebar .sidebar-main {
|
|
124
124
|
line-height: 70px;
|
125
125
|
}
|
126
126
|
}
|
127
|
+
.hotkey-notification:active {
|
128
|
+
-webkit-box-shadow: none;
|
129
|
+
box-shadow: none;
|
130
|
+
}
|
131
|
+
ul.sidebar .sidebar-list.active a {
|
132
|
+
color: #fff;
|
133
|
+
border-left: 3px solid #ff5274;
|
134
|
+
text-indent: 22px;
|
135
|
+
background: #2d3e63;
|
136
|
+
}
|
@@ -14,7 +14,7 @@ module Kms
|
|
14
14
|
# special json for ng-flow
|
15
15
|
render json: {success: true, files: [@asset]}.to_json
|
16
16
|
else
|
17
|
-
render
|
17
|
+
render json: {errors: @asset.errors}.to_json, status: :unprocessable_entity
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -33,8 +33,11 @@ module Kms
|
|
33
33
|
|
34
34
|
def update
|
35
35
|
@asset = Asset.find(params[:id])
|
36
|
-
@asset.update(asset_params)
|
37
|
-
|
36
|
+
if @asset.update(asset_params)
|
37
|
+
render json: @asset
|
38
|
+
else
|
39
|
+
render json: {errors: @asset.errors}.to_json, status: :unprocessable_entity
|
40
|
+
end
|
38
41
|
end
|
39
42
|
|
40
43
|
def show
|
@@ -18,6 +18,20 @@ module Kms
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def update
|
22
|
+
@user = User.find(params[:id])
|
23
|
+
if @user.update(user_params)
|
24
|
+
head :no_content
|
25
|
+
else
|
26
|
+
render json: {errors: @user.errors}.to_json, status: :unprocessable_entity
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def show
|
31
|
+
@user = User.find(params[:id])
|
32
|
+
render json: @user
|
33
|
+
end
|
34
|
+
|
21
35
|
def destroy
|
22
36
|
@user = User.find(params[:id])
|
23
37
|
@user.destroy
|
@@ -4,6 +4,8 @@ module Kms
|
|
4
4
|
{}
|
5
5
|
end
|
6
6
|
|
7
|
+
NON_TEMPLATABLE_CLASSES = [Page, Template, Asset, User, Snippet].freeze
|
8
|
+
|
7
9
|
def self.register(group, resource, tab_icon_class)
|
8
10
|
self.resources[group] ||= {}
|
9
11
|
self.resources[group][resource] = tab_icon_class
|
@@ -14,7 +16,7 @@ module Kms
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.external_resources_hash
|
17
|
-
self.resources.values.map(&:keys).flatten.reject {|r|
|
19
|
+
self.resources.values.map(&:keys).flatten.reject {|r| NON_TEMPLATABLE_CLASSES.include?(r)}.map do |resource_class|
|
18
20
|
{type: resource_class.name, title: resource_class.model_name.human}
|
19
21
|
end
|
20
22
|
end
|
@@ -72,7 +72,7 @@
|
|
72
72
|
<% end %>
|
73
73
|
<% resources.each do |resource_class, tab_icon_class| %>
|
74
74
|
<% if can? :index, resource_class %>
|
75
|
-
<li class="sidebar-list">
|
75
|
+
<li class="sidebar-list" ui-sref-active-eq="active">
|
76
76
|
<a ui-sref="<%= defined?(Kms::Model) && resource_class.is_a?(Kms::Model) ? "models.entries({modelId: #{resource_class.name}})" : resource_class.name.demodulize.tableize %>" title="<%= resource_class.model_name.human(count: 1.1) %>">
|
77
77
|
<%= truncate(resource_class.model_name.human(count: 1.1), length: 22) %>
|
78
78
|
<span class="menu-icon fa <%= tab_icon_class %>"></span>
|
data/config/locales/en.yml
CHANGED
@@ -10,11 +10,15 @@ en:
|
|
10
10
|
new_template: "New Template"
|
11
11
|
edit_template: "Edit Template"
|
12
12
|
update_template: "Update template"
|
13
|
+
template_successfully_created: "Template successfully created"
|
14
|
+
template_successfully_updated: "Template successfully updated"
|
13
15
|
add_page: "Add page"
|
14
16
|
create_first_page: "Create first page"
|
15
17
|
new_page: "New Page"
|
16
18
|
edit_page: "Edit Page"
|
17
19
|
update_page: "Update page"
|
20
|
+
page_successfully_created: "Page successfully created"
|
21
|
+
page_successfully_updated: "Page successfully updated"
|
18
22
|
update_page_and_continue: "Update page and continue"
|
19
23
|
update_template_and_continue: "Update template and continue"
|
20
24
|
update_asset_and_continue: "Update asset and continue"
|
@@ -23,15 +27,20 @@ en:
|
|
23
27
|
new_asset: "New Asset"
|
24
28
|
edit_asset: "Edit Asset"
|
25
29
|
update_asset: "Update asset"
|
30
|
+
asset_successfully_updated: "Asset successfully updated"
|
26
31
|
upload_assets: "Upload assets"
|
27
32
|
add_user: "Add user"
|
28
33
|
new_user: "New User"
|
34
|
+
edit_user: "Edit User"
|
35
|
+
update_user: "Update user"
|
29
36
|
toggle_fullscreen_mode_instruction: "Press F11 when cursor is in the editor to toggle full screen editing. ESC can also be used to exit full screen editing."
|
30
37
|
add_snippet: "Add snippet"
|
31
38
|
create_first_snippet: "Create first snippet"
|
32
39
|
new_snippet: "New Snippet"
|
33
40
|
edit_snippet: "Edit Snippet"
|
34
41
|
update_snippet: "Update snippet"
|
42
|
+
snippet_successfully_created: "Snippet successfully created"
|
43
|
+
snippet_successfully_updated: "Snippet successfully updated"
|
35
44
|
documentation: "Documentation"
|
36
45
|
need_help: "Need help?"
|
37
46
|
settings: "Settings"
|
@@ -52,6 +61,9 @@ en:
|
|
52
61
|
snippets_description: "Snippets are pieces of HTML that you could include in templates or pages"
|
53
62
|
assets_description: "Upload stylesheets, javascripts, images and other files here (you can even pick multiple)"
|
54
63
|
assets_drop_description: "or just drag and drop them"
|
64
|
+
roles_description: "Admins can manage any content. Content managers have access only to \"Pages\" and \"Assets\" under \"Content Management\" section (but also have access to other sections). The second difference is Admins see pages content in html editor, Content Managers - in WYSIWYG editor"
|
65
|
+
or_hit: "or hit "
|
66
|
+
while_your_cursor_in_input: " while your cursor in input"
|
55
67
|
roles:
|
56
68
|
admin: "Admin"
|
57
69
|
content_manager: "Content manager"
|