diff --git a/build b/build index 9b97f9176..6d408c180 100755 --- a/build +++ b/build @@ -66,7 +66,7 @@ DEB_SERVER=http://localhost:9010/apt-`uname -p` GEM_SERVER=http://localhost:9000/gems # if still going, then push all debs up - if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* ]]; then + if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* || "$GIT_BRANCH" == *release* ]]; then echo "" echo "PUSHING DB ARTIFACTS" @@ -129,7 +129,7 @@ GEM_SERVER=http://localhost:9000/gems popd > /dev/null else - echo "Skipping publish since branch is neither master or develop..." + echo "Skipping publish since branch is not master, develop, or release/*. branch is $GIT_BRANCH" fi fi diff --git a/ruby/lib/jam_ruby/lib/em_helper.rb b/ruby/lib/jam_ruby/lib/em_helper.rb index c310cf2bf..9e826b74c 100644 --- a/ruby/lib/jam_ruby/lib/em_helper.rb +++ b/ruby/lib/jam_ruby/lib/em_helper.rb @@ -65,7 +65,6 @@ module JamWebEventMachine end def self.run - current = Thread.current Thread.new do run_em(current) diff --git a/web/app/assets/javascripts/banner.js b/web/app/assets/javascripts/banner.js index a301f0b7a..7b11a3211 100644 --- a/web/app/assets/javascripts/banner.js +++ b/web/app/assets/javascripts/banner.js @@ -66,6 +66,7 @@ var me = { initialize: initialize, show: show, + showAlert: showAlert, hide: hide } diff --git a/web/app/assets/javascripts/createSession.js.erb b/web/app/assets/javascripts/createSession.js.erb index e5744cbfe..687527bbd 100644 --- a/web/app/assets/javascripts/createSession.js.erb +++ b/web/app/assets/javascripts/createSession.js.erb @@ -69,7 +69,7 @@ .prop('disabled', true) } - function validateForm() { + function validateForm() { //var errors = []; var isValid = true; var $form = $('#create-session-form'); diff --git a/web/app/assets/javascripts/gear_wizard.js b/web/app/assets/javascripts/gear_wizard.js index 634710d76..48ac0c668 100644 --- a/web/app/assets/javascripts/gear_wizard.js +++ b/web/app/assets/javascripts/gear_wizard.js @@ -6,18 +6,22 @@ context.JK = context.JK || {}; context.JK.GearWizard = function (app) { + var $dialog = null; var $wizardSteps = null; var $currentWizardStep = null; var step = 0; var $templateSteps = null; var $templateButtons = null; + var $templateAudioPort = null; var $ftueButtons = null; var self = null; var operatingSystem = null; // populated by loadDevices var deviceInformation = null; + var musicInputPorts = null; + var musicOutputPorts = null; // SELECT DEVICE STATE var validScore = false; @@ -33,28 +37,32 @@ var STEP_ROUTER_NETWORK = 5; var STEP_SUCCESS = 6; + var PROFILE_DEV_SEP_TOKEN = '^'; + + var iCheckIgnore = false; + var audioDeviceBehavior = { - MacOSX_builtin : { + MacOSX_builtin: { display: 'MacOSX Built-In', videoURL: undefined }, - MACOSX_interface : { + MACOSX_interface: { display: 'MacOSX external interface', videoURL: undefined }, - Win32_wdm : { + Win32_wdm: { display: 'Windows WDM', videoURL: undefined }, - Win32_asio : { + Win32_asio: { display: 'Windows ASIO', videoURL: undefined }, - Win32_asio4all : { + Win32_asio4all: { display: 'Windows ASIO4ALL', videoURL: undefined }, - Linux : { + Linux: { display: 'Linux', videoURL: undefined } @@ -63,7 +71,7 @@ function beforeShowIntro() { var $watchVideo = $currentWizardStep.find('.watch-video'); var videoUrl = 'https://www.youtube.com/watch?v=VexH4834o9I'; - if(operatingSystem == "Win32") { + if (operatingSystem == "Win32") { $watchVideo.attr('href', 'https://www.youtube.com/watch?v=VexH4834o9I'); } $watchVideo.attr('href', videoUrl); @@ -81,6 +89,9 @@ var $inputPorts = $currentWizardStep.find('.input-ports'); var $outputPorts = $currentWizardStep.find('.output-ports'); var $scoreReport = $currentWizardStep.find('.results'); + var $latencyScore = $scoreReport.find('.latency-score'); + var $ioRateScore = $scoreReport.find('.io-rate-score'); + var $ioVarScore = $scoreReport.find('.io-var-score'); var $nextButton = $ftueButtons.find('.btn-next'); // should return one of: @@ -91,24 +102,24 @@ // * Win32_asio4all // * Linux function determineDeviceType(deviceId, displayName) { - if(operatingSystem == "MacOSX") { - if(displayName.toLowerCase().trim() == "built-in") { + if (operatingSystem == "MacOSX") { + if (displayName.toLowerCase().trim() == "built-in") { return "MacOSX_builtin"; } else { return "MacOSX_interface"; } } - else if(operatingSystem == "Win32") { - if(context.jamClient.FTUEIsMusicDeviceWDM(deviceId)) { - return "Win32_wdm"; - } - else if(displayName.toLowerCase().indexOf("asio4all") > -1) { - return "Win32_asio4all" - } - else { - return "Win32_asio"; - } + else if (operatingSystem == "Win32") { + if (context.jamClient.FTUEIsMusicDeviceWDM(deviceId)) { + return "Win32_wdm"; + } + else if (displayName.toLowerCase().indexOf("asio4all") > -1) { + return "Win32_asio4all" + } + else { + return "Win32_asio"; + } } else { return "Linux"; @@ -122,25 +133,27 @@ var loadedDevices = {}; // augment these devices by determining their type - context._.each(devices, function(displayName, deviceId) { + context._.each(devices, function (displayName, deviceId) { var deviceInfo = {}; deviceInfo.id = deviceId; deviceInfo.type = determineDeviceType(deviceId, displayName); deviceInfo.displayType = audioDeviceBehavior[deviceInfo.type].display; - deviceInfo.displayName = deviceInfo.displayName; + deviceInfo.displayName = displayName; loadedDevices[deviceId] = deviceInfo; + + logger.debug("loaded device: ", deviceInfo); }) - deviceInformation = context._.keys(loadedDevices).sort(); + deviceInformation = loadedDevices; - logger.debug(context.JK.dlen(deviceInformation) + " devices loaded." , deviceInformation); + logger.debug(context.JK.dlen(deviceInformation) + " devices loaded.", deviceInformation); } - // returns a deviceInfo hash for the device matching the deviceId, or null. + // returns a deviceInfo hash for the device matching the deviceId, or undefined. function findDevice(deviceId) { - return {}; + return deviceInformation[deviceId]; } function selectedAudioInput() { @@ -164,22 +177,21 @@ } function initializeNextButtonState() { - console.log(context.jamClient.FTUEGetDevices(false)); - console.log("chat devices", jamClient.FTUEGetChatInputs()); $nextButton.removeClass('button-orange button-grey'); - if(validScore) $nextButton.addClass('button-orange'); + if (validScore) $nextButton.addClass('button-orange'); else $nextButton.addClass('button-grey'); } function initializeAudioInput() { var optionsHtml = ''; optionsHtml = ''; - context._.each(deviceInformation, function(deviceInfo, deviceId) { + context._.each(deviceInformation, function (deviceInfo, deviceId) { + + console.log(arguments) optionsHtml += ''; }); $audioInput.html(optionsHtml); - alert(optionsHtml) context.JK.dropdown($audioInput); initializeAudioInputChanged(); @@ -188,7 +200,7 @@ function initializeAudioOutput() { var optionsHtml = ''; optionsHtml = ''; - context._.each(deviceInformation, function(deviceInfo, deviceId) { + context._.each(deviceInformation, function (deviceInfo, deviceId) { optionsHtml += ''; }); $audioOutput.html(optionsHtml); @@ -198,11 +210,146 @@ } function initializeFramesize() { + context.JK.dropdown($frameSize); + } + function initializeBuffers() { + context.JK.dropdown($bufferIn); + context.JK.dropdown($bufferOut); + } + + // finds out if the $port argument is from a different port pair than what's currently selected + function isNewlySelectedPair($port) { + var portId = $port.attr('data-id'); + // get all inputs currently selected except this one + var $selectedInputs = $inputPorts.find('input[type="checkbox"]:checked').filter('[data-id="' + portId + '"]'); + + console.log("$selectedInputs", $selectedInputs); + var isNewlySelected = true; + context._.each($selectedInputs, function($current) { + var testPairInfo = $($current).data('pair'); + + context._.each(testPairInfo.ports, function(port) { + // if we can find the newly selected item in this pair, then it's not a different pair... + if(port.id == portId) { + isNewlySelected = false; + return false; // break loop + } + }); + + if(isNewlySelected) return false; // break loop + }); + + return isNewlySelected; + } + + // set checkbox state for all items in the pair + function setCheckedForAllInPair($portBox, pairInfo, checked, signalBackend) { + context._.each(pairInfo.ports, function(port) { + var portId = port.id; + var $input = $portBox.find('input[type="checkbox"][data-id="' + portId + '"]'); + if($input.is(':checked') != checked) { + if(checked) { + $input.iCheck('check').attr('checked', 'checked'); + //context.jamClient.FTUESetMusicInput2($input.id); + } + else { + $input.iCheck('uncheck').removeAttr('checked'); + //context.jamClient.FTUEUnsetMusicInput2($input.id); + } + } + }) + } + + function inputPortChanged() { + if(iCheckIgnore) return; + + var $checkbox = $(this); + var portId = $checkbox.data('data-id'); + var inputPortChecked = $checkbox.is(':checked'); + console.log('inputPortChecked: ' + inputPortChecked); + + if(inputPortChecked) { + if(isNewlySelectedPair($checkbox)) { + setCheckedForAllInPair($inputPorts, $checkbox.data('pair'), true, true); + } + else { + //context.jamClient.FTUESetMusicInput2($input.id); + } + } + else { + // context.jamClient.FTUEUnsetMusicInput2($input.id);; + } + } + + // should be called in a ifChanged callback if you want to cancel. bleh. + function cancelICheckChange($checkbox) { + iCheckIgnore = true; + var checked = $checkbox.is(':checked'); + setTimeout(function() { + if(checked) $checkbox.iCheck('uncheck').removeAttr('checked'); + else $checkbox.iCheck('check').attr('checked', 'checked'); + iCheckIgnore = false; + }, 1); + } + + function outputPortChanged() { + if(iCheckIgnore) return; + + var $checkbox = $(this); + var portId = $checkbox.data('data-id'); + var outputPortChecked = $checkbox.is(':checked'); + console.log('outputPortChecked: ' + outputPortChecked); + + if(outputPortChecked) { + var $selectedInputs = $outputPorts.find('input[type="checkbox"]:checked').filter('[data-id="' + portId + '"]'); + $selectedInputs.iCheck('uncheck').removeAttr('checked'); + var pairInfo = $checkbox.data('pair'); + setCheckedForAllInPair($outputPorts, pairInfo, true, false); + console.log("Setting music output"); + context.jamClient.FTUESetMusicOutput(pairInfo.ports.map(function(i) {return i.id}).join(PROFILE_DEV_SEP_TOKEN)); + } + else { + context.JK.Banner.showAlert('You must have at least one output pair selected.'); + // can't allow uncheck of last output + cancelICheckChange($checkbox); + } + } + + function initializeInputPorts(inputPorts) { + context._.each(inputPorts, function(inputPairs) { + // there is no guarantee that a pair has two items. + context._.each(inputPairs.ports, function(inputInPair) { + var inputPort = $(context._.template($templateAudioPort.html(), inputInPair, { variable: 'data' })); + var $checkbox = inputPort.find('input'); + $checkbox.data('pair', inputPairs); // so when it's selected, we can see what other ports, if any, are in the same pair + context.JK.checkbox($checkbox); + $checkbox.on('ifChanged', inputPortChanged); + $inputPorts.append(inputPort); + }); + }); + } + + function initializeOutputPorts(outputPorts) { + var first = true; + context._.each(outputPorts, function(outputPairs) { + context._.each(outputPairs.ports, function(outputInPair) { + var outputPort = $(context._.template($templateAudioPort.html(), outputInPair, { variable: 'data' })); + var $checkbox = outputPort.find('input'); + $checkbox.data('pair', outputPairs); // so when it's selected, we can see what other ports, if any, are in the same pair + context.JK.checkbox($checkbox); + $checkbox.on('ifChanged', outputPortChanged); + $outputPorts.append(outputPort); + }); + if(first) { + first = false; + setCheckedForAllInPair($outputPorts, outputPairs, true, false); + } + }); } function initializeFormElements() { - if(!deviceInformation) throw "devices are not initialized"; + if (!deviceInformation) throw "devices are not initialized"; initializeAudioInput(); initializeAudioOutput(); @@ -225,7 +372,9 @@ } function resetScoreReport() { - $scoreReport.empty(); + $ioRateScore.empty(); + $ioVarScore.empty(); + $latencyScore.empty(); } function updateScoreReport(latencyResult) { @@ -233,9 +382,9 @@ var latencyValue = 'N/A'; var validLatency = false; if (latencyResult && latencyResult.latencyknown) { - var latency = latencyResult.latency; + var latencyValue = latencyResult.latency; latencyValue = Math.round(latencyValue * 100) / 100; - if (latency.latency <= 10) { + if (latencyValue <= 10) { latencyClass = "good"; validLatency = true; } else if (latency.latency <= 20) { @@ -248,57 +397,9 @@ validScore = validLatency; // validScore may become based on IO variance too - $scoreReport.html(latencyValue); + $latencyScore.html(latencyValue + ' ms'); } - function loadAudioDrivers() { - var drivers = context.jamClient.FTUEGetDevices(false); - var chatDrivers = jamClient.FTUEGetChatInputs(); - var optionsHtml = ''; - var chatOptionsHtml = ''; - - - var driverOptionFunc = function (driverKey, index, list) { - if(!drivers[driverKey]) { - logger.debug("skipping unknown device:", driverKey) - } - else { - optionsHtml += ''; - } - }; - - var chatOptionFunc = function (driverKey, index, list) { - chatOptionsHtml += ''; - }; - - var selectors = [ - '[layout-wizard-step="0"] .settings-2-device select', - '[layout-wizard-step="2"] .settings-driver select' - ]; - - // handle standard devices - var sortedDeviceKeys = context._.keys(drivers).sort(); - context._.each(sortedDeviceKeys, driverOptionFunc); - $.each(selectors, function (index, selector) { - var $select = $(selector); - $select.empty(); - $select.html(optionsHtml); - context.JK.dropdown($select); - }); - - selectors = ['[layout-wizard-step="0"] .settings-2-voice select']; - var sortedVoiceDeviceKeys = context._.keys(chatDrivers).sort(); - - // handle voice inputs - context._.each(sortedVoiceDeviceKeys, chatOptionFunc); - $.each(selectors, function (index, selector) { - var $select = $(selector); - $select.empty(); - $select.html(chatOptionsHtml); - context.JK.dropdown($select); - }); - - } function audioInputDeviceUnselected() { validScore = false; initializeNextButtonState(); @@ -362,16 +463,16 @@ } function initializeWatchVideo() { - $watchVideoInput.unbind('click').click(function() { + $watchVideoInput.unbind('click').click(function () { var audioDevice = findDevice(selectedAudioInput()); - if(!audioDevice) { + if (!audioDevice) { context.JK.Banner.showAlert('You must first choose an Audio Input Device so that we can determine which video to show you.'); } else { var videoURL = audioDeviceBehavior[audioDevice.type].videoURL; - if(videoURL) { + if (videoURL) { $(this).attr('href', videoURL); return true; } @@ -383,16 +484,16 @@ return false; }); - $watchVideoOutput.unbind('click').click(function() { + $watchVideoOutput.unbind('click').click(function () { var audioDevice = findDevice(selectedAudioOutput()); - if(!audioDevice) { + if (!audioDevice) { throw "this button should be hidden"; } else { var videoURL = audioDeviceBehavior[audioDevice.type].videoURL; - if(videoURL) { + if (videoURL) { $(this).attr('href', videoURL); return true; } @@ -406,35 +507,52 @@ } function initializeAudioInputChanged() { - $audioInput.unbind('change').change(function(evt) { + $audioInput.unbind('change').change(function (evt) { - var audioDeviceId = selectedAudioInput(); - if(!audioDeviceId) { - audioInputDeviceUnselected(); - return false; - } + var audioDeviceId = selectedAudioInput(); + if (!audioDeviceId) { + audioInputDeviceUnselected(); + return false; + } - var audioDevice = findDevice(selectedAudioInput()); - if(!audioDevice) { - context.JK.alertSupportedNeeded('Unable to find device information for: ' + audioDeviceId); - return false; - } + var audioDevice = findDevice(selectedAudioInput()); + if (!audioDevice) { + context.JK.alertSupportedNeeded('Unable to find device information for: ' + audioDeviceId); + return false; + } - renderScoringStarted(); - jamClient.FTUESetMusicDevice(audioDeviceId); - jamClient.FTUESetInputLatency(selectedAudioInput()); - jamClient.FTUESetOutputLatency(selectedAudioOutput()); - jamClient.FTUESetFrameSize(selectedFramesize()); - logger.debug("Calling FTUESave(false)"); - jamClient.FTUESave(false); + renderScoringStarted(); - var latency = jamClient.FTUEGetExpectedLatency(); - console.log("FTUEGetExpectedLatency: %o", latency); + jamClient.FTUESetMusicDevice(audioDeviceId); - renderScoringStopped(); - }); + // enumerate input and output ports + musicInputPorts = jamClient.FTUEGetMusicInputs2(); + console.log(JSON.stringify(musicInputPorts)); + // [{"inputs":[{"id":"i~5~Built-in Microph~0~0","name":"Built-in Microph - Left"},{"id":"i~5~Built-in Microph~1~0","name":"Built-in Microph - Right"}]}] + musicOutputPorts = jamClient.FTUEGetMusicOutputs2(); + console.log(JSON.stringify(musicOutputPorts)); + // [{"outputs":[{"id":"o~5~Built-in Output~0~0","name":"Built-in Output - Left"},{"id":"o~5~Built-in Output~1~0","name":"Built-in Output - Right"}]}] + + + initializeInputPorts(musicInputPorts); + initializeOutputPorts(musicOutputPorts); + + + jamClient.FTUESetInputLatency(selectedAudioInput()); + jamClient.FTUESetOutputLatency(selectedAudioOutput()); + jamClient.FTUESetFrameSize(selectedFramesize()); + + logger.debug("Calling FTUESave(false)"); + jamClient.FTUESave(false); + + var latency = jamClient.FTUEGetExpectedLatency(); + console.log("FTUEGetExpectedLatency: %o", latency); + + updateScoreReport(latency); + renderScoringStopped(); + }); } function initializeAudioOutputChanged() { @@ -498,7 +616,9 @@ function beforeShowStep($step) { var stepInfo = STEPS[step]; - if(!stepInfo) {throw "unknown step: " + step;} + if (!stepInfo) { + throw "unknown step: " + step; + } stepInfo.beforeShow.call(self); } @@ -511,7 +631,7 @@ $currentWizardStep = $nextWizardStep; var $ftueSteps = $(context._.template($templateSteps.html(), {}, { variable: 'data' })); - var $activeStep = $ftueSteps.find('.ftue-stepnumber[data-step-number="'+ step +'"]'); + var $activeStep = $ftueSteps.find('.ftue-stepnumber[data-step-number="' + step + '"]'); $activeStep.addClass('.active'); $activeStep.next().show(); // show the .ftue-step-title $currentWizardStep.find('.ftuesteps').replaceWith($ftueSteps); @@ -528,11 +648,11 @@ var $btnCancel = $ftueButtonsContent.find('.btn-cancel'); // hide back button if 1st step or last step - if(step == 0 && step == TOTAL_STEPS - 1) { + if (step == 0 && step == TOTAL_STEPS - 1) { $btnBack.hide(); } // hide next button if not on last step - if (step == TOTAL_STEPS - 1 ) { + if (step == TOTAL_STEPS - 1) { $btnNext.hide(); } // hide close if on last step @@ -559,7 +679,7 @@ function beforeShow(args) { step = args.d1; - if(!step) step = 0; + if (!step) step = 0; step = parseInt(step); moveToStep(); } @@ -573,14 +693,14 @@ } function back() { - if($(this).is('.button-grey')) return; + if ($(this).is('.button-grey')) return; step = step - 1; moveToStep(); return false; } function next() { - if($(this).is('.button-grey')) return; + if ($(this).is('.button-grey')) return; step = step + 1; @@ -599,6 +719,7 @@ function route() { } + function initialize() { var dialogBindings = { beforeShow: beforeShow, afterShow: afterShow, afterHide: afterHide }; @@ -609,6 +730,7 @@ $wizardSteps = $dialog.find('.wizard-step'); $templateSteps = $('#template-ftuesteps'); $templateButtons = $('#template-ftue-buttons'); + $templateAudioPort = $('#template-audio-port'); $ftueButtons = $dialog.find('.ftue-buttons'); operatingSystem = context.jamClient.GetOSAsString(); diff --git a/web/app/assets/stylesheets/client/gearWizard.css.scss b/web/app/assets/stylesheets/client/gearWizard.css.scss index 49dc7f34b..f2c635714 100644 --- a/web/app/assets/stylesheets/client/gearWizard.css.scss +++ b/web/app/assets/stylesheets/client/gearWizard.css.scss @@ -184,8 +184,30 @@ width:45%; } + + .buffers { + .easydropdown-wrapper:nth-of-type(1) { + left:5px; + } + .easydropdown-wrapper:nth-of-type(2) { + left:35px; + } + .easydropdown, .easydropdown-wrapper { + width:15px; + } + } + + + .ftue-box.results { height: 230px !important; + padding:0; + + .scoring-section { + font-size:15px; + @include border_box_sizing; + height:64px; + } } .audio-output { @@ -510,8 +532,8 @@ .subcolumn.third { right:0px; } - } + .settings-controls { clear:both; diff --git a/web/app/assets/stylesheets/client/jamkazam.css.scss b/web/app/assets/stylesheets/client/jamkazam.css.scss index e7ec359f0..92d551f31 100644 --- a/web/app/assets/stylesheets/client/jamkazam.css.scss +++ b/web/app/assets/stylesheets/client/jamkazam.css.scss @@ -558,4 +558,9 @@ hr { width:100%; height:20px; text-align:center; +} + +body.jam .icheckbox_minimal { + display:inline-block; + position:relative; } \ No newline at end of file diff --git a/web/app/views/clients/gear/_gear_wizard.html.haml b/web/app/views/clients/gear/_gear_wizard.html.haml index 0ce16062d..fbeffefbd 100644 --- a/web/app/views/clients/gear/_gear_wizard.html.haml +++ b/web/app/views/clients/gear/_gear_wizard.html.haml @@ -83,6 +83,15 @@ .wizard-step-column %h2 Test Results .ftue-box.results + .left.w50.gold-fill.center.white.scoring-section + .p5 + .latency LATENCY + %span.latency-score + .left.w50.green-fill.center.white.scoring-section + .p5 + .io I/O + %span.io-rate-score + %span.io-var-score .clearall @@ -195,5 +204,11 @@ %a.button-orange.btn-next{href:'#'} NEXT %a.button-orange.btn-close{href:'#', 'layout-action' => 'close'} CLOSE +%script{type: 'text/template', id: 'template-audio-port'} + .audio-port + %input{ type: 'checkbox', 'data-id' => '{{data.id}}' } + %span + = '{{data.name}}' + diff --git a/web/app/views/layouts/client.html.erb b/web/app/views/layouts/client.html.erb index 7797d1dd5..2565a4ec7 100644 --- a/web/app/views/layouts/client.html.erb +++ b/web/app/views/layouts/client.html.erb @@ -7,12 +7,14 @@ <%= stylesheet_link_tag "client/client", media: "all" %> diff --git a/web/app/views/layouts/corporate.html.erb b/web/app/views/layouts/corporate.html.erb index 0b973c562..b852f8341 100644 --- a/web/app/views/layouts/corporate.html.erb +++ b/web/app/views/layouts/corporate.html.erb @@ -4,12 +4,14 @@ <%= full_title(yield(:title)) %> diff --git a/web/app/views/layouts/landing.erb b/web/app/views/layouts/landing.erb index 54c6ef95a..d88d06461 100644 --- a/web/app/views/layouts/landing.erb +++ b/web/app/views/layouts/landing.erb @@ -8,12 +8,14 @@ <%= stylesheet_link_tag "landing/landing", media: "all" %> diff --git a/web/app/views/layouts/minimal.html.erb b/web/app/views/layouts/minimal.html.erb index f3cc26096..f29412ae4 100644 --- a/web/app/views/layouts/minimal.html.erb +++ b/web/app/views/layouts/minimal.html.erb @@ -8,12 +8,14 @@ <%= stylesheet_link_tag "minimal/minimal", media: "all" %> diff --git a/web/app/views/layouts/web.html.erb b/web/app/views/layouts/web.html.erb index 532ee9b06..2515ae9da 100644 --- a/web/app/views/layouts/web.html.erb +++ b/web/app/views/layouts/web.html.erb @@ -8,12 +8,14 @@ <%= stylesheet_link_tag "web/web", media: "all" %>