drg_resources_plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +23 -0
- data/Rakefile +36 -0
- data/app/assets/config/drg_resources_plugin_manifest.js +0 -0
- data/app/assets/javascripts/resources.js +25 -0
- data/app/assets/stylesheets/resources.css +73 -0
- data/app/controllers/drgcms_controls/resource_usage_control.rb +58 -0
- data/app/forms/resource.yml +53 -0
- data/app/forms/resource_usage.yml +43 -0
- data/app/forms/resource_usage_show.yml +14 -0
- data/app/helpers/resources_helper.rb +21 -0
- data/app/helpers/resources_renderer.rb +58 -0
- data/app/models/resource.rb +58 -0
- data/app/models/resource_usage.rb +79 -0
- data/app/views/resources/_menu.html.erb +21 -0
- data/app/views/resources/_usage.html.erb +30 -0
- data/config/locales/resources_en.yml +52 -0
- data/config/routes.rb +2 -0
- data/lib/drg_resources_plugin.rb +7 -0
- data/lib/drg_resources_plugin/engine.rb +4 -0
- data/lib/drg_resources_plugin/version.rb +3 -0
- data/lib/tasks/drg_resources_plugin_tasks.rake +4 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 82e107f96a1a35c8513033e2f42a806747860ac4
|
4
|
+
data.tar.gz: d86ef816c91c546495c853a882486cefeffc8aec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bae22f69c567c280f849f327986f882a4a57ee1213203cfb74050e9ad89e4e34f4f30263518f5b78cb85a1cae175e7b49bbd2a62a778e84065f4c0cb95f0ecf5
|
7
|
+
data.tar.gz: 94cbd3d17b92f842413fff67fa82f463cc667f473b7229a73e29e7c862ece46db6b03720ac89b911fd604c3c01dfc96e1c43f9bd847dc26e228809786e067a1e
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2018 Damjan Rems
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
# DrgResourcesPlugin
|
3
|
+
This is DRG CMS plugin which can be used for internal resources reservation. I am using it for keeping record of company autopark, but it can be used for any kind of resource reservation.
|
4
|
+
Resorces have category field, to distinct different kind of resources. Resources categories must be defined in Big Table under 'resource-categories' key.
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'drg_resources_plugin'
|
11
|
+
```
|
12
|
+
and run bundle to add new gem to application.
|
13
|
+
|
14
|
+
Create page with resources link, set design to Portal design and set site to your portal name.
|
15
|
+
Create new top menu option in site menu and link it to Resources page.
|
16
|
+
|
17
|
+
Refresh browser and click Resources menu option.
|
18
|
+
|
19
|
+
## Contributing
|
20
|
+
Fork this repository on GitHub and issue a pull request
|
21
|
+
|
22
|
+
## License
|
23
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'DrgResourcesPlugin'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'bundler/gem_tasks'
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'test'
|
31
|
+
t.pattern = 'test/**/*_test.rb'
|
32
|
+
t.verbose = false
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
task default: :test
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
$(document).ready(function() {
|
3
|
+
/**********************************************************************
|
4
|
+
* Resources: Update resource usage panel when selected_date changes
|
5
|
+
**********************************************************************/
|
6
|
+
$('#record_selected_date').bind('change', function() {
|
7
|
+
var category = $('#category').val();
|
8
|
+
window.location.href = '/resources?selected_date=' + this.value + '&category=' + category;
|
9
|
+
});
|
10
|
+
|
11
|
+
/**********************************************************************
|
12
|
+
* Resources: Update resource usage panel when categorychanges
|
13
|
+
**********************************************************************/
|
14
|
+
$('#category').bind('change', function() {
|
15
|
+
window.location.href = '/resources?category=' + this.value;
|
16
|
+
});
|
17
|
+
|
18
|
+
/*******************************************************************
|
19
|
+
* Popup CMS edit menu option clicked
|
20
|
+
*******************************************************************/
|
21
|
+
$('.resources-table .usage div').on('click',function(e) {
|
22
|
+
var url = e.target.getAttribute("data-url");
|
23
|
+
$('#iframe_edit').attr('src', url);
|
24
|
+
});
|
25
|
+
});
|
@@ -0,0 +1,73 @@
|
|
1
|
+
.action-menu {
|
2
|
+
margin: 0;
|
3
|
+
}
|
4
|
+
.action-menu li {
|
5
|
+
display: inline;
|
6
|
+
position: relative;
|
7
|
+
list-style: none;
|
8
|
+
margin-right: 4px;
|
9
|
+
}
|
10
|
+
|
11
|
+
.resources_menu #record_selected_date {
|
12
|
+
width: 120px;
|
13
|
+
height: 2rem;
|
14
|
+
display: inline;
|
15
|
+
margin-bottom: 0;
|
16
|
+
}
|
17
|
+
|
18
|
+
.resources_menu #category {
|
19
|
+
width: 120px;
|
20
|
+
height:inherit;
|
21
|
+
font-size: 1.2em;
|
22
|
+
padding: 4px 0px;
|
23
|
+
display: inline;
|
24
|
+
margin: 0 0 0 6px;
|
25
|
+
}
|
26
|
+
|
27
|
+
.resources-table .th {
|
28
|
+
width: 12%;
|
29
|
+
border: 1px solid #ccc;
|
30
|
+
border-right: none;
|
31
|
+
padding: 4px;
|
32
|
+
text-align: center;
|
33
|
+
font-weight: bold;
|
34
|
+
background-color: #ccc;
|
35
|
+
}
|
36
|
+
.resources-table .td {
|
37
|
+
width: 12%;
|
38
|
+
border: 1px solid #ccc;
|
39
|
+
border-top: none;
|
40
|
+
border-right: none;
|
41
|
+
min-height: 50px;
|
42
|
+
vertical-align: central;
|
43
|
+
padding: 2px 0;
|
44
|
+
}
|
45
|
+
|
46
|
+
.resources-table .th.name, .resources-table .td.name {
|
47
|
+
width: 16%;
|
48
|
+
font-weight: bold;
|
49
|
+
|
50
|
+
}
|
51
|
+
|
52
|
+
.resources-table .td.name {
|
53
|
+
background-color: #ffe;
|
54
|
+
}
|
55
|
+
|
56
|
+
.resources-table .td div {
|
57
|
+
background-color: #eee;
|
58
|
+
padding: 2px;
|
59
|
+
border-top: 1px solid #ddd;
|
60
|
+
border-bottom: 1px solid #ddd;
|
61
|
+
margin: 2px 0;
|
62
|
+
white-space: nowrap;
|
63
|
+
overflow: hidden;
|
64
|
+
text-overflow: ellipsis;
|
65
|
+
}
|
66
|
+
|
67
|
+
.resources-table .td div:hover {
|
68
|
+
cursor: pointer;
|
69
|
+
}
|
70
|
+
|
71
|
+
.resources-table {
|
72
|
+
border-right: 1px solid #ccc;
|
73
|
+
}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2014+ Damjan Rems
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#++
|
24
|
+
|
25
|
+
module DrgcmsControls::ResourceUsageControl
|
26
|
+
|
27
|
+
######################################################################
|
28
|
+
# Called when new reservation is created.
|
29
|
+
######################################################################
|
30
|
+
def dc_new_record()
|
31
|
+
unless ( dc_user_has_role('resources-reservation') or dc_user_has_role('admin') )
|
32
|
+
flash[:error] = 'No permission for adding reservations!'
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
@record.resource_id = params[:resource_id]
|
36
|
+
@record.dc_user_id = session[:user_id]
|
37
|
+
@record.time_from = params[:current_date]
|
38
|
+
@record.time_to = params[:current_date]
|
39
|
+
end
|
40
|
+
|
41
|
+
######################################################################
|
42
|
+
# check if it's OK to delete reservation document.
|
43
|
+
######################################################################
|
44
|
+
def can_delete_resource()
|
45
|
+
# reservation's time is up
|
46
|
+
if @record.time_to < Time.now
|
47
|
+
flash[:error] = 'Time is up. Deleting is meaningless!'
|
48
|
+
return false
|
49
|
+
end
|
50
|
+
# not everyone can delete reservation
|
51
|
+
unless (@record.dc_user_id == session[:user_id] or dc_user_has_role('admin') )
|
52
|
+
flash[:error] = 'Only owner or administrator can delete document!'
|
53
|
+
return false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
## DRG Form
|
2
|
+
table: resource
|
3
|
+
|
4
|
+
index:
|
5
|
+
filter: id as text_field, name
|
6
|
+
actions: standard
|
7
|
+
|
8
|
+
result_set:
|
9
|
+
actions: standard
|
10
|
+
|
11
|
+
# actions:
|
12
|
+
# 1:
|
13
|
+
# type: link
|
14
|
+
# controller: controller_name
|
15
|
+
# action: action_name
|
16
|
+
# table: table_name
|
17
|
+
# form_name: form_name
|
18
|
+
# target: target
|
19
|
+
# method: (get),put,post
|
20
|
+
columns:
|
21
|
+
10:
|
22
|
+
name: name
|
23
|
+
20:
|
24
|
+
name: category
|
25
|
+
30:
|
26
|
+
name: description
|
27
|
+
width: 60%
|
28
|
+
40:
|
29
|
+
name: active
|
30
|
+
eval: dc_icon4_boolean
|
31
|
+
|
32
|
+
form:
|
33
|
+
title:
|
34
|
+
field: name
|
35
|
+
actions: standard
|
36
|
+
|
37
|
+
fields:
|
38
|
+
10:
|
39
|
+
name: name
|
40
|
+
type: text_field
|
41
|
+
size: 30
|
42
|
+
20:
|
43
|
+
name: description
|
44
|
+
type: text_field
|
45
|
+
size: 70
|
46
|
+
30:
|
47
|
+
name: category
|
48
|
+
type: select
|
49
|
+
eval: dc_big_table 'resource-categories'
|
50
|
+
40:
|
51
|
+
name: active
|
52
|
+
type: check_box
|
53
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
## DRG Form
|
2
|
+
---
|
3
|
+
table: resource_usage
|
4
|
+
title: Create new resource reservation
|
5
|
+
|
6
|
+
form:
|
7
|
+
actions:
|
8
|
+
1:
|
9
|
+
type: script
|
10
|
+
caption: Back
|
11
|
+
js: parent.location.href=parent.location.href
|
12
|
+
5:
|
13
|
+
type: submit
|
14
|
+
caption: Save
|
15
|
+
params:
|
16
|
+
after-save: return_to parent.reload
|
17
|
+
|
18
|
+
fields:
|
19
|
+
10:
|
20
|
+
name: resource_id
|
21
|
+
type: readonly
|
22
|
+
eval: dc_name4_id,resource,name
|
23
|
+
20:
|
24
|
+
name: description
|
25
|
+
type: text_field
|
26
|
+
html:
|
27
|
+
size: 50
|
28
|
+
30:
|
29
|
+
name: time_from
|
30
|
+
type: datetime_picker
|
31
|
+
options:
|
32
|
+
step: 30
|
33
|
+
40:
|
34
|
+
name: time_to
|
35
|
+
type: datetime_picker
|
36
|
+
options:
|
37
|
+
step: 30
|
38
|
+
# for displaying created by name
|
39
|
+
50:
|
40
|
+
name: dc_user_id
|
41
|
+
type: readonly
|
42
|
+
eval: dc_name4_id,dc_user,name
|
43
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ResourcesHelper
|
2
|
+
|
3
|
+
#####################################################################
|
4
|
+
#
|
5
|
+
#####################################################################
|
6
|
+
def render_usages(resource_usages, date)
|
7
|
+
html = ''
|
8
|
+
return html if resource_usages.nil?
|
9
|
+
resource_usages.each do |usage|
|
10
|
+
if usage.time_from <= date.end_of_day and usage.time_to >= date.beginning_of_day
|
11
|
+
time1 = usage.time_from < date.beginning_of_day ? '00:00' : usage.time_from.strftime('%H:%M')
|
12
|
+
time2 = usage.time_to > date.end_of_day ? '24:00' : usage.time_to.strftime('%H:%M')
|
13
|
+
next if time1 == time2
|
14
|
+
url = "/cms/#{usage.id}/edit?form_name=resource_usage_show&table=resource_usage"
|
15
|
+
html << %Q[<div title="Click to view" data-url="#{url}"><b>#{time1} - #{time2}</b><br>#{usage.description}</div>]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
html.html_safe
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2014+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
########################################################################
|
25
|
+
#
|
26
|
+
########################################################################
|
27
|
+
class ResourcesRenderer < DcRenderer
|
28
|
+
include DcApplicationHelper
|
29
|
+
|
30
|
+
########################################################################
|
31
|
+
#
|
32
|
+
########################################################################
|
33
|
+
def resources_usage
|
34
|
+
time = Date.parse(@parent.params[:selected_date]) rescue DateTime.now
|
35
|
+
date_from = time.beginning_of_week
|
36
|
+
date_to = time.end_of_week
|
37
|
+
|
38
|
+
resources = Resource.where(category: @parent.params[:category], active: true).order_by(name: 1).to_a
|
39
|
+
ids = resources.inject([]) { |r,e| r << e.id }
|
40
|
+
usages = ResourceUsage.where(:resource_id.in => ids)
|
41
|
+
.and(:time_from.lt => date_to, :time_to.gt => date_from)
|
42
|
+
.order_by(resource_id: 1, time_from: 1).group_by(&:resource_id)
|
43
|
+
#
|
44
|
+
@parent.render(partial: 'resources/usage', formats: [:html],
|
45
|
+
locals: { date_from: date_from, date_to: date_to,
|
46
|
+
resources: resources, usages: usages })
|
47
|
+
end
|
48
|
+
|
49
|
+
########################################################################
|
50
|
+
# default renderer method will render application menu and usage table below.
|
51
|
+
########################################################################
|
52
|
+
def default
|
53
|
+
html = @parent.render(partial: 'resources/menu', formats: [:html], locals: { parent: @parent })
|
54
|
+
html << dc_flash_messages
|
55
|
+
html << resources_usage#.html_safe
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2018+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
##########################################################################
|
25
|
+
# Resources declaration collection
|
26
|
+
#
|
27
|
+
# == Schema information
|
28
|
+
#
|
29
|
+
# Collection name: resource : Available resources
|
30
|
+
#
|
31
|
+
# _id BSON::ObjectId _id
|
32
|
+
# created_at Time Created at time
|
33
|
+
# updated_at Time Last updated at time
|
34
|
+
# name String Resource name
|
35
|
+
# description String Description of the resource
|
36
|
+
# category BSON::ObjectId Resource category
|
37
|
+
# active Boolean Resource is active
|
38
|
+
##########################################################################
|
39
|
+
class Resource
|
40
|
+
include Mongoid::Document
|
41
|
+
include Mongoid::Timestamps
|
42
|
+
|
43
|
+
field :name, type: String
|
44
|
+
field :description, type: String
|
45
|
+
field :category, type: BSON::ObjectId
|
46
|
+
field :active, type: Boolean, default: true
|
47
|
+
|
48
|
+
field :created_by, type: BSON::ObjectId
|
49
|
+
field :updated_by, type: BSON::ObjectId
|
50
|
+
|
51
|
+
index category: 1
|
52
|
+
|
53
|
+
validates :name, presence: true
|
54
|
+
validates :description, presence: true
|
55
|
+
validates :category, presence: true
|
56
|
+
|
57
|
+
has_many :resource_usages
|
58
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2018+ Damjan Rems
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#++
|
24
|
+
|
25
|
+
##########################################################################
|
26
|
+
# Resources usage (reservation) collection
|
27
|
+
#
|
28
|
+
# == Schema information
|
29
|
+
#
|
30
|
+
# Collection name: resource : Available resources
|
31
|
+
#
|
32
|
+
# _id BSON::ObjectId _id
|
33
|
+
# created_at Time Created at time
|
34
|
+
# updated_at Time Last updated at time
|
35
|
+
# time_from DateTime Reservation start time
|
36
|
+
# time_to DateTime Reservation end time
|
37
|
+
# description String Description of the reservation
|
38
|
+
# resource_id BSON::ObjectId Resource id
|
39
|
+
# dc_user_id BSON::ObjectId Reservation was created by
|
40
|
+
# active Boolean Resource is active
|
41
|
+
##########################################################################
|
42
|
+
class ResourceUsage
|
43
|
+
include Mongoid::Document
|
44
|
+
include Mongoid::Timestamps
|
45
|
+
|
46
|
+
field :time_from, type: DateTime
|
47
|
+
field :time_to, type: DateTime
|
48
|
+
field :description, type: String
|
49
|
+
|
50
|
+
field :created_by, type: BSON::ObjectId
|
51
|
+
field :updated_by, type: BSON::ObjectId
|
52
|
+
|
53
|
+
belongs_to :resource
|
54
|
+
belongs_to :dc_user
|
55
|
+
|
56
|
+
index resource_id: 1
|
57
|
+
|
58
|
+
validates :time_from, presence: true
|
59
|
+
validates :time_to, presence: true
|
60
|
+
validates :description, presence: true
|
61
|
+
|
62
|
+
validate :free_time_validations
|
63
|
+
|
64
|
+
######################################################################
|
65
|
+
# Validates if resource is available in specified time window.
|
66
|
+
######################################################################
|
67
|
+
def free_time_validations
|
68
|
+
errors.add(:time_from, "should be less then end time!") if time_from >= time_to
|
69
|
+
errors.add(:time_from, "is less then current time!") if time_from <= Time.now
|
70
|
+
if ResourceUsage.where(resource_id: resource_id).and({"$or" => [
|
71
|
+
{"$and" => [ {:time_from.lt => time_from}, {:time_to.gt => time_from} ] },
|
72
|
+
{"$and" => [ {:time_from.lt => time_to}, {:time_to.gt => time_to} ] },
|
73
|
+
{"$and" => [ {:time_from.gte => time_from}, {:time_to.lte => time_to} ] }
|
74
|
+
] }).exists?
|
75
|
+
errors.add(:time_from, "Resource already taken!")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<!-- Create DRG CMS field in the view -->
|
2
|
+
<%
|
3
|
+
form = {'name' => 'selected_date', 'html' => { 'value' => params[:selected_date], 'placeholder' => 'Select week' }}
|
4
|
+
date_picker = DrgcmsFormFields::DatePicker.new(parent, {}, form).render
|
5
|
+
%>
|
6
|
+
|
7
|
+
<ul class="action-menu resources_menu">
|
8
|
+
<li>
|
9
|
+
<%= date_picker.html.html_safe %>
|
10
|
+
<%= select(nil, 'category', DcBigTable.choices4('resource-categories', nil), { selected: params[:category]} ) %>
|
11
|
+
</li>
|
12
|
+
|
13
|
+
<li class="dc-link dc-animate">
|
14
|
+
<%= dc_link_to 'Resources', 'table', {controller: 'cmsedit', table: 'resource'}, target: 'iframe_edit' %>
|
15
|
+
</li>
|
16
|
+
</ul>
|
17
|
+
|
18
|
+
<%= javascript_tag(date_picker.js) %>
|
19
|
+
<hr class='hr-separator'>
|
20
|
+
|
21
|
+
<%= dc_iframe_edit(nil) %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
<div class='resources-table' width='99%'>
|
3
|
+
<div class="row date">
|
4
|
+
<div class="th name"></div>
|
5
|
+
<%# date = date_from; while date < date_to %>
|
6
|
+
<% date_from.step(date_to, 1) do |date| %>
|
7
|
+
<div class="th">
|
8
|
+
<%= I18n.t('date.day_names')[date.wday] %><br/><%= date.strftime('%d.%m.') %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="row resource">
|
14
|
+
<% for resource in resources %>
|
15
|
+
<div class="td name">
|
16
|
+
<%= resource.name %>
|
17
|
+
</div>
|
18
|
+
<% date_from.step(date_to, 1) do |date| %>
|
19
|
+
<div class="td usage">
|
20
|
+
<%= dc_link_to(nil, 'plus-square lg', { title: 'New reservation',
|
21
|
+
controller: :cmsedit, action: :new, target: :iframe_edit,
|
22
|
+
table: :resource_usage, resource_id: resource.id,
|
23
|
+
current_date: date.to_s}, {class: 'dc-link-img'} )
|
24
|
+
%>
|
25
|
+
<%= render_usages(usages[resource.id], date) %>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
</div>
|
30
|
+
</div>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2018+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
#################################################################
|
25
|
+
# Localization
|
26
|
+
en:
|
27
|
+
helpers:
|
28
|
+
label:
|
29
|
+
resource:
|
30
|
+
tabletitle: Resources
|
31
|
+
|
32
|
+
name: Name
|
33
|
+
description: Description
|
34
|
+
category: Category
|
35
|
+
active: Active
|
36
|
+
|
37
|
+
resource_usage:
|
38
|
+
tabletitle: Resource reservation
|
39
|
+
|
40
|
+
resource_id: Resource name
|
41
|
+
description: Description
|
42
|
+
time_from: Reserved from
|
43
|
+
time_to: Reserved to
|
44
|
+
dc_user_id: Created by
|
45
|
+
|
46
|
+
help:
|
47
|
+
resource:
|
48
|
+
name: Resource name
|
49
|
+
description: Short resource description
|
50
|
+
category: Resource category. Define categories under resources-categories key in BigTable.
|
51
|
+
active: Resource is active
|
52
|
+
|
data/config/routes.rb
ADDED
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: drg_resources_plugin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Damjan Rems
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-10-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: drg_cms
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: This is DRG CMS plugin which can be used for internal resources reservation.
|
42
|
+
I am using it for keeping record of company autopark.
|
43
|
+
email:
|
44
|
+
- damjan.rems@gmail.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- MIT-LICENSE
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- app/assets/config/drg_resources_plugin_manifest.js
|
53
|
+
- app/assets/javascripts/resources.js
|
54
|
+
- app/assets/stylesheets/resources.css
|
55
|
+
- app/controllers/drgcms_controls/resource_usage_control.rb
|
56
|
+
- app/forms/resource.yml
|
57
|
+
- app/forms/resource_usage.yml
|
58
|
+
- app/forms/resource_usage_show.yml
|
59
|
+
- app/helpers/resources_helper.rb
|
60
|
+
- app/helpers/resources_renderer.rb
|
61
|
+
- app/models/resource.rb
|
62
|
+
- app/models/resource_usage.rb
|
63
|
+
- app/views/resources/_menu.html.erb
|
64
|
+
- app/views/resources/_usage.html.erb
|
65
|
+
- config/locales/resources_en.yml
|
66
|
+
- config/routes.rb
|
67
|
+
- lib/drg_resources_plugin.rb
|
68
|
+
- lib/drg_resources_plugin/engine.rb
|
69
|
+
- lib/drg_resources_plugin/version.rb
|
70
|
+
- lib/tasks/drg_resources_plugin_tasks.rake
|
71
|
+
homepage: https://www.drgcms.org
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.6.14.1
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: DRG CMS portal plugin for resource reservation
|
95
|
+
test_files: []
|