19 changed files with 871 additions and 276 deletions
@ -1,128 +0,0 @@ |
|||
<template> |
|||
<div> |
|||
<div |
|||
class="row no-gutters w-100 bg-primary text-white flex-fill d-flex border border-top-0 border-left-0 border-right-0 border-bottom-1" |
|||
> |
|||
<div class="col-12"> |
|||
<div :class="content_wrapper_class_ob"> |
|||
<div class="row no-gutters"> |
|||
<div :class="title_wrapper_class_ob"> |
|||
<h3 class="font-weight-bold"> |
|||
<hamburger-toggle></hamburger-toggle> |
|||
<router-link v-if="net_main_label_target" :to="net_main_label_target" class="text-white"> |
|||
{{ main_label }} |
|||
</router-link> |
|||
<span v-if="!net_main_label_target"> |
|||
{{ main_label }} |
|||
</span> |
|||
</h3> |
|||
</div> |
|||
<div v-if="show_mode_toggles" :class="toggles_wrapper_class_ob"> |
|||
<mode-toggles></mode-toggles> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
module.exports = { |
|||
props: [], |
|||
|
|||
components: { |
|||
"hamburger-toggle": require("../../../su_client_js/components/side_navigation/HamburgerToggle.vue").default, |
|||
"mode-toggles": require("./ModeToggles.vue").default, |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: { |
|||
show_mode_toggles: function () { |
|||
if (this.$store.getters.in_mobile_mode && this.$store.getters.is_hamburger_expanded) return false |
|||
|
|||
if (this.$route.name == "user_settings") return false |
|||
// if (this.$route.params.username) if (!this.$route.params.nested_user_panel) return true |
|||
|
|||
if (this.$route.name == "su_project-user") |
|||
if (this.$route.params["specifier"] == "settings") |
|||
return false |
|||
|
|||
if (this.$route.name == "su_project-user") return true |
|||
if (this.$route.name == "su_project-user_list_item") return true |
|||
|
|||
return false |
|||
}, |
|||
|
|||
main_label: function () { |
|||
if (this.$store.getters.is_hamburger_expanded) return "Score Clock" |
|||
|
|||
if (this.$route.path == "/login") return "Login" |
|||
|
|||
if (this.$route.params["username"]) return this.$route.params["username"] |
|||
|
|||
var _route_cs = this.$route.params["context_slug"] |
|||
|
|||
if (_route_cs) { |
|||
var _username = this.$store.getters.status_text_value(_route_cs, "user", "username", _route_cs) |
|||
if (_username) return _username |
|||
} |
|||
|
|||
return "Score Clock" |
|||
}, |
|||
|
|||
net_main_label_target: function () { |
|||
if (!this.main_label_target) return null |
|||
if (this.main_label_target == this.$route.path) return null |
|||
|
|||
return this.main_label_target |
|||
}, |
|||
|
|||
main_label_target: function () { |
|||
if (this.$store.getters.is_hamburger_expanded) return null |
|||
|
|||
if (this.$route.path == "/login") return null |
|||
|
|||
if (this.$route.params["username"]) return "/u/" + this.$route.params["username"] |
|||
|
|||
var _route_cs = this.$route.params["context_slug"] |
|||
|
|||
if (_route_cs) { |
|||
var _username = this.$store.getters.status_text_value(_route_cs, "user", "username", _route_cs) |
|||
if (_username) return "/u/" + _username |
|||
} |
|||
|
|||
return null |
|||
}, |
|||
|
|||
content_wrapper_class_ob: function () { |
|||
var _use_fluid = this.$store.getters.is_hamburger_expanded || this.$store.getters.in_mobile_mode |
|||
|
|||
var _ob = {} |
|||
_ob["container-fluid"] = _use_fluid |
|||
_ob["container"] = !_use_fluid |
|||
_ob["pl-0"] = this.$store.getters.center_hamburger_icon_with_side_navigation |
|||
return _ob |
|||
}, |
|||
|
|||
title_wrapper_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["col-6 py-3 my-auto"] = true |
|||
return _ob |
|||
}, |
|||
|
|||
toggles_wrapper_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["col-6 py-3 text-right my-auto"] = true |
|||
return _ob |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -1,133 +0,0 @@ |
|||
<template> |
|||
<span> |
|||
<i v-if="updating_user_data" class="fa-lg fa-fw fas fa-sync fa-spin ml-2"></i> |
|||
<i v-if="show_upgrade" :class="upgrade_icon_class_ob" title="New Version Available" @click="handle_upgrade_click"></i> |
|||
<i v-if="show_filter" :class="filtering_icon_class_ob" title="Filters" @click="handle_filter_click"></i> |
|||
<i v-if="!in_focus_mode" :class="planning_icon_class_ob" title="Planning Mode" @click="toggle_app_mode('planning')"></i> |
|||
<i v-if="!in_focus_mode" :class="doing_mode_icon_class_ob" title="Doing Mode" @click="toggle_app_mode('doing')"></i> |
|||
<i |
|||
v-if="!in_focus_mode" |
|||
:class="reviewing_mode_icon_class_ob" |
|||
title="Reviewing Mode" |
|||
@click="toggle_app_mode('reviewing')" |
|||
></i> |
|||
</span> |
|||
</template> |
|||
|
|||
<script> |
|||
module.exports = { |
|||
props: [], |
|||
|
|||
components: {}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: { |
|||
handle_upgrade_click: function () { |
|||
location.reload() |
|||
}, |
|||
|
|||
handle_filter_click: function () { |
|||
if (this.$store.getters.current_search_term) this.$store.dispatch("clear_text_filter_results", {}) |
|||
|
|||
if (this.$store.getters.current_privacy_level_visibility_int < 100) |
|||
this.$store.commit("update_current_privacy_level_visibility_int", 100) |
|||
|
|||
this.toggle_app_mode("filtering") |
|||
}, |
|||
|
|||
toggle_app_mode: function (mode_key) { |
|||
this.$store.dispatch("toggle_app_mode", mode_key) |
|||
}, |
|||
}, |
|||
|
|||
computed: { |
|||
in_focus_mode: function () { |
|||
return false |
|||
}, |
|||
|
|||
updating_user_data: function () { |
|||
if (this.$store.getters.does_domain_include("steve")) return false |
|||
return this.$store.getters.currently_joining_logged_in_user_channel |
|||
}, |
|||
|
|||
show_upgrade: function () { |
|||
if (this.$store.getters.app_ui_preference("application_update_phase") == "complete") return true |
|||
|
|||
if (!this.latest_lists_web_version) return false |
|||
|
|||
if (this.latest_lists_web_version == this.current_assets_version) return false |
|||
|
|||
var _latest_splits = this.latest_lists_web_version.split(".") |
|||
var _current_splits = this.current_assets_version.split(".") |
|||
|
|||
// This is a little verbose, but there is a dev condition where the backend will skip recompiling mix.exs on build/deploy |
|||
// The front end (in dev) thinks it's got 0.(backend+1).0 and (rightly) detects a mismatch |
|||
// This evaluation style saves impatient me the steps of mix.clean on the backend to clear the dev mismatch version. |
|||
// This is a non-factor on prod because every build process runs mix.clean |
|||
if (Number(_latest_splits[0]) > Number(_current_splits[0])) return true |
|||
if (Number(_latest_splits[1]) > Number(_current_splits[1])) return true |
|||
if (Number(_latest_splits[2]) > Number(_current_splits[2])) return true |
|||
|
|||
return false |
|||
}, |
|||
|
|||
current_assets_version: function () { |
|||
return this.$store.getters.current_assets_version |
|||
}, |
|||
|
|||
latest_lists_web_version: function () { |
|||
return this.$store.getters.current_app_version("su_lists") |
|||
}, |
|||
|
|||
show_filter: function () { |
|||
if (this.updating_user_data) return false |
|||
if (this.show_upgrade) return false |
|||
return true |
|||
}, |
|||
|
|||
upgrade_icon_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["fa-fw fa-lg ml-4 clickable"] = true |
|||
_ob["fa fa-cloud-download-alt"] = true |
|||
return _ob |
|||
}, |
|||
|
|||
filtering_icon_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["fa-fw fa-lg ml-4 clickable"] = true |
|||
_ob[this.$store.getters.filtering_icon] = true |
|||
_ob["mostly-transparent"] = !this.$store.getters.in_app_mode("filtering") |
|||
return _ob |
|||
}, |
|||
|
|||
planning_icon_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["fa-fw fa-lg ml-4 clickable"] = true |
|||
_ob[this.$store.getters.planning_icon] = true |
|||
_ob["mostly-transparent"] = !this.$store.getters.in_app_mode("planning") |
|||
return _ob |
|||
}, |
|||
|
|||
doing_mode_icon_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["fa-fw fa-lg ml-4 clickable"] = true |
|||
_ob[this.$store.getters.doing_mode_icon] = true |
|||
_ob["mostly-transparent"] = !this.$store.getters.in_app_mode("doing") |
|||
return _ob |
|||
}, |
|||
|
|||
reviewing_mode_icon_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["fa-fw fa-lg ml-4 clickable"] = true |
|||
_ob[this.$store.getters.reviewing_mode_icon] = true |
|||
_ob["mostly-transparent"] = !this.$store.getters.in_app_mode("reviewing") |
|||
return _ob |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,29 @@ |
|||
<template> |
|||
<div> |
|||
<clock></clock> |
|||
<score></score> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
module.exports = { |
|||
props: [], |
|||
|
|||
components: { |
|||
clock: () => import("./clock/Clock.vue"), |
|||
score: () => import("./score/Score.vue"), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
created: function () {}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: {}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,80 @@ |
|||
<template> </template> |
|||
|
|||
<script> |
|||
module.exports = { |
|||
props: ["state_ob", "current_channel"], |
|||
|
|||
components: { |
|||
// 'kebab-case': () => import('./relative_path/CamelCase'), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: { |
|||
set_countdown_minutes: function (minutes) { |
|||
this.$store.getters.channel_by_key("score_clock").push("set_countdown", {minutes: minutes}) |
|||
}, |
|||
|
|||
handle_reverse_scores: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("reverse_scores", {}) |
|||
}, |
|||
|
|||
handle_fifteen_minute_countdown: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("set_countdown", {minutes: 15}) |
|||
}, |
|||
handle_three_minute_countdown: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("set_countdown", {minutes: 3}) |
|||
}, |
|||
handle_add_minute_countdown: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_countdown", {minutes: 1}) |
|||
}, |
|||
|
|||
handle_toggle_timer: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("toggle_timer_running_bool", {}) |
|||
}, |
|||
handle_disable_transition_timer: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("disable_transition_timer", {}) |
|||
}, |
|||
|
|||
handle_reset_score: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("reset_score", {}) |
|||
}, |
|||
|
|||
handle_left_plus_three: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_left: 3}) |
|||
}, |
|||
handle_left_plus_two: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_left: 2}) |
|||
}, |
|||
handle_left_plus_one: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_left: 1}) |
|||
}, |
|||
handle_left_minus_one: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_left: -1}) |
|||
}, |
|||
|
|||
handle_right_plus_three: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_right: 3}) |
|||
}, |
|||
handle_right_plus_two: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_right: 2}) |
|||
}, |
|||
handle_right_plus_one: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_right: 1}) |
|||
}, |
|||
handle_right_minus_one: function () { |
|||
this.$store.getters.channel_by_key("score_clock").push("adjust_score", {change_right: -1}) |
|||
}, |
|||
}, |
|||
|
|||
computed: { |
|||
in_focus_mode: function () { |
|||
return this.$store.getters.in_app_mode("in_focus_mode") |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,54 @@ |
|||
<template> |
|||
<div v-if="should_show"> |
|||
<focused-clock v-if="in_focus_mode"></focused-clock> |
|||
<controller-clock v-else></controller-clock> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const clock_mixin = require("./ClockMixin.vue").default |
|||
|
|||
module.exports = { |
|||
mixins: [clock_mixin], |
|||
|
|||
props: [], |
|||
|
|||
components: { |
|||
"controller-clock": () => import("./controller/ControllerClock.vue"), |
|||
"focused-clock": () => import("./focused/FocusedClock.vue"), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
watch: { |
|||
timer_count_seconds: function () { |
|||
this.conditionally_beep() |
|||
}, |
|||
global_audio_context: function (new_bool) { |
|||
this.guarantee_global_audio_context() |
|||
}, |
|||
}, |
|||
|
|||
created: function () { |
|||
this.guarantee_global_audio_context() |
|||
}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: { |
|||
should_show: function () { |
|||
if (this.$store.getters.in_app_mode("timed_games") === false) return false |
|||
|
|||
return true |
|||
}, |
|||
|
|||
in_focus_mode: function () { |
|||
return this.$store.getters.in_app_mode("in_focus_mode") |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,135 @@ |
|||
<template> </template> |
|||
|
|||
<script> |
|||
const server_commands_mixin = require("../ServerCommandsMixin.vue").default |
|||
|
|||
module.exports = { |
|||
mixins: [server_commands_mixin], |
|||
|
|||
props: [], |
|||
|
|||
components: {}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: { |
|||
guarantee_global_audio_context: function () { |
|||
if (!this.global_audio_context && this.play_beeps) |
|||
this.$store.dispatch("update_state_value", {code: "play_beeps", value: false}) |
|||
}, |
|||
|
|||
conditionally_beep: function () { |
|||
if (!this.play_beeps) return |
|||
|
|||
if (this.minutes_digit_1 > 0) return |
|||
if (this.minutes_digit_2 > 2) return |
|||
if (this.seconds_digit_1 != 0) return |
|||
if (this.seconds_digit_2 != 0) return |
|||
|
|||
if (this.minutes_digit_2 == 0) { |
|||
this.play_sound("/images/long_beep.mp3") |
|||
} else { |
|||
this.play_sound("/images/short_beep.mp3") |
|||
} |
|||
}, |
|||
}, |
|||
|
|||
computed: { |
|||
play_beeps: function () { |
|||
return false |
|||
}, |
|||
|
|||
clock_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["col-xs-12 col-lg-6"] = true |
|||
_ob["dimmed"] = !this.$store.getters.score_clock_state("timer_running_bool") |
|||
return _ob |
|||
}, |
|||
|
|||
show_transition_timer: function () { |
|||
//if (!this.$store.getters.state_value("show_transition_clock")) |
|||
// return false; |
|||
|
|||
if (this.$store.getters.score_clock_state("transition_timer_count_seconds") == null) return false |
|||
|
|||
return true |
|||
}, |
|||
|
|||
timer_count_seconds: function () { |
|||
return this.$store.getters.score_clock_state("timer_count_seconds") |
|||
}, |
|||
|
|||
minutes: function () { |
|||
return Math.floor(this.timer_count_seconds / 60) |
|||
}, |
|||
|
|||
seconds: function () { |
|||
return this.timer_count_seconds % 60 |
|||
}, |
|||
|
|||
in_last_minute: function () { |
|||
if (this.minutes > 0) return false |
|||
|
|||
if (this.seconds > 0) return true |
|||
|
|||
return false |
|||
}, |
|||
|
|||
minutes_digit_1: function () { |
|||
if (this.minutes < 10) return null |
|||
return Math.floor(this.minutes / 10) |
|||
}, |
|||
|
|||
minutes_digit_2: function () { |
|||
if (!this.minutes) return 0 |
|||
return Number(this.minutes % 10) |
|||
}, |
|||
|
|||
seconds_digit_1: function () { |
|||
if (this.seconds < 10) return 0 |
|||
return Math.floor(this.seconds / 10) |
|||
}, |
|||
|
|||
seconds_digit_2: function () { |
|||
if (!this.seconds) return 0 |
|||
return this.seconds % 10 |
|||
}, |
|||
|
|||
transition_timer_count_seconds: function () { |
|||
return this.$store.getters.score_clock_state("transition_timer_count_seconds") |
|||
}, |
|||
|
|||
transition_minutes: function () { |
|||
return Math.floor(this.transition_timer_count_seconds / 60) |
|||
}, |
|||
|
|||
transition_seconds: function () { |
|||
return this.transition_timer_count_seconds % 60 |
|||
}, |
|||
|
|||
transition_minutes_digit_1: function () { |
|||
if (this.transition_minutes < 10) return null |
|||
return Math.floor(this.transition_minutes / 10) |
|||
}, |
|||
|
|||
transition_minutes_digit_2: function () { |
|||
if (!this.transition_minutes) return 0 |
|||
return Number(this.transition_minutes % 10) |
|||
}, |
|||
|
|||
transition_seconds_digit_1: function () { |
|||
if (this.transition_seconds < 10) return 0 |
|||
return Math.floor(this.transition_seconds / 10) |
|||
}, |
|||
|
|||
transition_seconds_digit_2: function () { |
|||
if (!this.transition_seconds) return 0 |
|||
return this.transition_seconds % 10 |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,30 @@ |
|||
<template> |
|||
<div class="col-2"> |
|||
<img v-bind:src="'/images/score_clock/' + net_int + '.png'" width="100%" /> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
module.exports = { |
|||
props: ["number_int"], |
|||
|
|||
components: { |
|||
// 'kebab-case': () => import('./relative_path/CamelCase'), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: { |
|||
net_int: function () { |
|||
if (!this.number_int) return 0 |
|||
return this.number_int |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,97 @@ |
|||
<template> |
|||
<div class="container"> |
|||
<div class="row my-5"> |
|||
<div class="col-12"> |
|||
<div v-if="show_alt_countdowns" class="row"> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="set_countdown_minutes(20)"> |
|||
Set to 20:00 |
|||
</button> |
|||
</div> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="set_countdown_minutes(12)"> |
|||
Set to 12:00 |
|||
</button> |
|||
</div> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="set_countdown_minutes(10)"> |
|||
Set to 10:00 |
|||
</button> |
|||
</div> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="set_countdown_minutes(3)"> |
|||
Set to 3:00 |
|||
</button> |
|||
</div> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="set_countdown_minutes(2)"> |
|||
Set to 2:00 |
|||
</button> |
|||
</div> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="handle_add_minute_countdown"> |
|||
Add 1 minute |
|||
</button> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="set_countdown_minutes(15)"> |
|||
Set to 15:00 |
|||
</button> |
|||
</div> |
|||
|
|||
<div class="col-6"> |
|||
<button class="btn btn-square btn-block btn-secondary" v-on:click="toggle_other()"> |
|||
{{ other_button_label }} |
|||
</button> |
|||
</div> |
|||
</div> |
|||
|
|||
<focused-clock></focused-clock> |
|||
|
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_toggle_timer"> |
|||
Timer On/Off |
|||
</button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const clock_mixin = require("../ClockMixin.vue").default |
|||
|
|||
module.exports = { |
|||
mixins: [clock_mixin], |
|||
|
|||
props: [], |
|||
|
|||
components: { |
|||
"focused-clock": () => import("../focused/FocusedClock.vue"), |
|||
"clock-number-display": () => import("../ClockNumberDisplay.vue"), |
|||
}, |
|||
|
|||
data: function () { |
|||
return { |
|||
show_alt_countdowns: false, |
|||
} |
|||
}, |
|||
|
|||
methods: { |
|||
toggle_other: function () { |
|||
this.show_alt_countdowns = !this.show_alt_countdowns |
|||
}, |
|||
}, |
|||
|
|||
computed: { |
|||
other_button_label: function () { |
|||
if (this.show_alt_countdowns) return "Hide Other" |
|||
|
|||
return "Show Other" |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,101 @@ |
|||
<template> |
|||
<div class="row my-5"> |
|||
<div v-bind:class="countdown_timer_class_ob" v-on:click="handle_toggle_timer"> |
|||
<div class="row no-gutters" v-bind:class="clock_class_ob"> |
|||
<div class="col-1"></div> |
|||
<clock-number-display |
|||
v-if="minutes_digit_1 && !hide_for_last_minute" |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="minutes_digit_1" |
|||
></clock-number-display> |
|||
<div class="col-2" v-if="!minutes_digit_1"></div> |
|||
<clock-number-display |
|||
v-if="!hide_for_last_minute" |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="minutes_digit_2" |
|||
></clock-number-display> |
|||
<div v-if="!hide_for_last_minute" class="col-2"><img src="/images/score_clock/colon.png" width="100%" /></div> |
|||
<clock-number-display |
|||
v-if="!hide_for_last_minute" |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="seconds_digit_1" |
|||
></clock-number-display> |
|||
<clock-number-display |
|||
v-if="!hide_for_last_minute" |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="seconds_digit_2" |
|||
></clock-number-display> |
|||
<div class="col-1"></div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div v-if="show_transition_timer" class="col-6"> |
|||
<div class="row no-gutters" v-on:click="handle_disable_transition_timer"> |
|||
<div class="col-1"></div> |
|||
<clock-number-display |
|||
v-if="transition_minutes_digit_1" |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="transition_minutes_digit_1" |
|||
></clock-number-display> |
|||
<div class="col-2" v-if="!transition_minutes_digit_1"></div> |
|||
<clock-number-display |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="transition_minutes_digit_2" |
|||
></clock-number-display> |
|||
<div class="col-2"><img src="/images/score_clock/colon.png" width="100%" /></div> |
|||
<clock-number-display |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="transition_seconds_digit_1" |
|||
></clock-number-display> |
|||
<clock-number-display |
|||
v-bind:current_channel="current_channel" |
|||
v-bind:number_int="transition_seconds_digit_2" |
|||
></clock-number-display> |
|||
<div class="col-1"></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const clock_mixin = require("../ClockMixin.vue").default |
|||
module.exports = { |
|||
mixins: [clock_mixin], |
|||
|
|||
props: [], |
|||
|
|||
components: { |
|||
"clock-number-display": () => import("../ClockNumberDisplay.vue"), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: { |
|||
clock_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["dimmed"] = !this.$store.getters.score_clock_state("timer_running_bool") |
|||
return _ob |
|||
}, |
|||
|
|||
hide_for_last_minute: function () { |
|||
//if (!this.$store.getters.state_value("hide_last_minute")) |
|||
return false |
|||
|
|||
//return this.in_last_minute |
|||
}, |
|||
|
|||
countdown_timer_class_ob: function () { |
|||
var _ob = {} |
|||
_ob["col-12"] = !this.show_transition_timer |
|||
_ob["col-6"] = this.show_transition_timer |
|||
return _ob |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,6 @@ |
|||
[ |
|||
{ |
|||
"path": "/", |
|||
"component": () => import("./ScoreClockRoute") |
|||
} |
|||
] |
|||
@ -0,0 +1,154 @@ |
|||
<template> |
|||
<div class="my-5"> |
|||
<div v-if="in_focused_view" class="row" style="height: 150px;"></div> |
|||
|
|||
<div class="row no-gutters my-4"> |
|||
<div class="col-1"></div> |
|||
<score-number-display |
|||
v-if="score_left_digit_1" |
|||
v-bind:number_int="score_left_digit_1" |
|||
v-bind:on_click="'handle_left_plus_one'" |
|||
></score-number-display> |
|||
<score-number-display |
|||
v-bind:number_int="score_left_digit_2" |
|||
v-bind:on_click="'handle_left_plus_one'" |
|||
></score-number-display> |
|||
<div class="col-2" v-if="!score_left_digit_1"></div> |
|||
<div class="col-2"></div> |
|||
<score-number-display |
|||
v-if="score_right_digit_1" |
|||
v-bind:number_int="score_right_digit_1" |
|||
v-bind:on_click="'handle_right_plus_one'" |
|||
></score-number-display> |
|||
<div class="col-2" v-if="!score_right_digit_1"></div> |
|||
<score-number-display |
|||
v-bind:number_int="score_right_digit_2" |
|||
v-bind:on_click="'handle_right_plus_one'" |
|||
></score-number-display> |
|||
|
|||
<div class="col-1"></div> |
|||
</div> |
|||
|
|||
<div v-if="!in_focused_view" class="row my-4"> |
|||
<div class="col-1"></div> |
|||
<div class="col-4"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_left_plus_three">+ 3</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_left_plus_two">+ 2</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_left_plus_one">+ 1</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-danger" v-on:click="handle_left_minus_one">- 1</button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-2 my-auto"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_reverse_scores">FLIP SCORES</button> |
|||
</div> |
|||
<div class="col-4"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_right_plus_three">+ 3</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_right_plus_two">+ 2</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-primary" v-on:click="handle_right_plus_one">+ 1</button> |
|||
</div> |
|||
<div class="col-sm-12 col-lg-6 my-3"> |
|||
<button class="btn btn-square btn-block btn-danger" v-on:click="handle_right_minus_one">- 1</button> |
|||
</div> |
|||
|
|||
<div class="col-sm-12 col-lg-6"></div> |
|||
</div> |
|||
</div> |
|||
<div class="col-1"></div> |
|||
<div class="col-12 text-center my-3"> |
|||
Scroll down to find reset score button |
|||
</div> |
|||
</div> |
|||
|
|||
<div v-if="!in_focused_view" class="container margin-bottom-3x"> |
|||
<div class="row"> |
|||
<div class="col-12 margin-tb-1x"> |
|||
<hr /> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<div class="col-12" style="height: 300px;"></div> |
|||
<div class="col-12"> |
|||
<button class="btn btn-square btn-block btn-danger" v-on:click="handle_reset_score"> |
|||
Reset Score |
|||
</button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div v-if="in_focused_view" class="row" style="height: 500px;"> |
|||
<div class="col-12"></div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const server_commands_mixin = require("../ServerCommandsMixin.vue").default |
|||
|
|||
module.exports = { |
|||
mixins: [server_commands_mixin], |
|||
|
|||
props: [], |
|||
|
|||
components: { |
|||
"score-number-display": () => import("./ScoreNumberDisplay.vue"), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: {}, |
|||
|
|||
computed: { |
|||
in_focused_view: function() { |
|||
return this.$store.getters.in_app_mode("focused_view") |
|||
}, |
|||
|
|||
left_score: function () { |
|||
return this.$store.getters.score_clock_state("left_score") |
|||
}, |
|||
|
|||
right_score: function () { |
|||
return this.$store.getters.score_clock_state("right_score") |
|||
}, |
|||
|
|||
score_left_digit_1: function () { |
|||
if (this.left_score < 10) return null |
|||
return Math.floor(this.left_score / 10) |
|||
}, |
|||
|
|||
score_left_digit_2: function () { |
|||
if (!this.left_score) return 0 |
|||
return Number(this.left_score % 10) |
|||
}, |
|||
|
|||
score_right_digit_1: function () { |
|||
if (this.right_score < 10) return null |
|||
return Math.floor(this.right_score / 10) |
|||
}, |
|||
|
|||
score_right_digit_2: function () { |
|||
if (!this.right_score) return 0 |
|||
return this.right_score % 10 |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -0,0 +1,33 @@ |
|||
<template> |
|||
<div class="col-2"> |
|||
<img v-bind:src="'/images/score_clock/' + number_int + '.png'" width="100%" v-on:click="handle_click" /> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const server_commands_mixin = require("../ServerCommandsMixin.vue").default |
|||
|
|||
module.exports = { |
|||
mixins: [server_commands_mixin], |
|||
|
|||
props: ["number_int", "on_click"], |
|||
|
|||
components: { |
|||
// 'kebab-case': () => import('./relative_path/CamelCase'), |
|||
}, |
|||
|
|||
data: function () { |
|||
return {} |
|||
}, |
|||
|
|||
methods: { |
|||
handle_click: function () { |
|||
this[this.on_click]() |
|||
}, |
|||
}, |
|||
|
|||
computed: {}, |
|||
} |
|||
</script> |
|||
|
|||
<style></style> |
|||
@ -1,7 +1,11 @@ |
|||
import app_versions from "./app_versions/app_versions" |
|||
import header_icons from "./score_clock/header_icons" |
|||
import score_clock from "./score_clock/score_clock" |
|||
|
|||
let store_modules = { |
|||
app_versions |
|||
app_versions, |
|||
header_icons, |
|||
score_clock, |
|||
} |
|||
|
|||
export default store_modules |
|||
|
|||
@ -0,0 +1,46 @@ |
|||
const state = {} |
|||
|
|||
const getters = { |
|||
score_clock_app_header_icons_ar: (state, getters) => { |
|||
var _ar = [] |
|||
|
|||
_ar.push({toggle_app_mode: "timed_games", fa_icon: "fas fa-clock"}) |
|||
_ar.push({toggle_app_mode: "focused_view", fa_icon: "fas fa-expand"}) |
|||
|
|||
return _ar |
|||
}, |
|||
|
|||
show_lists_app_header_mode_toggles: (state, getters) => { |
|||
if (getters.in_mobile_mode && getters.is_hamburger_expanded) return false |
|||
|
|||
if (getters.current_route_name == "user_settings") return false |
|||
// if (this.$route.params.username) if (!this.$route.params.nested_user_panel) return true
|
|||
|
|||
if (getters.current_route_name == "su_project-user") |
|||
if (getters.current_route_params_value("specifier") == "settings") return false |
|||
|
|||
if (getters.current_route_name == "su_project-user") return true |
|||
if (getters.current_route_name == "su_project-user_list_item") return true |
|||
|
|||
return false |
|||
}, |
|||
} |
|||
|
|||
const actions = { |
|||
handle_lists_app_header_filters_toggle(store, ignored_param) { |
|||
if (store.getters.current_search_term) store.dispatch("clear_text_filter_results", {}) |
|||
|
|||
if (store.getters.current_privacy_level_visibility_int < 100) store.commit("update_current_privacy_level_visibility_int", 100) |
|||
|
|||
store.dispatch("toggle_app_mode", "filtering") |
|||
}, |
|||
} |
|||
|
|||
const mutations = {} |
|||
|
|||
export default { |
|||
state, |
|||
getters, |
|||
actions, |
|||
mutations, |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
// import { stateMerge } from "vue-object-merge"
|
|||
import * as types from "./score_clock_mutation_types" |
|||
|
|||
const state = { |
|||
score_clock_ob: { |
|||
left_score: 0, |
|||
right_score: 0, |
|||
timer_direction_int: -1, |
|||
timer_count_seconds: 15 * 60, |
|||
timer_running_bool: false, |
|||
transition_timer_count_seconds: null, |
|||
transition_timer_running_bool: false, |
|||
}, |
|||
} |
|||
|
|||
const getters = { |
|||
score_clock_state: (state) => { |
|||
return state.score_clock_ob |
|||
}, |
|||
|
|||
score_clock_state: (state) => (key) => { |
|||
if (state.score_clock_ob[key]) return state.score_clock_ob[key] |
|||
|
|||
return null |
|||
}, |
|||
} |
|||
|
|||
const actions = { |
|||
update_score_clock(store, score_clock_ob) { |
|||
store.commit(types.UPDATE_SCORE_CLOCK, score_clock_ob) |
|||
}, |
|||
} |
|||
|
|||
const mutations = { |
|||
[types.UPDATE_SCORE_CLOCK](state, server_ob) { |
|||
console.log(server_ob) |
|||
// stateMerge(state.score_clock_ob, server_ob)
|
|||
}, |
|||
} |
|||
|
|||
export default { |
|||
state, |
|||
getters, |
|||
actions, |
|||
mutations, |
|||
} |
|||
@ -0,0 +1 @@ |
|||
export const UPDATE_SCORE_CLOCK = "update_score_clock" |
|||
Loading…
Reference in new issue