bookingsync_portal 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +174 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/config/manifest.js +3 -0
  6. data/app/assets/images/bookingsync_portal/bookingsync.png +0 -0
  7. data/app/assets/images/bookingsync_portal/help/connect.gif +0 -0
  8. data/app/assets/javascripts/bookingsync_portal/admin/application.js.coffee +83 -0
  9. data/app/assets/javascripts/bookingsync_portal/admin/connections.js.coffee +3 -0
  10. data/app/assets/javascripts/bookingsync_portal/admin/handle_remote_errors.js.coffee +3 -0
  11. data/app/assets/javascripts/bookingsync_portal/admin/lib/list-filter.js.coffee +28 -0
  12. data/app/assets/javascripts/bookingsync_portal/admin/live_updates.js.coffee +7 -0
  13. data/app/assets/javascripts/bookingsync_portal/admin/rentals.js.coffee +12 -0
  14. data/app/assets/javascripts/bookingsync_portal/admin/templates/filter_input.hbs +6 -0
  15. data/app/assets/javascripts/bookingsync_portal/admin/vendor/css-contains.js +29 -0
  16. data/app/assets/stylesheets/bookingsync_portal/admin/application.scss +241 -0
  17. data/app/controllers/bookingsync_portal/admin/base_controller.rb +25 -0
  18. data/app/controllers/bookingsync_portal/admin/connections_controller.rb +48 -0
  19. data/app/controllers/bookingsync_portal/admin/help_controller.rb +7 -0
  20. data/app/controllers/bookingsync_portal/admin/remote_accounts_controller.rb +27 -0
  21. data/app/controllers/bookingsync_portal/admin/rentals_controller.rb +36 -0
  22. data/app/controllers/bookingsync_portal/application_controller.rb +4 -0
  23. data/app/helpers/bookingsync_portal/admin/application_helper.rb +34 -0
  24. data/app/models/bookingsync_portal/account.rb +15 -0
  25. data/app/models/bookingsync_portal/connection.rb +29 -0
  26. data/app/models/bookingsync_portal/photo.rb +8 -0
  27. data/app/models/bookingsync_portal/rate.rb +6 -0
  28. data/app/models/bookingsync_portal/remote_account.rb +9 -0
  29. data/app/models/bookingsync_portal/remote_rental.rb +31 -0
  30. data/app/models/bookingsync_portal/rental.rb +26 -0
  31. data/app/synchronizers/bookingsync_portal/write/ensure_source_exists.rb +22 -0
  32. data/app/synchronizers/bookingsync_portal/write/source.rb +30 -0
  33. data/app/views/bookingsync_portal/admin/connections/create.js.coffee +6 -0
  34. data/app/views/bookingsync_portal/admin/connections/destroy.js.coffee +7 -0
  35. data/app/views/bookingsync_portal/admin/help/_help.html.erb +5 -0
  36. data/app/views/bookingsync_portal/admin/help/index.html.erb +7 -0
  37. data/app/views/bookingsync_portal/admin/remote_accounts/_form.html.erb +11 -0
  38. data/app/views/bookingsync_portal/admin/remote_accounts/_how_to_connect.html.erb +1 -0
  39. data/app/views/bookingsync_portal/admin/remote_accounts/new.html.erb +5 -0
  40. data/app/views/bookingsync_portal/admin/rentals/_connected_rental.html.erb +30 -0
  41. data/app/views/bookingsync_portal/admin/rentals/_new_remote_account.html.erb +3 -0
  42. data/app/views/bookingsync_portal/admin/rentals/_new_remote_rental.html.erb +6 -0
  43. data/app/views/bookingsync_portal/admin/rentals/_remote_rental.html.erb +11 -0
  44. data/app/views/bookingsync_portal/admin/rentals/_rental.html.erb +14 -0
  45. data/app/views/bookingsync_portal/admin/rentals/_rentals.html.erb +14 -0
  46. data/app/views/bookingsync_portal/admin/rentals/index.html.erb +56 -0
  47. data/app/views/bookingsync_portal/admin/rentals/show.js.erb +7 -0
  48. data/app/views/layouts/bookingsync_portal/_flash.html.erb +8 -0
  49. data/app/views/layouts/bookingsync_portal/_menu.html.erb +30 -0
  50. data/app/views/layouts/bookingsync_portal/admin.html.erb +21 -0
  51. data/app/views/layouts/bookingsync_portal/fullscreen/application.html.erb +19 -0
  52. data/config/locales/en.yml +85 -0
  53. data/config/routes.rb +9 -0
  54. data/db/migrate/20150222172825_create_accounts.rb +17 -0
  55. data/db/migrate/20150222173413_create_rentals.rb +14 -0
  56. data/db/migrate/20150222173711_create_remote_accounts.rb +10 -0
  57. data/db/migrate/20150222174023_create_remote_rentals.rb +12 -0
  58. data/db/migrate/20150222174234_create_connections.rb +10 -0
  59. data/db/migrate/20150520134912_create_photos.rb +13 -0
  60. data/db/migrate/20150521091056_create_rates.rb +12 -0
  61. data/db/migrate/20151210164752_add_synced_source_id_to_account.rb +5 -0
  62. data/db/migrate/20160301141356_create_bookings.rb +9 -0
  63. data/lib/bookingsync_portal.rb +77 -0
  64. data/lib/bookingsync_portal/booking_map.rb +109 -0
  65. data/lib/bookingsync_portal/engine.rb +18 -0
  66. data/lib/bookingsync_portal/mash_serializer.rb +9 -0
  67. data/lib/bookingsync_portal/version.rb +3 -0
  68. data/lib/generators/bookingsync_portal/install_generator.rb +22 -0
  69. data/lib/generators/templates/initializers/bookingsync_portal.rb +48 -0
  70. data/lib/generators/templates/models/account.rb +14 -0
  71. data/lib/generators/templates/models/connection.rb +2 -0
  72. data/lib/generators/templates/models/photo.rb +4 -0
  73. data/lib/generators/templates/models/rate.rb +3 -0
  74. data/lib/generators/templates/models/remote_account.rb +6 -0
  75. data/lib/generators/templates/models/remote_rental.rb +6 -0
  76. data/lib/generators/templates/models/rental.rb +11 -0
  77. data/lib/tasks/bookingsync_portal_tasks.rake +4 -0
  78. metadata +521 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6d421d75ad1576b846c1193f95a99cbdccfc69c3a2e425ce277f9b0f1ee5da96
4
+ data.tar.gz: ca119adacdf8c98acb2e307ecb220b74741a3a066ba46531f764b686976f9ae8
5
+ SHA512:
6
+ metadata.gz: e943963710bb782ba8bf3f970115a07298de7cd98c5b1bdbd3d59705dc829070ad00f2499584fb33a8b2a1a423a36e554799d6072727d4a6b68671e2901a676a
7
+ data.tar.gz: ab637cea334141163a8672ccf1c4d7c6936f8e402babedf5ca52ce5675d7c400e2fab9273662e5726a8fabc502aec963e520412bb58b07e1417fd81953fea539
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Piotr Marciniak
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.
@@ -0,0 +1,174 @@
1
+ [![Code Climate](https://codeclimate.com/github/BookingSync/bookingsync_portal/badges/gpa.svg)](https://codeclimate.com/github/BookingSync/bookingsync_portal)
2
+ [![Build Status](https://travis-ci.org/BookingSync/bookingsync_portal.svg?branch=master)](https://travis-ci.org/BookingSync/bookingsync_portal)
3
+
4
+ # BookingsyncPortal
5
+
6
+ A Rails engine to simplify building BookingSync Portal Applications.
7
+
8
+ ## Requirements
9
+
10
+ This engine requires Rails `>= 5.2.0` and Ruby `>= 2.5.0`.
11
+
12
+ ## Documentation
13
+
14
+ [API documentation is available at rdoc.info](http://rdoc.info/github/BookingSync/bookingsync_portal/master/frames).
15
+
16
+ ## Installation
17
+
18
+ BookingSync Portal works with Rails 5.2 onwards and Ruby 2.5 onwards. To get started, add it to your Gemfile with:
19
+
20
+ ```ruby
21
+ gem 'bookingsync_portal'
22
+ ```
23
+
24
+ Then bundle install:
25
+
26
+ ```ruby
27
+ bundle install
28
+ ```
29
+
30
+ ### Add routes
31
+
32
+ BookingSync Authorization routes need to be mounted inside you apps `routes.rb`:
33
+
34
+ ```ruby
35
+ mount BookingSync::Engine => '/'
36
+ ```
37
+
38
+ This will add the following routes:
39
+
40
+ * `/auth/bookingsync/callback`
41
+ * `/auth/failure`
42
+ * `/signout`
43
+
44
+ as well as BookingSync Portal controllers routes:
45
+
46
+ ```ruby
47
+ mount BookingsyncPortal::Engine => '/'
48
+ ```
49
+
50
+ ### Migrations
51
+
52
+ BookingSync Portal provide migrations for the most common models:
53
+ * `Account`: BookingSync accounts,
54
+ * `Connection`: connection between `rentals` and `remote_rentals`,
55
+ * `Photo`: BookingSync rentals' photos,
56
+ * `Rate`: BookingSync rentals' rates,
57
+ * `RemoteAccount`: Portal accounts,
58
+ * `RemoteRental`: Portal rentals,
59
+ * `Rental`: BookingSync rentals,
60
+
61
+ You can copy the migrations file to your application by running:
62
+
63
+ ```console
64
+ rake bookingsync_portal:install:migrations
65
+ ```
66
+
67
+ then run the migration:
68
+
69
+ ```console
70
+ rake db:migrate
71
+ ```
72
+
73
+ ### Add initializer and default models
74
+
75
+ This will install a configuration file in `config/initializers/bookingsync_portal.rb` as well as creating default models:
76
+
77
+ ```console
78
+ rails g bookingsync_portal:install
79
+ ```
80
+
81
+
82
+ ### Assets
83
+
84
+ You will need to install the assets for each namespace:
85
+
86
+ in `/app/assets/javascripts/admin/application.js`:
87
+
88
+ ```javascript
89
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
90
+ // listed below.
91
+ //
92
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
93
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
94
+ //
95
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
96
+ // compiled file.
97
+ //
98
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
99
+ // about supported directives.
100
+ //
101
+ //= require bookingsync_portal/admin/application
102
+ //= require_tree .
103
+ ```
104
+
105
+ in `/app/assets/javascripts/admin/application.css.scss`:
106
+
107
+ ```scss
108
+ /*
109
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
110
+ * listed below.
111
+ *
112
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
113
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
114
+ *
115
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
116
+ * compiled file so the styles you add here take precedence over styles defined in any styles
117
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
118
+ * file per style scope.
119
+ *
120
+ *= require bookingsync_portal/admin/application
121
+ *= require_self
122
+ */
123
+
124
+ ```
125
+
126
+
127
+ _Note: When saving new token, this gem uses a separate thread with new db connection to ensure token save (in case of a rollback in the main transaction). To make room for the new connections, it is recommended to increase db `pool` size by 2-3._
128
+
129
+ ## Configuration
130
+
131
+ The engine is configured by the following ENV variables:
132
+
133
+ * `BOOKINGSYNC_URL` - the url of the website, should be `https://www.bookingsync.com`
134
+ * `BOOKINGSYNC_APP_ID` - BookingSync Application's Client ID
135
+ * `BOOKINGSYNC_APP_SECRET` - BookingSync Application's Client Secret
136
+ * `BOOKINGSYNC_VERIFY_SSL` - Verify SSL (available only in development or test). Default to false
137
+ * `BOOKINGSYNC_SCOPE` - Space separated list of required scopes. Defaults to nil, which means the public scope.
138
+
139
+ You might want to use [dotenv-rails](https://github.com/bkeepers/dotenv)
140
+ to make ENV variables management easy.
141
+
142
+ Rack::Lock is not recommended with message_bus gem, causing deadlock problems. You might want to add this line to your app `development.rb` file:
143
+
144
+ ```ruby
145
+ config.middleware.delete Rack::Lock
146
+ ```
147
+
148
+ ## Testing
149
+
150
+ ### RSpec
151
+
152
+ We do provide some helper for RSpec users, you can include them in your `spec/rails_helper.rb` (before `spec/support` inclusion):
153
+ ```
154
+ require 'bookingsync_application/spec_helper'
155
+ ```
156
+
157
+ ### VCR
158
+
159
+ We recommend a VCR setup inspired from the following configuration. It will mask authorization tokens from your fixtures:
160
+
161
+ ```ruby
162
+ require 'vcr'
163
+
164
+ VCR.configure do |config|
165
+ config.cassette_library_dir = 'spec/fixtures/cassettes'
166
+ config.hook_into :webmock
167
+ config.configure_rspec_metadata!
168
+ config.filter_sensitive_data('BOOKINGSYNC_OAUTH_ACCESS_TOKEN') do
169
+ ENV['BOOKINGSYNC_OAUTH_ACCESS_TOKEN']
170
+ end
171
+ # Uncomment if using codeclimate
172
+ # config.ignore_hosts 'codeclimate.com'
173
+ end
174
+ ```
@@ -0,0 +1,28 @@
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 = 'BookingsyncPortal'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rspec/core'
23
+ require 'rspec/core/rake_task'
24
+
25
+ desc 'Run all specs in spec directory (excluding plugin specs)'
26
+ RSpec::Core::RakeTask.new(spec: 'app:db:test:prepare')
27
+
28
+ task default: :spec
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link "bookingsync_portal/admin/application.js"
3
+ //= link "bookingsync_portal/admin/application.css"
@@ -0,0 +1,83 @@
1
+ # This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ # listed below.
3
+ #
4
+ # Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ # or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ #
7
+ # It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ # compiled file.
9
+ #
10
+ # Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ # about supported directives.
12
+ #
13
+ #= require jquery
14
+ #= require jquery_ujs
15
+ #= require jquery-ui/widgets/draggable
16
+ #= require jquery-ui/widgets/droppable
17
+ #= require handlebars.runtime
18
+ #= require message-bus
19
+ #= require bootstrap/alert
20
+ #= require bootstrap/collapse
21
+ #= require bookingsync/form
22
+ #= require ./vendor/css-contains
23
+ #= require ./lib/list-filter
24
+ #= require_tree ./templates
25
+ #= require_tree .
26
+
27
+ window.extractIdFromDomId = (attribute) ->
28
+ if attribute
29
+ attribute.split("_").pop()
30
+ $.fn.extend
31
+ draggableRental: ->
32
+ settings =
33
+ revert: "invalid"
34
+ zIndex: 50
35
+ revertDuration: 100
36
+ cursor: "move"
37
+ containment: '.rentals-container'
38
+ appendTo: '.rentals-container'
39
+ helper: "clone"
40
+ scroll: false
41
+
42
+ start: (e, ui) ->
43
+ $(ui.helper).addClass "ui-draggable-helper"
44
+
45
+ @each () ->
46
+ $(this).draggable(settings)
47
+
48
+ droppableRemoteRental: ->
49
+ settings =
50
+ accept: ".bookingsync-rental"
51
+ activeClass: "dropzone-active"
52
+ hoverClass: "dropzone-hover"
53
+ greedy: true
54
+ tolerance: "pointer"
55
+ drop: (event, ui) ->
56
+ remoteRentalDropZone = $(@)
57
+
58
+ rentalId = extractIdFromDomId($(ui.draggable).attr("id"))
59
+ remoteRentalId = extractIdFromDomId(remoteRentalDropZone.attr("id"))
60
+ remoteAccountId = remoteRentalDropZone.data("remote-account-id")
61
+
62
+ if remoteRentalId
63
+ postData = { "rental_id": rentalId, "remote_rental_id": remoteRentalId }
64
+ else
65
+ postData = { "rental_id": rentalId, "remote_account_id": remoteAccountId }
66
+ # clone new remote rental drop zone and append to the end
67
+ remoteRentalDropZone.clone().insertBefore(remoteRentalDropZone).addClass('new_rental_placeholder');
68
+
69
+ $(ui.draggable).remove()
70
+
71
+ connect_url = $('.remote-rentals-list.rentals-list').data('connect-url')
72
+
73
+ $.ajax
74
+ url: connect_url
75
+ type: "POST"
76
+ data: postData
77
+ dataType: 'script'
78
+ beforeSend: ->
79
+ $(@).addClass('loading')
80
+ success: ->
81
+ $(@).removeClass('loading')
82
+ @each () ->
83
+ $(this).droppable(settings)
@@ -0,0 +1,3 @@
1
+ $ ->
2
+ $(".bookingsync-rental").draggableRental()
3
+ $(".panel.panel-remote").droppableRemoteRental()
@@ -0,0 +1,3 @@
1
+ $ ->
2
+ $(document).ajaxError (e, xhr) ->
3
+ location.reload() if xhr.status == 401
@@ -0,0 +1,28 @@
1
+ class @ListFilter
2
+ constructor: (header, list, @listElement, @listFilterable, @inputId, formTemplate) ->
3
+ @header = $(header)
4
+ @list = $(list)
5
+ @form = $(formTemplate)
6
+
7
+ @insertForm()
8
+ @observeInputChanges()
9
+
10
+ insertForm: ->
11
+ @form.appendTo(@header)
12
+ @input = $("#" + @inputId)
13
+
14
+ observeInputChanges: ->
15
+ @input.change( =>
16
+ filter = $(event.target).val()
17
+ @hideElements @listFilterable + ":not(:Contains(" + filter + "))"
18
+ @showElements @listFilterable + ":Contains(" + filter + ")"
19
+ false
20
+ ).keyup =>
21
+ # fire the above change event after every letter
22
+ @input.change()
23
+
24
+ showElements: (elements) ->
25
+ @list.find(elements).parents(@listElement).show()
26
+
27
+ hideElements: (elements) ->
28
+ @list.find(elements).parents(@listElement).hide()
@@ -0,0 +1,7 @@
1
+ $ ->
2
+ messagebus_channel = $("body").data("messagebus-channel")
3
+ MessageBus.start()
4
+ MessageBus.subscribe messagebus_channel, (data) ->
5
+ if data.refresh_from
6
+ $.get(data.refresh_from).fail (xhr) ->
7
+ location.reload() if xhr.status == 401
@@ -0,0 +1,12 @@
1
+ $ ->
2
+ for rentalsList, index in $(".rentals-list")
3
+ inputId = "rentals-list-filter-#{index}"
4
+ new ListFilter(
5
+ $(rentalsList).children(".rentals-list-header"),
6
+ $(rentalsList).children(".rentals-list-scroll"),
7
+ ".panel",
8
+ ".panel h4",
9
+ inputId,
10
+ HandlebarsTemplates["filter_input"]
11
+ inputId: inputId
12
+ )
@@ -0,0 +1,6 @@
1
+ <form class="filterform" action="#">
2
+ <div class="form-group">
3
+ <label class="control-label" for="{{inputId}}">Search in listings</label>
4
+ <input class="filterinput form-control" type="text" id="{{inputId}}">
5
+ </div>
6
+ </form>
@@ -0,0 +1,29 @@
1
+ // Copyright (c) 2010 Kilian Valkhof
2
+
3
+ // Permission is hereby granted, free of charge, to any person
4
+ // obtaining a copy of this software and associated documentation
5
+ // files (the "Software"), to deal in the Software without
6
+ // restriction, including without limitation the rights to use,
7
+ // copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ // copies of the Software, and to permit persons to whom the
9
+ // Software is furnished to do so, subject to the following
10
+ // 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
17
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ // OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ !function ($) {
25
+ // custom css expression for a case-insensitive contains()
26
+ jQuery.expr[':'].Contains = function(a, i, m) {
27
+ return (a.textContent || a.innerText || "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
28
+ }
29
+ }(jQuery);
@@ -0,0 +1,241 @@
1
+ @import "font-awesome-sprockets";
2
+ @import "font-awesome";
3
+ @import "bootstrap-bookingsync-sprockets";
4
+ @import "bootstrap-bookingsync";
5
+
6
+ html, body {
7
+ height: 100%;
8
+ height: 100vh;
9
+ }
10
+
11
+ body.fullscreen {
12
+ background-color: #fff;
13
+ padding: 1em;
14
+ }
15
+
16
+ body > .footer {
17
+ clear: both;
18
+ }
19
+
20
+ .container-fullscreen {
21
+ height: 100%;
22
+ width: 100%;
23
+
24
+ > #flash > .alert {
25
+ border-top: 0;
26
+ border-left: 0;
27
+ border-right: 0;
28
+ border-radius: 0;
29
+ margin: 0 (-1 * ceil($grid-gutter-width / 2));
30
+ }
31
+ }
32
+
33
+ .rentals-container {
34
+ height: 100%;
35
+ padding: ceil($grid-gutter-width / 2) 0;
36
+ margin: 0 (-1 * ceil($grid-gutter-width / 2));
37
+
38
+ & > div {
39
+ height: 100%;
40
+ min-width: 300px;
41
+ }
42
+ }
43
+
44
+ .rentals-list {
45
+ height: 100%;
46
+ display: flex;
47
+ flex-direction: column;
48
+ overflow: auto;
49
+ padding: ceil($grid-gutter-width / 2);
50
+ border-radius: 4px;
51
+ border: 1px solid $gray-lighter;
52
+
53
+ legend {
54
+ border: 0;
55
+ }
56
+
57
+ h3 {
58
+ border-top: 1px solid $gray-lighter;
59
+ font-size: 14px;
60
+ padding: 10px 10px;
61
+ margin: 0;
62
+ }
63
+ }
64
+
65
+ .filterform {
66
+ margin-bottom: 10px;
67
+ width: 90%;
68
+ margin-left: 5%;
69
+ font-size: small;
70
+ }
71
+
72
+ .rentals-list-header, .rentals-list-footer {
73
+ flex: 0 0 auto;
74
+ }
75
+
76
+ .rentals-list-header {
77
+ img {
78
+ height: 29px;
79
+ }
80
+ }
81
+
82
+ .rentals-list-footer {
83
+ border-top: 1px solid $gray-lighter;
84
+ margin-left: (-1 * ceil($grid-gutter-width / 2));
85
+ margin-right: (-1 * ceil($grid-gutter-width / 2));
86
+ padding-top: 8px;
87
+ margin-bottom: (-1 * ceil($grid-gutter-width / 2)) + 8px;
88
+ }
89
+
90
+ .rentals-list-scroll {
91
+ flex: 1 1 auto;
92
+ overflow-y: auto;
93
+ margin-left: (-1 * ceil($grid-gutter-width / 2));
94
+ margin-right: (-1 * ceil($grid-gutter-width / 2));
95
+
96
+ .well {
97
+ border-left: 0;
98
+ border-right: 0;
99
+ border-radius: 0;
100
+ box-shadow: none;
101
+ background-color: $body-bg;
102
+
103
+ i {
104
+ color: $gray-light;
105
+ }
106
+ }
107
+ }
108
+
109
+ .remote-rentals-list {
110
+ background-color: #fff;
111
+
112
+ .dropzone-active {
113
+ border: 1px dashed $btn-success-border;
114
+ }
115
+
116
+ .dropzone-hover {
117
+ border: 1px solid $btn-success-border;
118
+ }
119
+ }
120
+
121
+ .rentals-container .panel-bookingsync.ui-draggable-dragging {
122
+ box-shadow: 0 0 10px $gray-light;
123
+ background-color: #fff;
124
+ height: auto;
125
+ border: 1px solid $gray-lighter;
126
+ width: 31%;
127
+ transform: scale(1.1);
128
+ }
129
+
130
+ .panel {
131
+ padding: 10px;
132
+ border-radius: 0;
133
+ margin-bottom: 0;
134
+ border-top: 1px solid $gray-lighter;
135
+ border-bottom: 1px solid $gray-lighter;
136
+ position: relative;
137
+
138
+ & + .panel,
139
+ & + h3 {
140
+ border-top: 0;
141
+ }
142
+
143
+ .alert {
144
+ margin: 10px -12px;
145
+ border-radius: 0;
146
+ }
147
+
148
+ .alert-bottom:last-of-type {
149
+ margin-bottom: -10px;
150
+ }
151
+ }
152
+
153
+ .panel-body-grid {
154
+ display: flex;
155
+ overflow: hidden;
156
+ position: relative;
157
+ }
158
+
159
+ .panel-body-grid-photo {
160
+ min-width: 96px;
161
+ height: 64px;
162
+ flex-grow: 0;
163
+ background-color: rgba(255, 255, 255, 0.8);
164
+ }
165
+
166
+ .panel-body-grid-text {
167
+ padding: 0 $padding-base-horizontal;
168
+ flex-grow: 1;
169
+ overflow: hidden;
170
+
171
+ h4 {
172
+ margin: 0 0 10px 0;
173
+ line-height: 1.4;
174
+ }
175
+
176
+ p {
177
+ margin: 0;
178
+ font-size: 12px;
179
+ }
180
+ }
181
+
182
+ .panel-bookingsync {
183
+ background-color: $body-bg;
184
+ }
185
+
186
+ .panel-connected {
187
+ .panel-heading {
188
+ position: relative;
189
+ }
190
+
191
+ h4 small {
192
+ color: $gray-lighter;
193
+ display: block;
194
+ }
195
+
196
+ .status {
197
+ position: absolute;
198
+ right: 3px;
199
+ top: 8px;
200
+
201
+ .btn-xs {
202
+ border-radius: 11px;
203
+ }
204
+
205
+ .remove-connection {
206
+ .hover_show {
207
+ display: none;
208
+ }
209
+
210
+ .fa-check {
211
+ border-radius: 11px;
212
+ }
213
+
214
+ &:hover {
215
+ background-color: $brand-danger;
216
+ border-color: $brand-danger;
217
+ border-radius: $border-radius-small;
218
+
219
+ .hover_hide {
220
+ display: none;
221
+ }
222
+
223
+ .hover_show {
224
+ display: block;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+
231
+ .panel-remote {
232
+ background-color: $body-bg;
233
+ opacity: 0.5;
234
+ }
235
+
236
+ .panel.ui-draggable {
237
+ &:hover {
238
+ cursor: move;
239
+ background-color: #fff;
240
+ }
241
+ }