From 5cf7be6f13304ff6d0242d3fc7063da0a97d7113 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sun, 13 Sep 2020 20:09:48 +0200 Subject: [PATCH] Upstream sync --- app/assets/images/ME_PRO_black.png | Bin 0 -> 26522 bytes app/assets/images/live_icon.png | Bin 0 -> 24666 bytes .../channels/broadcasts.coffee.erb | 4 +- app/assets/javascripts/stream_player.js.erb | 12 ++- app/assets/stylesheets/application.scss | 29 +++++- app/channels/broadcasts_channel.rb | 4 +- .../account_sessions_controller.rb | 1 + .../admin/account_locks_controller.rb | 31 +++++++ app/controllers/application_controller.rb | 7 ++ app/controllers/locked_accounts_controller.rb | 10 +++ app/helpers/dropzone_helper.rb | 9 ++ .../packs/active_storage_dropzone.js | 2 + app/jobs/match_appearance_releases_job.rb | 16 ++++ app/policies/account_lock_policy.rb | 9 ++ app/views/accounts/_form.html.erb | 2 +- app/views/accounts/new.html.erb | 3 + .../acquired_media_releases/index.html.erb | 9 +- .../acquired_media_releases/index.js.erb | 2 + app/views/admin/accounts/_account.html.erb | 5 ++ .../broadcasts/_broadcast_recordings.html.erb | 58 ++++++------ .../broadcasts/_broadcast_status.html.erb | 4 - app/views/broadcasts/_files_section.html.erb | 2 +- app/views/broadcasts/_live_take.html.erb | 41 +++++++-- .../broadcasts/_play_button_svg.html.erb | 3 + .../broadcasts/_recording_status.html.erb | 1 + app/views/broadcasts/show.html.erb | 75 +++++++--------- app/views/contracts/_logo_page.html.erb | 37 ++++++++ app/views/contracts/pdf.html.erb | 33 ++----- app/views/location_releases/index.html.erb | 7 +- app/views/location_releases/index.js.erb | 2 + app/views/locked_accounts/index.html.erb | 1 + .../_material_release.html.erb | 2 +- app/views/material_releases/index.html.erb | 7 +- app/views/material_releases/index.js.erb | 2 + app/views/medical_releases/index.html.erb | 7 +- app/views/medical_releases/index.js.erb | 2 + app/views/misc_releases/index.html.erb | 7 +- app/views/misc_releases/index.js.erb | 2 + app/views/music_releases/index.html.erb | 7 +- app/views/music_releases/index.js.erb | 2 + .../_releasable_files_dropzone.html.erb | 3 +- app/views/talent_releases/index.html.erb | 7 +- app/views/talent_releases/index.js.erb | 2 + config/locales/en.yml | 3 + config/locales/es.yml | 3 + config/routes.rb | 8 +- .../20200908085319_add_locked_to_accounts.rb | 5 ++ db/structure.sql | 6 +- spec/channels/broadcasts_channel_spec.rb | 8 +- spec/features/admin_managing_accounts_spec.rb | 18 ++++ spec/features/guest_account_signup_spec.rb | 13 +++ .../user_managing_appearance_releases_spec.rb | 9 ++ .../features/user_managing_broadcasts_spec.rb | 35 ++++++++ .../user_managing_locked_account_spec.rb | 34 +++++++ .../user_managing_material_releases_spec.rb | 2 +- .../user_managing_medical_releases_spec.rb | 12 +-- .../user_managing_misc_releases_spec.rb | 8 +- spec/jobs/generate_contracts_zip_job_spec.rb | 85 +++++++++++------- .../match_appearance_releases_job_spec.rb | 83 ++++++++++++++++- 59 files changed, 613 insertions(+), 188 deletions(-) create mode 100644 app/assets/images/ME_PRO_black.png create mode 100644 app/assets/images/live_icon.png create mode 100644 app/controllers/admin/account_locks_controller.rb create mode 100644 app/controllers/locked_accounts_controller.rb create mode 100644 app/policies/account_lock_policy.rb create mode 100644 app/views/broadcasts/_play_button_svg.html.erb create mode 100644 app/views/broadcasts/_recording_status.html.erb create mode 100644 app/views/contracts/_logo_page.html.erb create mode 100644 app/views/locked_accounts/index.html.erb create mode 100644 db/migrate/20200908085319_add_locked_to_accounts.rb create mode 100644 spec/features/user_managing_locked_account_spec.rb diff --git a/app/assets/images/ME_PRO_black.png b/app/assets/images/ME_PRO_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc7bd6bb549a2b804777248ae1ac31711c13756 GIT binary patch literal 26522 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
URPGpNLpW_e;GF9&UD?U` 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%0D9JB z52YW;7{$77yh9EezwtlU(tj~CJ^eUhJ8KOuL=q1?_zTp(^PMepcz?s+DzJPd@0um< zX&;4!7W5>HSW>(LwoN6>zrOwJ@Bf|$|FPB}K40U%uRnKPWcl^oN6ufj0lPB<^vkaw zDje-&|MlH7!PVZszWYD@l%N%?uSp42)5$hM%R871%hGwrmNpU>ZY|DPlDPMQp6Fe% z>hL$^%!i&_l1XEA#ixhhe4OG7vAL@!z3B~`<6iQ=STWKlCwtup`K&|@vEi9&K0got z|Es5-leLEUArsU8?vg$r&u?4%>q06{%_osnw*9`96{l2^$nT_n-?^Zt58Sm?{!#k% zNT%XTZ$up>>A(N?vEDL+k`(@Xi&%>t;199UG|Z-mhW~ypslg7RSf$>D$P3#ze!te% zhq09YitgzDd5HB!eQnwgLsKo4y^ad>|JI9%Dg3^-P-E1x2wjgH_^#yltJw}62_O9& z4iN;|xN-LP4;^Q6DGB{67X$kwS2*auuO$4|O!c7JJ$DhUCK5Hy{r8j7&L>jZcvdPy z{}>(A?hvc1_W8X}QziB=E@|E2SxK4D2z+Kh>y@_r_3Vet7L(LC3!~LkFN$b!kf_Ph zzhB^Z+miO1&&&0p`(sN#N(#ByK@#@gSHr=5jx8saKtM_MO!oXOL9QSgGO@+}CrN-0etjLqH?_IY3`UUT;dt7(+3Mfoey%SPce8%PC_(Hno z*RKv47K?5&_y72P;{&bbYsa;+g#%1!ufi37{r1Q69+O>h#b&oYCOFoK$1X`F3U>=S zD%Ae^EmKJ!zm|IZBt6P?XIn-0vlU^+9<5;^-TvR}Yt7{pJ()uh5nd`cRy=RgH+qgF zwBO`hl{bh{6A-<$mO_GLUJdV>gY55C}#7u_7mVa4cUQBBY7^{^&OguvC MnBLLcBi7gcAM~)4H&rqt;0Vw5D*W)yMv*z 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 BEj9oE literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/channels/broadcasts.coffee.erb b/app/assets/javascripts/channels/broadcasts.coffee.erb index 9765bc2..fddc672 100644 --- a/app/assets/javascripts/channels/broadcasts.coffee.erb +++ b/app/assets/javascripts/channels/broadcasts.coffee.erb @@ -24,7 +24,7 @@ $(document).on "turbolinks:load", -> stream_selected = $("#broadcast_video").data('videoType') == 'stream'; if data.streamer_status == 'recording' && data.status == 'active' && stream_selected $("#broadcast_video").html data.video_content - $("#live_take").html data.live_take_content + $("#recording_status").html data.recording_status_content new (Clappr.Player)( <%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %> @@ -37,7 +37,7 @@ $(document).on "turbolinks:load", -> hlsMinimumDvrSize: 1) if data.streamer_status == "idle" && data.status == "idle" $("#broadcast_video").html data.video_content - $("#live_take").html data.live_take_content + $("#recording_status").html data.recording_status_content showBroadcastRecordings: (data) -> $(".flash-message").html data.flash_content diff --git a/app/assets/javascripts/stream_player.js.erb b/app/assets/javascripts/stream_player.js.erb index af1aee9..b525d33 100644 --- a/app/assets/javascripts/stream_player.js.erb +++ b/app/assets/javascripts/stream_player.js.erb @@ -1,4 +1,7 @@ $(document).on("click", "[data-behavior=play_recording]", function() { + clearPlayingHighlight(); + $(this).parent().parent().addClass('playing-highlight'); + $("#broadcast_video").data('videoType', 'recording'); var playback_url = $(this).attr("data-playback-url") @@ -14,4 +17,11 @@ $(document).on("click", "[data-behavior=play_recording]", function() { }); }); -$(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").data('videoType', 'stream'); }); \ No newline at end of file +$(document).on("click", "[data-behavior=play_stream]", function() { +// clearPlayingHighlight(); + $("#broadcast_video").data('videoType', 'stream'); +}); + +function clearPlayingHighlight() { + $(".playing-highlight").removeClass("playing-highlight"); +} \ No newline at end of file diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 23289e9..5dc9303 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -467,4 +467,31 @@ trix-toolbar { .trix-button--icon-underline::before { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z'/%3E%3C/svg%3E"); } -} \ No newline at end of file +} + +// Play button SVG +.play-btn { + width: 60%; + height: auto; +} + +.play-btn-svg{ + transition: 0.3s; + stroke:#fedfc2; + opacity: 0; +} + +.play-btn:hover .play-btn-svg { + fill-opacity: 0; + opacity: 1; +} + +// Play button in video thumbnail preview +.play-thumbnail { position: relative; } +.play-thumbnail img { display: block; } +.play-thumbnail .play-btn { position: absolute; bottom:5px; left:10px; } + +// Active recording highlight +.playing-highlight { + background-color: scale-color($primary, $lightness: 80%); +} diff --git a/app/channels/broadcasts_channel.rb b/app/channels/broadcasts_channel.rb index 5109d93..918dfe3 100644 --- a/app/channels/broadcasts_channel.rb +++ b/app/channels/broadcasts_channel.rb @@ -11,7 +11,7 @@ class BroadcastsChannel < ApplicationCable::Channel def self.broadcast_stream_updates(broadcast) status_content = ApplicationController.render partial: "broadcasts/broadcast_status", locals: { broadcast: broadcast } video_content = ApplicationController.render partial: "broadcasts/video", locals: { broadcast: broadcast } - live_take = ApplicationController.render partial: "broadcasts/live_take", locals: { broadcast: broadcast } + recording_status_content = ApplicationController.render partial: "broadcasts/recording_status", locals: { broadcast: broadcast } broadcast_to broadcast, { event: :broadcast_stream_update, @@ -19,7 +19,7 @@ class BroadcastsChannel < ApplicationCable::Channel playback_url: broadcast.stream_playback_url, full_live_stream_playback_url: broadcast.full_live_stream_playback_url, video_content: video_content, - live_take_content: live_take, + recording_status_content: recording_status_content, status_content: status_content, streamer_status: broadcast.streamer_status } diff --git a/app/controllers/account_sessions_controller.rb b/app/controllers/account_sessions_controller.rb index dc9b4ca..3e83657 100644 --- a/app/controllers/account_sessions_controller.rb +++ b/app/controllers/account_sessions_controller.rb @@ -1,4 +1,5 @@ class AccountSessionsController < ApplicationController + skip_before_action :redirect_locked_accounts def update authorize :account_session, :update? session[:active_account] = account_session_params[:account_id] diff --git a/app/controllers/admin/account_locks_controller.rb b/app/controllers/admin/account_locks_controller.rb new file mode 100644 index 0000000..21aa3bd --- /dev/null +++ b/app/controllers/admin/account_locks_controller.rb @@ -0,0 +1,31 @@ +class Admin::AccountLocksController < Admin::ApplicationController + before_action :set_account + + def create + authorize :account_lock, :create? + @account.update(locked: true) + redirect_to admin_accounts_path, notice: 'Account locked' + end + + def destroy + authorize :account_lock, :destroy? + @account.update(locked: false) + redirect_to admin_accounts_path, notice: 'Account unlocked' + end + + private + + def set_account + if params[:account_id].present? + @account = Account.find_by(slug: params[:account_id]) + else + failure_redirect + end + rescue ActiveRecord::RecordNotFound + failure_redirect + end + + def failure_redirect + redirect_to admin_accounts_path, alert: 'Failed to find the account' + end +end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6f6b302..ef1dce4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -13,6 +13,7 @@ class ApplicationController < ActionController::Base include SetCurrentRequestDetails before_action :redirect_accountless + before_action :redirect_locked_accounts private @@ -29,6 +30,12 @@ class ApplicationController < ActionController::Base end end + def redirect_locked_accounts + if Current.user && !Current.user.admin? && Current.account.present? && Current.account.locked? + redirect_to locked_account_path + end + end + def signed_in_as_admin? signed_in? && current_user.admin? end diff --git a/app/controllers/locked_accounts_controller.rb b/app/controllers/locked_accounts_controller.rb new file mode 100644 index 0000000..90a0618 --- /dev/null +++ b/app/controllers/locked_accounts_controller.rb @@ -0,0 +1,10 @@ +class LockedAccountsController < ApplicationController + skip_before_action :redirect_locked_accounts + skip_after_action :verify_policy_scoped + + def index + unless Current.account.locked? + redirect_to projects_path + end + end +end diff --git a/app/helpers/dropzone_helper.rb b/app/helpers/dropzone_helper.rb index 321bac3..0d1aa66 100644 --- a/app/helpers/dropzone_helper.rb +++ b/app/helpers/dropzone_helper.rb @@ -40,4 +40,13 @@ module DropzoneHelper { name: file_info.filename, size: file_info.byte_size, type: file_info.content_type } end.to_json end + + def dropzone_file_size_limit_for(releasable) + case releasable.model_name.param_key + when "material_release", "acquired_media_release" + 1000000 + else + 256 + end + end end diff --git a/app/javascript/packs/active_storage_dropzone.js b/app/javascript/packs/active_storage_dropzone.js index 74b7fbe..e57e99f 100644 --- a/app/javascript/packs/active_storage_dropzone.js +++ b/app/javascript/packs/active_storage_dropzone.js @@ -12,6 +12,7 @@ class ActiveStorageDropzone { var acceptedFiles = $(element).data("accepted-files") || "image/*"; var dictDefaultMessage = $(element).data("placeholder") || "Drop files here"; var submitButton = $($(element).data("submit-button")); + var maxFileSize = $(element).data("max-file-size"); var that = this; this.myDropzone = new this.DropzoneClass(element, { @@ -20,6 +21,7 @@ class ActiveStorageDropzone { acceptedFiles: acceptedFiles, parallelUploads: 30, dictDefaultMessage: dictDefaultMessage, + maxFilesize: maxFileSize, init: function () { this.on("sending", (file, xhr, formData) => { diff --git a/app/jobs/match_appearance_releases_job.rb b/app/jobs/match_appearance_releases_job.rb index 5136170..66c7ee0 100644 --- a/app/jobs/match_appearance_releases_job.rb +++ b/app/jobs/match_appearance_releases_job.rb @@ -15,6 +15,7 @@ class MatchAppearanceReleasesJob < ApplicationJob matches = response.matches || [] key_signed_id_hash = Hash[filtered_attachments_object[:keys].zip(filtered_attachments_object[:signed_ids])] handle_matches matches, project, key_signed_id_hash + handle_unmatches matches, project, key_signed_id_hash matching_request.destroy end @@ -40,6 +41,21 @@ class MatchAppearanceReleasesJob < ApplicationJob end end + def handle_unmatches(matches, project, key_signed_id_hash) + matched_keys = matches.flat_map { |match| match.contracts + match.headshots } + unmatches = key_signed_id_hash.find_all { |key, _| !key.in?(matched_keys) } + + unmatches.each do |key, signed_id| + blob = ActiveStorage::Blob.find_signed signed_id + + if blob.image? + create_release(project, nil, signed_id, nil) + else + create_release(project, signed_id, nil, nil) + end + end + end + def create_release(project, contract, headshot, identifier) random_contract_no = AppearanceRelease.random_contract_number.to_s is_incomplete = contract.nil? || headshot.nil? diff --git a/app/policies/account_lock_policy.rb b/app/policies/account_lock_policy.rb new file mode 100644 index 0000000..f14f1f6 --- /dev/null +++ b/app/policies/account_lock_policy.rb @@ -0,0 +1,9 @@ +class AccountLockPolicy < ApplicationPolicy + def create? + user.admin? + end + + def destroy? + user.admin? + end +end diff --git a/app/views/accounts/_form.html.erb b/app/views/accounts/_form.html.erb index b95def2..d696b97 100644 --- a/app/views/accounts/_form.html.erb +++ b/app/views/accounts/_form.html.erb @@ -6,7 +6,7 @@ <%= form.email_field :email, class: "form-group" %> <%= form.password_field :password %> <%= form.text_field :account_name, label: 'Account Name' %> - <%= form.select :interested_product_name, options_for_select(["I'm interested in all products", "DirectME", "ReleaseME", "CastME", "EditME", "DeliverME", "ExpenseME"]), { label: "What product are you most interested in?" }, { class: "form-control custom-select" } %> + <%= form.select :interested_product_name, options_for_select(["I'm interested in all products", "ME Suite PRO", "DirectME", "ReleaseME", "CastME", "EditME", "DeliverME", "ExpenseME"]), { label: "What product are you most interested in?" }, { class: "form-control custom-select" } %>
<%= form.submit "Start Free Trial", class: "btn btn-block btn-danger font-weight-bold" %>
diff --git a/app/views/accounts/new.html.erb b/app/views/accounts/new.html.erb index 31eea98..cbeca0e 100644 --- a/app/views/accounts/new.html.erb +++ b/app/views/accounts/new.html.erb @@ -4,6 +4,9 @@

Welcome To <%= suite_wordmark("d-inline-block") %>

Sign up for a 14 Day Free Trial which includes full access to the following products. No credit card required!

+
+
<%= image_tag "ME_PRO_black.png", width: "96.66%" %>
+
<%= image_tag "logo_directme.png", width: "90%" %>
<%= image_tag "logo_releaseme.png", width: "90%" %>
diff --git a/app/views/acquired_media_releases/index.html.erb b/app/views/acquired_media_releases/index.html.erb index edd521c..9218015 100644 --- a/app/views/acquired_media_releases/index.html.erb +++ b/app/views/acquired_media_releases/index.html.erb @@ -1,16 +1,19 @@
+ />
<% if policy(AcquiredMediaRelease).new? %> - <%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :acquired_media_release], class: "btn btn-primary mr-2 mb-2" %> +
+ <%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :acquired_media_release], class: "btn btn-primary mr-2 mb-2" %> +
<% end %> <% if @acquired_media_releases.any? && policy(AcquiredMediaRelease).tag_multiple? %> <%= button_to_bulk_tagging(@project) %> <% end %> - + <% if @acquired_media_releases.any? && policy(AcquiredMediaRelease).download_multiple? %> - <%= link_to "Download All", [@project, :contract_downloads, release_type: @acquired_media_releases.name], method: :post, remote: true, class: "btn btn-light border ml-auto mr-2 mb-2", data: { + <%= button_to "Download", [@project, :contract_downloads, release_type: @acquired_media_releases.name], id: "download_releases", method: :post, remote: true, class: "btn btn-light border mr-2 mb-2", data: { disable_with: "Please wait..." } %> <% end %> diff --git a/app/views/acquired_media_releases/index.js.erb b/app/views/acquired_media_releases/index.js.erb index 4bc7e72..4ffebf9 100644 --- a/app/views/acquired_media_releases/index.js.erb +++ b/app/views/acquired_media_releases/index.js.erb @@ -1,3 +1,5 @@ $("#acquired_media_releases").html("<%= j render(@acquired_media_releases) %>"); $("form input[type='search']").val("<%= params[:query] %>"); $("#acquired_media_releases_pagination").html("<%= j will_paginate(@acquired_media_releases) %>"); +$("#selected_releases_form").attr('data-releasable-ids', JSON.stringify([])); +$("#total_entries").val(<%= @acquired_media_releases.total_entries %>); \ No newline at end of file diff --git a/app/views/admin/accounts/_account.html.erb b/app/views/admin/accounts/_account.html.erb index e418727..bc761b7 100644 --- a/app/views/admin/accounts/_account.html.erb +++ b/app/views/admin/accounts/_account.html.erb @@ -30,6 +30,11 @@ <%= link_to fa_icon("arrow-right", text: "Overview"), admin_account_path(account), class: "dropdown-item" %> <%= link_to fa_icon("pencil", text: "Edit"), edit_admin_account_path(account), class: "dropdown-item" %> <%= link_to fa_icon("arrow-right", text: "Account Managers"), account_auths_path({ account_id: account.id}), class: "dropdown-item" %> + <% if account.locked? %> + <%= link_to fa_icon("unlock", text: "Unlock Account"), [:admin, account, :lock], method: :delete, class: "dropdown-item" %> + <% else %> + <%= link_to fa_icon("lock", text: "Lock Account"), [:admin, account, :lock], method: :post, class: "dropdown-item" %> + <% end %>
diff --git a/app/views/broadcasts/_broadcast_recordings.html.erb b/app/views/broadcasts/_broadcast_recordings.html.erb index e764e6e..e4e6ec5 100644 --- a/app/views/broadcasts/_broadcast_recordings.html.erb +++ b/app/views/broadcasts/_broadcast_recordings.html.erb @@ -1,29 +1,31 @@ -<% if recordings.present? %> -
- <% recordings.each do |recording| %> -
-
- <% if policy(BroadcastRecording).update? %> - <%= link_to fa_icon("#{recording.starred ? 'star' : 'star-o'} fw"), [broadcast.project, broadcast, recording, :broadcast_recording_starrings], method: :post, class: "text-warning mr-3", remote: true %> - <% end %> - <%= image_tag(recording.thumbnail_url, class: 'img-thumbnail img-fluid max-w-75', data: { behavior: "play_recording", playback_url: recording.playback_url, id: dom_id(recording) }) %> -
- <% if policy(BroadcastRecording).edit? %> - <%= link_to fa_icon('edit'), [:edit, broadcast.project, broadcast, recording], remote: true %> - <% end %> - <%= link_to(fa_icon('download'), recording.download_url, target: "_blank") %> -
-
-
-
<%= recording.name %>
-

<%= recording.description %>

-
+
    + <% recordings.each do |recording| %> +
  • + <% if policy(BroadcastRecording).update? %> + <%= link_to fa_icon("#{recording.starred ? 'star' : 'star-o'} fw"), [broadcast.project, broadcast, recording, :broadcast_recording_starrings], method: :post, class: "text-warning mr-2", remote: true %> + <% end %> + +
    + <%= image_tag(recording.thumbnail_url, class: 'mr-2', size: "64x64") %> + <%= content_tag :div, class: "play-btn", data: { behavior: "play_recording", playback_url: recording.playback_url, id: dom_id(recording) } do %> + <%= render "broadcasts/play_button_svg" %> + <% end %>
    - <% end %> -
-
- <%= will_paginate(recordings, params: {controller: "broadcasts", action: "show", project_id: broadcast.project_id, id: broadcast.id, page: params[:page], active_tab: 'recordings'}) %> -
-<% else %> -

Recording of the live stream will appear here.

-<% end %> + +
+
<%= recording.name %>
+ <%= recording.description %> +
+ + <% if policy(BroadcastRecording).edit? %> + <%= link_to fa_icon('edit'), [:edit, broadcast.project, broadcast, recording], class: "mr-3", remote: true %> + <% end %> + + <%= link_to(fa_icon('download'), recording.download_url, target: "_blank") %> + + <% end %> + + +
+ <%= will_paginate(recordings, params: {controller: "broadcasts", action: "show", project_id: broadcast.project_id, id: broadcast.id, page: params[:page], active_tab: 'recordings'}) %> +
diff --git a/app/views/broadcasts/_broadcast_status.html.erb b/app/views/broadcasts/_broadcast_status.html.erb index 9e34bfa..20f60f1 100644 --- a/app/views/broadcasts/_broadcast_status.html.erb +++ b/app/views/broadcasts/_broadcast_status.html.erb @@ -1,13 +1,9 @@ <% if broadcast.streamer_connected? || (broadcast.streamer_recording? && !broadcast.active?) %>

Live stream has connected successfully and will be available soon.

-
Connected
<% elsif broadcast.streamer_recording? && broadcast.active? %>

Live stream has begun, click play to watch it.

-
Live
<% elsif broadcast.streamer_disconnected? %>

Live stream got disconnected.

-
Disconnected
<% elsif (broadcast.idle? && broadcast.streamer_idle?) || (broadcast.created? && broadcast.streamer_idle?) %>

Live stream is waiting to begin.

-
Idle
<% end %> diff --git a/app/views/broadcasts/_files_section.html.erb b/app/views/broadcasts/_files_section.html.erb index 86865c8..0790531 100644 --- a/app/views/broadcasts/_files_section.html.erb +++ b/app/views/broadcasts/_files_section.html.erb @@ -1,4 +1,4 @@ -
+
<% if controller.class.module_parent.to_s == "Public" %> <%= render partial: "public/broadcasts/file_form", locals: { model: [broadcast], token: broadcast.token } %> <% else %> diff --git a/app/views/broadcasts/_live_take.html.erb b/app/views/broadcasts/_live_take.html.erb index cb09912..1a795bf 100644 --- a/app/views/broadcasts/_live_take.html.erb +++ b/app/views/broadcasts/_live_take.html.erb @@ -1,12 +1,35 @@ -
-
-
-
<%= broadcast.name %>
- Created - <%= time_ago_in_words(broadcast.created_at) + " ago" %> -
-
+<% # TODO: Refactor this %> +<% if params[:director_mode] %> + <% if controller.class.module_parent.to_s == "Public" %> + <% live_take_url = url_for(params.permit!.merge(director_mode: true, token: broadcast.token)) %> + <% else %> + <% live_take_url = url_for(params.permit!.merge(director_mode: true, id: broadcast.id)) %> + <% end %> +
+<% else %> + <% if controller.class.module_parent.to_s == "Public" %> + <% live_take_url = url_for(params.permit!.merge(token: broadcast.token).except(:director_mode)) %> + <% else %> + <% live_take_url = url_for(params.permit!.merge(id: broadcast.id).except(:director_mode)) %> + <% end %> +<% end %> + +
+
+ <%= render 'broadcasts/recording_status', broadcast: broadcast %> +
+ +
+ <%= image_tag "live_icon.png", class: "mr-2", width: 64, alt: "Live stream thumbnail" %> + <%= link_to live_take_url, class: "play-btn", data: { behavior: "play_stream" } do %> + <%= render "broadcasts/play_button_svg" %> + <% end %> +
+ +
+
<%= broadcast.name %>
+ <%= render partial: 'broadcasts/broadcast_status', locals: { broadcast: broadcast } %> -
+
- diff --git a/app/views/broadcasts/_play_button_svg.html.erb b/app/views/broadcasts/_play_button_svg.html.erb new file mode 100644 index 0000000..6e9cce4 --- /dev/null +++ b/app/views/broadcasts/_play_button_svg.html.erb @@ -0,0 +1,3 @@ + + + diff --git a/app/views/broadcasts/_recording_status.html.erb b/app/views/broadcasts/_recording_status.html.erb new file mode 100644 index 0000000..4abe96c --- /dev/null +++ b/app/views/broadcasts/_recording_status.html.erb @@ -0,0 +1 @@ +<%= fa_icon "circle fw", class: class_string('mr-2', 'text-danger' => broadcast.streamer_recording? && broadcast.active?) %> diff --git a/app/views/broadcasts/show.html.erb b/app/views/broadcasts/show.html.erb index 8d79161..b987192 100644 --- a/app/views/broadcasts/show.html.erb +++ b/app/views/broadcasts/show.html.erb @@ -13,12 +13,18 @@ <% end %> <% end %> + + <% content_for :header do %>
<% end %>
-
+
<%= product_wordmark(:direct_me, class: 'navbar-brand text-white') %>
-
- <% unless controller.class.module_parent.to_s == "Public" %> - <% if @multi_view_broadcasts.present? %> - <% tokens = @multi_view_broadcasts.map(&:token) %> -
- - -