Décompte du temps de parole

master
Florent Becker 2020-12-17 18:59:29 +01:00
parent 42a5629c42
commit 6bea1ee4a1
7 changed files with 86 additions and 75 deletions

View File

@ -26,6 +26,8 @@ console_error_panic_hook = { version = "0.1.6", optional = true }
# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. # Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now.
wee_alloc = { version = "0.4.5", optional = true } wee_alloc = { version = "0.4.5", optional = true }
js-sys = "0.3"
[dependencies.web-sys] [dependencies.web-sys]
version = "0.3" version = "0.3"
features = [ features = [

View File

@ -1,22 +1,6 @@
{ pkgs ? (import <nixpkgs> {}) }: { pkgs ? (import <nixpkgs> {}) }:
let
date = "2020-03-31";
in
let
rust-channel = pkgs.callPackage ./rust-channel.nix { inherit date; };
rustPlatform = pkgs.makeRustPlatform {
cargo = rust-channel.rust;
rustc = rust-channel.rust;
};
in
let
buildRustCrate = pkgs.buildRustCrate.override {
cargo = rust-channel.rust;
rustc = rust-channel.rust;};
in
pkgs.callPackage ./Cargo.nix { pkgs.callPackage ./Cargo.nix {
inherit buildRustCrate;
defaultCrateOverrides = pkgs.defaultCrateOverrides // { defaultCrateOverrides = pkgs.defaultCrateOverrides // {
lixiangyuan = attrs: { lixiangyuan = attrs: {
buildInputs = [ pkgs.wasm-pack ]; buildInputs = [ pkgs.wasm-pack ];

View File

@ -3,7 +3,7 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Kikikoz</title> <title>Kikikoz</title>
<script type="module"> <script type="module">
import {default as init, ajoute, ajoute_kp, next} from './pkg/kikikoz.js'; import {default as init, ajoute, ajoute_kp, next, intervalle_orateurice} from './pkg/kikikoz.js';
async function run() { async function run() {
await init() await init()
@ -13,13 +13,14 @@
window.ajoute = ajoute; window.ajoute = ajoute;
window.ajoute_kp = ajoute_kp; window.ajoute_kp = ajoute_kp;
window.next = next; window.next = next;
window.setInterval(intervalle_orateurice, 1000);
</script> </script>
<link rel="stylesheet" href="kikikoz.css"/> <link rel="stylesheet" href="kikikoz.css"/>
</head> </head>
<body> <body>
<h1>Kikikoz</h1> <h1>Kikikoz</h1>
<p class="prochain"> <p class="orateurice">
<span id="prochain" class="personne">Personne</span> <button onclick="next()">Hop!</button> <span id="orateurice" class="personne" onclick="intervalle_orateurice()">Personne</span> <span id="compte"></span> <button onclick="next()">Hop!</button>
</p> </p>
<section id="queues"> <section id="queues">

View File

@ -2,7 +2,7 @@ body {
background-color: aliceblue; background-color: aliceblue;
} }
p.prochain { p.orateurice {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;
} }

View File

@ -1,15 +0,0 @@
{ nixpkgs ? <nixpkgs> }:
with (import nixpkgs {});
let
mozillaOverlay = fetchFromGitHub {
owner = "mozilla";
repo = "nixpkgs-mozilla";
rev = "4521bc61c2332f41e18664812a808294c8c78580";
sha256 = "sha256:0lyzzfb6malnvnlvc2p5r895qxwp6p1h8vjvxbk0p8qk9cjl1j2p";
};
mozilla = callPackage "${mozillaOverlay.out}/package-set.nix" {};
in
mozilla.latest.rustChannels.stable

View File

@ -1,9 +1,10 @@
{ pkgs ? (import <nixpkgs> {}) }:
let let
date = "2020-06-01"; sources = import ./nix/sources.nix;
in nixpkgs-mozilla = import sources.nixpkgs-mozilla;
let pkgs = import sources.nixpkgs {
rust-channel = pkgs.callPackage ./rust-channel.nix { }; overlays = [ nixpkgs-mozilla ];
};
rust-channel = pkgs.latest.rustChannels.stable;
in in
pkgs.mkShell { pkgs.mkShell {
buildInputs = [ buildInputs = [
@ -17,9 +18,6 @@ pkgs.mkShell {
pkgs.pkg-config pkgs.pkg-config
pkgs.wasm-pack pkgs.wasm-pack
pkgs.cargo-generate pkgs.cargo-generate
pkgs.sqlitebrowser
pkgs.sqlite
pkgs.diesel-cli
pkgs.zlib pkgs.zlib
]; ];
} }

View File

@ -1,9 +1,9 @@
mod utils; mod utils;
use wasm_bindgen::prelude::*; use js_sys::Date;
use web_sys;
use wasm_bindgen::JsCast;
use rand::prelude::*; use rand::prelude::*;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global // When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator. // allocator.
@ -12,45 +12,80 @@ use rand::prelude::*;
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
#[wasm_bindgen] #[wasm_bindgen]
extern { extern "C" {
fn alert(s: &str); fn alert(s: &str);
} }
#[wasm_bindgen] #[wasm_bindgen]
pub fn next() { pub fn intervalle_orateurice() {
let window = web_sys::window().expect("no global `window` exists"); let document = le_document();
let document = window.document().expect("should have a document on window"); let now: f64 = Date::new_0().get_time();
let prochain = document.get_element_by_id("orateurice").expect("blu");
let compte = document.get_element_by_id("compte").expect("blaou");
match js_sys::Reflect::get(&prochain, &JsValue::from("debut")) {
Err(_) => return,
Ok(date_debut) => {
let date_debut = date_debut.as_f64().expect("tut tut");
let diff = ((now - date_debut) / 1000.0) as u64;
let sec = diff % 60;
let min = diff / 60;
compte.set_inner_html(&format!("{}:{:02}", min, sec));
}
}
}
let prochain = document.get_element_by_id("prochain").expect("blu"); fn le_document() -> web_sys::Document {
let queue_prio = document.get_elements_by_class_name("courante").item(0).expect("bla"); let window = web_sys::window().expect("no global `window` exists");
let queue_non_prio = document.get_elements_by_class_name("attente").item(0).expect("bla"); window.document().expect("should have a document on window")
}
#[wasm_bindgen]
pub fn next() {
let document = le_document();
let prochain = document.get_element_by_id("orateurice").expect("blu");
let queue_prio = document
.get_elements_by_class_name("courante")
.item(0)
.expect("bla");
let queue_non_prio = document
.get_elements_by_class_name("attente")
.item(0)
.expect("bla");
let lis_prio = queue_prio.get_elements_by_tag_name("li"); let lis_prio = queue_prio.get_elements_by_tag_name("li");
let queue = if lis_prio.length() == 0 { let queue = if lis_prio.length() == 0 {
&queue_non_prio &queue_non_prio
} else { } else {
&queue_prio &queue_prio
}; };
let lis = queue.get_elements_by_tag_name("li"); let lis = queue.get_elements_by_tag_name("li");
queue_prio.set_class_name("queue attente"); queue_prio.set_class_name("queue attente");
queue_non_prio.set_class_name("queue courante"); queue_non_prio.set_class_name("queue courante");
match lis.item(0) { match lis.item(0) {
Some(li) => { Some(li) => {
let nom_prochain = li.text_content().expect(""); let nom_prochain = li.text_content().expect("");
prochain.set_text_content(Some(nom_prochain.as_str())); let temps_debut = Date::new_0().get_time();
li.parent_element().expect("").remove_child(&li); prochain.set_text_content(Some(nom_prochain.as_str()));
prochain.set_class_name(""); js_sys::Reflect::set(
}, &prochain,
None => { &JsValue::from("debut"),
prochain.set_text_content(Some("Personne")); &JsValue::from(temps_debut),
prochain.set_class_name("personne"); );
} li.parent_element().expect("").remove_child(&li);
} prochain.set_class_name("");
}
None => {
prochain.set_text_content(Some("Personne"));
prochain.set_class_name("personne");
}
};
intervalle_orateurice();
} }
#[wasm_bindgen] #[wasm_bindgen]
pub fn ajoute_kp(ev: web_sys::KeyboardEvent, id: &str) { pub fn ajoute_kp(ev: web_sys::KeyboardEvent, id: &str) {
if ev.key_code() == 13 { if ev.key_code() == 13 {
ajoute(id) ajoute(id)
} }
} }
@ -61,23 +96,29 @@ pub fn ajoute(id: &str) {
let section = document.get_element_by_id(id).expect("bla"); let section = document.get_element_by_id(id).expect("bla");
let inputs = section.get_elements_by_tag_name("input"); let inputs = section.get_elements_by_tag_name("input");
let input = inputs.item(0).unwrap().dyn_into::<web_sys::HtmlInputElement>().unwrap(); let input = inputs
.item(0)
.unwrap()
.dyn_into::<web_sys::HtmlInputElement>()
.unwrap();
let content = input.value(); let content = input.value();
let ols = section.get_elements_by_tag_name("ol"); let ols = section.get_elements_by_tag_name("ol");
let ol = ols.item(0).unwrap().dyn_into::<web_sys::HtmlOListElement>().unwrap(); let ol = ols
.item(0)
.unwrap()
.dyn_into::<web_sys::HtmlOListElement>()
.unwrap();
let lis = ol.get_elements_by_tag_name("li"); let lis = ol.get_elements_by_tag_name("li");
let n = lis.length(); let n = lis.length();
let mut rng = thread_rng(); let mut rng = thread_rng();
let k = rng.gen_range(0, n+1); let k = rng.gen_range(0, n + 1);
let new_li = document.create_element("li").unwrap(); let new_li = document.create_element("li").unwrap();
new_li.set_inner_html(&content); new_li.set_inner_html(&content);
if k == n { if k == n {
ol.append_child(&new_li); ol.append_child(&new_li);
} else { } else {
let li = lis.item(k).unwrap(); let li = lis.item(k).unwrap();
li.after_with_node_1(&new_li); li.after_with_node_1(&new_li);
} }
} }