Compare commits

...

5 Commits

Author SHA1 Message Date
8193235691 New migration 2024-05-01 00:11:49 -04:00
73cccfa538 Updates 2024-05-01 00:10:54 -04:00
d579d5381c Updates 2024-04-30 17:41:30 -04:00
31a9dd94fc Few updates 2024-04-30 17:02:09 -04:00
82573d052c Change openNotes process 2024-04-30 13:29:26 -04:00
13 changed files with 359 additions and 57 deletions

View File

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240501000553 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__notes AS SELECT id, speaker_id, series_id, title, text, date, passage, refs FROM notes');
$this->addSql('DROP TABLE notes');
$this->addSql('CREATE TABLE notes (id VARCHAR(64) NOT NULL, speaker_id INTEGER NOT NULL, series_id INTEGER DEFAULT NULL, user_id INTEGER DEFAULT NULL, title VARCHAR(255) NOT NULL, text CLOB NOT NULL, date DATE NOT NULL, passage VARCHAR(255) DEFAULT NULL, refs CLOB DEFAULT NULL --(DC2Type:json)
, PRIMARY KEY(id), CONSTRAINT FK_11BA68CD04A0F27 FOREIGN KEY (speaker_id) REFERENCES speaker (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_11BA68C5278319C FOREIGN KEY (series_id) REFERENCES series (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_11BA68CA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO notes (id, speaker_id, series_id, title, text, date, passage, refs) SELECT id, speaker_id, series_id, title, text, date, passage, refs FROM __temp__notes');
$this->addSql('DROP TABLE __temp__notes');
$this->addSql('CREATE INDEX IDX_11BA68CD04A0F27 ON notes (speaker_id)');
$this->addSql('CREATE INDEX IDX_11BA68C5278319C ON notes (series_id)');
$this->addSql('CREATE INDEX IDX_11BA68CA76ED395 ON notes (user_id)');
$this->addSql('CREATE TEMPORARY TABLE __temp__reference AS SELECT id, type, name, label, ndx, content FROM reference');
$this->addSql('DROP TABLE reference');
$this->addSql('CREATE TABLE reference (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, type VARCHAR(64) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(10) NOT NULL, ndx INTEGER DEFAULT NULL, content CLOB NOT NULL)');
$this->addSql('INSERT INTO reference (id, type, name, label, ndx, content) SELECT id, type, name, label, ndx, content FROM __temp__reference');
$this->addSql('DROP TABLE __temp__reference');
$this->addSql('CREATE UNIQUE INDEX UNIQ_AEA34913EA750E8 ON reference (label)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__notes AS SELECT id, speaker_id, series_id, title, text, date, passage, refs FROM notes');
$this->addSql('DROP TABLE notes');
$this->addSql('CREATE TABLE notes (id VARCHAR(64) NOT NULL, speaker_id INTEGER NOT NULL, series_id INTEGER DEFAULT NULL, title VARCHAR(255) NOT NULL, text CLOB NOT NULL, date DATE NOT NULL, passage VARCHAR(255) DEFAULT NULL, refs CLOB DEFAULT NULL --(DC2Type:json)
, PRIMARY KEY(id), CONSTRAINT FK_11BA68CD04A0F27 FOREIGN KEY (speaker_id) REFERENCES speaker (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_11BA68C5278319C FOREIGN KEY (series_id) REFERENCES series (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO notes (id, speaker_id, series_id, title, text, date, passage, refs) SELECT id, speaker_id, series_id, title, text, date, passage, refs FROM __temp__notes');
$this->addSql('DROP TABLE __temp__notes');
$this->addSql('CREATE INDEX IDX_11BA68CD04A0F27 ON notes (speaker_id)');
$this->addSql('CREATE INDEX IDX_11BA68C5278319C ON notes (series_id)');
$this->addSql('ALTER TABLE reference ADD COLUMN id_list CLOB DEFAULT NULL');
}
}

View File

@ -58,14 +58,23 @@ ul.menu-open {
width: 60px;
}
/**/
.tab button {
display: flex;
justify-content: flex-start;
justify-content: center;
align-items: center;
height: 100px;
width: 100%;
cursor: pointer;
text-align: center;
background-color: #4CAF50;
color: #fff;
border: none;
border-radius: 3px;
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.8);
font-size: 14px;
}
.tab button:hover {
background-color: #3e8e41;
}
.ref-tab ul {
@ -115,6 +124,9 @@ ul.menu-open {
#show-hide-btn {
position: absolute;
}
.button {
top: 10px;
right: 20px;
font-size: 16px;
@ -134,22 +146,22 @@ ul.menu-open {
margin: 4px 2px;
transition: all 0.3s ease-out;
}
#show-hide-btn:hover {
.button:hover {
background-color: #3e8e41;
/* darker green */
}
#show-hide-btn::before {
.button::before {
font-size: 16px;
cursor: pointer;
}
#show-hide-btn::before {
.button::before {
font-size: 16px;
cursor: pointer;
transition: transform 0.5s ease-in-out;
}
#show-hide-btn:hover::before {
.button:hover::before {
transform: translateY(-10px);
}
@ -187,6 +199,25 @@ textarea#notes {
color: darkorange;
}
#note-list {
display: none;
}
#note-list ul {
margin: 0;
padding: 0;
list-style-type: none;
list-style: none;
}
.noteListLinks {
cursor: pointer;
text-decoration: none;
color: purple;
font-weight: bold;
font-size: 16px;
}
div#refQuery {
display: none;
position: absolute;
@ -205,4 +236,19 @@ div#refQuery #search {
width: 150px;
height: 25px;
cursor: pointer;
}
#passage-popup {
display: none;
position: absolute;
z-index: 100;
background-color: #fff;
color: black;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
width: 300px;
height: 300px;
overflow-x: scroll;
}/*# sourceMappingURL=style.css.map */

View File

@ -1 +1 @@
{"version":3,"sources":["style.scss","style.css"],"names":[],"mappings":"AAAA,kCAAA;AACA;EACI,SAAA;ACCJ;;ADEA;EACI,aAAA;EACA,mBAAA;EACA,eAAA;EACA,6BAAA;EACA,oBAAA;EACA,yBAAA;EACA,iBAAA;EACA,iCAAA;EACA,cAAA;ACCJ;;ADEA;EACI,YAAA;EACA,WAAA;ACCJ;;ADEA,6BAAA;AAEA;EACI,aAAA;EACA,8BAAA;EACA,mBAAA;EACA,wBAAA;EACA,uBAAA;EACA,eAAA;EACA,kBAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,wCAAA;ACAJ;;ADGA;EACI,YAAA;ACAJ;;ADGA;;EAEI,YAAA;ACAJ;;ADIA;EACI,yBAAA;EACA,yBAAA;EACA,aAAA;EACA,YAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;ACDJ;;ADIA;EACI,WAAA;ACDJ;;ADIA;EACI,aAAA;EACA,2BAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,eAAA;EACA,kBAAA;ACDJ;;ADIA;EACI,SAAA;EACA,UAAA;ACDJ;;ADIA;EACI,gBAAA;EACA,qBAAA;ACDJ;;ADIA;EACI,UAAA;ACDJ;;ADIA;EACI,kBAAA;EACA,WAAA;EACA,YAAA;EACA,uBAAA;EACA,kBAAA;EACA,wCAAA;ACDJ;;ADIA;EACI,YAAA;ACDJ;;ADIA;EACI,aAAA;EACA,YAAA;ACDJ;;ADIA;EACI,aAAA;EACA,YAAA;ACDJ;;ADIA;EACI,aAAA;ACDJ;;ADIA;EACI,aAAA;ACDJ;;ADIA;EACI,kBAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,eAAA;EACA,yBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,wCAAA;EACA,iBAAA;EACA,kBAAA;EACA,qBAAA;EACA,qBAAA;EACA,eAAA;EACA,eAAA;EAGA,6BAAA;ACDJ;ADGI;EACI,yBAAA;EACA,iBAAA;ACDR;ADII;EACI,eAAA;EACA,eAAA;ACFR;;ADMA;EACI,eAAA;EACA,eAAA;EACA,sCAAA;ACHJ;;ADMA;EACI,4BAAA;ACHJ;;ADMA;EACI,cAAA;ACHJ;;ADMA;EACI,UAAA;ACHJ;;ADMA;EACI,WAAA;EACA,YAAA;EACA,eAAA;ACHJ;;ADMA;EACI,aAAA;EACA,kBAAA;ACHJ;;ADMA;;EAEI,oBAAA;EACA,mBAAA;EACA,UAAA;ACHJ;;ADMA;EACI,sCAAA;ACHJ;;ADMA;EACI,iBAAA;ACHJ;;ADMA;EACI,aAAA;EACA,kBAAA;EACA,YAAA;EACA,oCAAA;ACHJ;;ADMA;EACI,YAAA;EACA,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,gBAAA;EACA,WAAA;EACA,yBAAA;EACA,YAAA;EACA,YAAA;EACA,eAAA;ACHJ","file":"style.css"}
{"version":3,"sources":["style.scss","style.css"],"names":[],"mappings":"AAAA,kCAAA;AACA;EACI,SAAA;ACCJ;;ADEA;EACI,aAAA;EACA,mBAAA;EACA,eAAA;EACA,6BAAA;EACA,oBAAA;EACA,yBAAA;EACA,iBAAA;EACA,iCAAA;EACA,cAAA;ACCJ;;ADEA;EACI,YAAA;EACA,WAAA;ACCJ;;ADEA,6BAAA;AAEA;EACI,aAAA;EACA,8BAAA;EACA,mBAAA;EACA,wBAAA;EACA,uBAAA;EACA,eAAA;EACA,kBAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,wCAAA;ACAJ;;ADGA;EACI,YAAA;ACAJ;;ADGA;;EAEI,YAAA;ACAJ;;ADIA;EACI,yBAAA;EACA,yBAAA;EACA,aAAA;EACA,YAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;ACDJ;;ADIA;EACI,WAAA;ACDJ;;ADIA,GAAA;AACA;EACI,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,wCAAA;EACA,eAAA;ACDJ;ADGI;EACI,yBAAA;ACDR;;ADKA;EACI,SAAA;EACA,UAAA;ACFJ;;ADKA;EACI,gBAAA;EACA,qBAAA;ACFJ;;ADKA;EACI,UAAA;ACFJ;;ADKA;EACI,kBAAA;EACA,WAAA;EACA,YAAA;EACA,uBAAA;EACA,kBAAA;EACA,wCAAA;ACFJ;;ADKA;EACI,YAAA;ACFJ;;ADKA;EACI,aAAA;EACA,YAAA;ACFJ;;ADKA;EACI,aAAA;EACA,YAAA;ACFJ;;ADKA;EACI,aAAA;ACFJ;;ADKA;EACI,aAAA;ACFJ;;ADKA;EACI,kBAAA;ACFJ;;ADKA;EACI,SAAA;EACA,WAAA;EACA,eAAA;EACA,eAAA;EACA,yBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,kBAAA;EACA,wCAAA;EACA,iBAAA;EACA,kBAAA;EACA,qBAAA;EACA,qBAAA;EACA,eAAA;EACA,eAAA;EAGA,6BAAA;ACFJ;ADII;EACI,yBAAA;EACA,iBAAA;ACFR;ADKI;EACI,eAAA;EACA,eAAA;ACHR;;ADOA;EACI,eAAA;EACA,eAAA;EACA,sCAAA;ACJJ;;ADOA;EACI,4BAAA;ACJJ;;ADOA;EACI,cAAA;ACJJ;;ADOA;EACI,UAAA;ACJJ;;ADOA;EACI,WAAA;EACA,YAAA;EACA,eAAA;ACJJ;;ADOA;EACI,aAAA;EACA,kBAAA;ACJJ;;ADOA;;EAEI,oBAAA;EACA,mBAAA;EACA,UAAA;ACJJ;;ADOA;EACI,sCAAA;ACJJ;;ADOA;EACI,iBAAA;ACJJ;;ADOA;EACI,aAAA;ACJJ;;ADOA;EACI,SAAA;EACA,UAAA;EACA,qBAAA;EACA,gBAAA;ACJJ;;ADOA;EACI,eAAA;EACA,qBAAA;EACA,aAAA;EACA,iBAAA;EACA,eAAA;ACJJ;;ADOA;EACI,aAAA;EACA,kBAAA;EACA,YAAA;EACA,oCAAA;ACJJ;;ADOA;EACI,YAAA;EACA,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,gBAAA;EACA,WAAA;EACA,yBAAA;EACA,YAAA;EACA,YAAA;EACA,eAAA;ACJJ;;ADOA;EACI,aAAA;EACA,kBAAA;EACA,YAAA;EACA,sBAAA;EACA,YAAA;EACA,aAAA;EACA,sBAAA;EACA,kBAAA;EACA,wCAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;ACJJ","file":"style.css"}

View File

@ -1 +1 @@
body{margin:0}.container{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-evenly;align-items:stretch;align-content:flex-start;max-width:1020px;margin:0 auto}.top-tab{height:50px;width:100%}.hamburger{display:flex;justify-content:space-between;align-items:center;margin:15px 0 15px 15px;border:#000 solid 1px;cursor:pointer;border-radius:5px;width:20px;height:20px;padding:5px;box-shadow:0 2px 5px rgba(0,0,0,.3)}.fa-check{color:green}.fa-bars:before,.fa-navicon:before{padding:3px}ul.menu-open{display:block !important;background-color:#f9c74d;padding:10px;z-index:100;list-style:none;list-style-type:none;position:fixed}.ref-tab{width:60px}.tab button{display:flex;justify-content:flex-start;align-items:center;height:100px;width:100%;cursor:pointer;text-align:center}.ref-tab ul{margin:0;padding:0}.ref-tab ul li{list-style:none;list-style-type:none}.ref{width:35%}.ref>div#ref{overflow-y:scroll;width:100%;height:100%;border:#000 solid 1px;border-radius:3px;box-shadow:0 2px 5px rgba(0,0,0,.3)}#passage{width:100px}#newSpeaker{display:none;width:110px}#newSeries{display:none;width:110px}#noteSearch{display:none}#fields-container{display:none}#show-hide-btn{position:absolute;top:10px;right:20px;font-size:16px;cursor:pointer;background-color:#4caf50;color:#fff;border:none;border-radius:5px;box-shadow:0 2px 5px rgba(0,0,0,.6);padding:5px 20px;text-align:center;text-decoration:none;display:inline-block;font-size:16px;margin:4px 2px;transition:all .3s ease-out}#show-hide-btn:hover{background-color:#3e8e41}#show-hide-btn::before{font-size:16px;cursor:pointer}#show-hide-btn::before{font-size:16px;cursor:pointer;transition:transform .5s ease-in-out}#show-hide-btn:hover::before{transform:translateY(-10px)}#fields-container.show{display:block}.notes{width:55%}textarea#notes{width:100%;height:100%;font-size:14pt}#notePreview{display:none;overflow-x:scroll}#note-header-left,#note-header-right{display:inline-flex;flex-direction:row;width:49%}#note-header-right{flex-direction:row-reverse !important}#note-header-left h2.dirty{color:#ff8c00}div#refQuery{display:none;position:absolute;z-index:100;background-color:rgba(0,0,0,.5)}div#refQuery #search{border:none;border-radius:5px;padding:10px 20px;font-size:16px;line-height:1.5;color:#333;background-color:#f4f4f4;width:150px;height:25px;cursor:pointer}/*# sourceMappingURL=style.min.css.map */
body{margin:0}.container{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-evenly;align-items:stretch;align-content:flex-start;max-width:1020px;margin:0 auto}.top-tab{height:50px;width:100%}.hamburger{display:flex;justify-content:space-between;align-items:center;margin:15px 0 15px 15px;border:#000 solid 1px;cursor:pointer;border-radius:5px;width:20px;height:20px;padding:5px;box-shadow:0 2px 5px rgba(0,0,0,.3)}.fa-check{color:green}.fa-bars:before,.fa-navicon:before{padding:3px}ul.menu-open{display:block !important;background-color:#f9c74d;padding:10px;z-index:100;list-style:none;list-style-type:none;position:fixed}.ref-tab{width:60px}.tab button{display:flex;justify-content:center;align-items:center;height:100px;width:100%;text-align:center;background-color:#4caf50;color:#fff;border:none;border-radius:3px;box-shadow:0 4px 5px rgba(0,0,0,.8);font-size:14px}.tab button:hover{background-color:#3e8e41}.ref-tab ul{margin:0;padding:0}.ref-tab ul li{list-style:none;list-style-type:none}.ref{width:35%}.ref>div#ref{overflow-y:scroll;width:100%;height:100%;border:#000 solid 1px;border-radius:3px;box-shadow:0 2px 5px rgba(0,0,0,.3)}#passage{width:100px}#newSpeaker{display:none;width:110px}#newSeries{display:none;width:110px}#noteSearch{display:none}#fields-container{display:none}#show-hide-btn{position:absolute}.button{top:10px;right:20px;font-size:16px;cursor:pointer;background-color:#4caf50;color:#fff;border:none;border-radius:5px;box-shadow:0 2px 5px rgba(0,0,0,.6);padding:5px 20px;text-align:center;text-decoration:none;display:inline-block;font-size:16px;margin:4px 2px;transition:all .3s ease-out}.button:hover{background-color:#3e8e41}.button::before{font-size:16px;cursor:pointer}.button::before{font-size:16px;cursor:pointer;transition:transform .5s ease-in-out}.button:hover::before{transform:translateY(-10px)}#fields-container.show{display:block}.notes{width:55%}textarea#notes{width:100%;height:100%;font-size:14pt}#notePreview{display:none;overflow-x:scroll}#note-header-left,#note-header-right{display:inline-flex;flex-direction:row;width:49%}#note-header-right{flex-direction:row-reverse !important}#note-header-left h2.dirty{color:#ff8c00}#note-list{display:none}#note-list ul{margin:0;padding:0;list-style-type:none;list-style:none}.noteListLinks{cursor:pointer;text-decoration:none;color:purple;font-weight:bold;font-size:16px}div#refQuery{display:none;position:absolute;z-index:100;background-color:rgba(0,0,0,.5)}div#refQuery #search{border:none;border-radius:5px;padding:10px 20px;font-size:16px;line-height:1.5;color:#333;background-color:#f4f4f4;width:150px;height:25px;cursor:pointer}#passage-popup{display:none;position:absolute;z-index:100;background-color:#fff;color:#000;padding:10px;border:1px solid #ccc;border-radius:5px;box-shadow:0 2px 5px rgba(0,0,0,.3);width:300px;height:300px;overflow-x:scroll}/*# sourceMappingURL=style.min.css.map */

View File

@ -1 +1 @@
{"version":3,"sources":["style.scss"],"names":[],"mappings":"AACA,KACI,QAAA,CAGJ,WACI,YAAA,CACA,kBAAA,CACA,cAAA,CACA,4BAAA,CACA,mBAAA,CACA,wBAAA,CACA,gBAAA,CAEA,aAAA,CAGJ,SACI,WAAA,CACA,UAAA,CAKJ,WACI,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,uBAAA,CACA,qBAAA,CACA,cAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,WAAA,CACA,mCAAA,CAGJ,UACI,WAAA,CAGJ,mCAEI,WAAA,CAIJ,aACI,wBAAA,CACA,wBAAA,CACA,YAAA,CACA,WAAA,CACA,eAAA,CACA,oBAAA,CACA,cAAA,CAGJ,SACI,UAAA,CAGJ,YACI,YAAA,CACA,0BAAA,CACA,kBAAA,CACA,YAAA,CACA,UAAA,CACA,cAAA,CACA,iBAAA,CAGJ,YACI,QAAA,CACA,SAAA,CAGJ,eACI,eAAA,CACA,oBAAA,CAGJ,KACI,SAAA,CAGJ,aACI,iBAAA,CACA,UAAA,CACA,WAAA,CACA,qBAAA,CACA,iBAAA,CACA,mCAAA,CAGJ,SACI,WAAA,CAGJ,YACI,YAAA,CACA,WAAA,CAGJ,WACI,YAAA,CACA,WAAA,CAGJ,YACI,YAAA,CAGJ,kBACI,YAAA,CAGJ,eACI,iBAAA,CACA,QAAA,CACA,UAAA,CACA,cAAA,CACA,cAAA,CACA,wBAAA,CAEA,UAAA,CAEA,WAAA,CACA,iBAAA,CACA,mCAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CACA,cAAA,CACA,cAAA,CAGA,2BAAA,CAEA,qBACI,wBAAA,CAIJ,uBACI,cAAA,CACA,cAAA,CAIR,uBACI,cAAA,CACA,cAAA,CACA,oCAAA,CAGJ,6BACI,2BAAA,CAGJ,uBACI,aAAA,CAGJ,OACI,SAAA,CAGJ,eACI,UAAA,CACA,WAAA,CACA,cAAA,CAGJ,aACI,YAAA,CACA,iBAAA,CAGJ,qCAEI,mBAAA,CACA,kBAAA,CACA,SAAA,CAGJ,mBACI,qCAAA,CAGJ,2BACI,aAAA,CAGJ,aACI,YAAA,CACA,iBAAA,CACA,WAAA,CACA,+BAAA,CAGJ,qBACI,WAAA,CACA,iBAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,wBAAA,CACA,WAAA,CACA,WAAA,CACA,cAAA","file":"style.min.css"}
{"version":3,"sources":["style.scss"],"names":[],"mappings":"AACA,KACI,QAAA,CAGJ,WACI,YAAA,CACA,kBAAA,CACA,cAAA,CACA,4BAAA,CACA,mBAAA,CACA,wBAAA,CACA,gBAAA,CAEA,aAAA,CAGJ,SACI,WAAA,CACA,UAAA,CAKJ,WACI,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,uBAAA,CACA,qBAAA,CACA,cAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,WAAA,CACA,mCAAA,CAGJ,UACI,WAAA,CAGJ,mCAEI,WAAA,CAIJ,aACI,wBAAA,CACA,wBAAA,CACA,YAAA,CACA,WAAA,CACA,eAAA,CACA,oBAAA,CACA,cAAA,CAGJ,SACI,UAAA,CAIJ,YACI,YAAA,CACA,sBAAA,CACA,kBAAA,CACA,YAAA,CACA,UAAA,CACA,iBAAA,CACA,wBAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,mCAAA,CACA,cAAA,CAEA,kBACI,wBAAA,CAIR,YACI,QAAA,CACA,SAAA,CAGJ,eACI,eAAA,CACA,oBAAA,CAGJ,KACI,SAAA,CAGJ,aACI,iBAAA,CACA,UAAA,CACA,WAAA,CACA,qBAAA,CACA,iBAAA,CACA,mCAAA,CAGJ,SACI,WAAA,CAGJ,YACI,YAAA,CACA,WAAA,CAGJ,WACI,YAAA,CACA,WAAA,CAGJ,YACI,YAAA,CAGJ,kBACI,YAAA,CAGJ,eACI,iBAAA,CAGJ,QACI,QAAA,CACA,UAAA,CACA,cAAA,CACA,cAAA,CACA,wBAAA,CAEA,UAAA,CAEA,WAAA,CACA,iBAAA,CACA,mCAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,oBAAA,CACA,cAAA,CACA,cAAA,CAGA,2BAAA,CAEA,cACI,wBAAA,CAIJ,gBACI,cAAA,CACA,cAAA,CAIR,gBACI,cAAA,CACA,cAAA,CACA,oCAAA,CAGJ,sBACI,2BAAA,CAGJ,uBACI,aAAA,CAGJ,OACI,SAAA,CAGJ,eACI,UAAA,CACA,WAAA,CACA,cAAA,CAGJ,aACI,YAAA,CACA,iBAAA,CAGJ,qCAEI,mBAAA,CACA,kBAAA,CACA,SAAA,CAGJ,mBACI,qCAAA,CAGJ,2BACI,aAAA,CAGJ,WACI,YAAA,CAGJ,cACI,QAAA,CACA,SAAA,CACA,oBAAA,CACA,eAAA,CAGJ,eACI,cAAA,CACA,oBAAA,CACA,YAAA,CACA,gBAAA,CACA,cAAA,CAGJ,aACI,YAAA,CACA,iBAAA,CACA,WAAA,CACA,+BAAA,CAGJ,qBACI,WAAA,CACA,iBAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,wBAAA,CACA,WAAA,CACA,WAAA,CACA,cAAA,CAGJ,eACI,YAAA,CACA,iBAAA,CACA,WAAA,CACA,qBAAA,CACA,UAAA,CACA,YAAA,CACA,qBAAA,CACA,iBAAA,CACA,mCAAA,CACA,WAAA,CACA,YAAA,CACA,iBAAA","file":"style.min.css"}

View File

@ -60,14 +60,24 @@ ul.menu-open {
width: 60px;
}
/**/
.tab button {
display: flex;
justify-content: flex-start;
justify-content: center;
align-items: center;
height: 100px;
width: 100%;
cursor: pointer;
text-align: center;
background-color: #4CAF50;
color: #fff;
border: none;
border-radius: 3px;
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.8);
font-size: 14px;
&:hover {
background-color: #3e8e41;
}
}
.ref-tab ul {
@ -117,6 +127,9 @@ ul.menu-open {
#show-hide-btn {
position: absolute;
}
.button {
top: 10px;
right: 20px;
font-size: 16px;
@ -149,13 +162,13 @@ ul.menu-open {
}
}
#show-hide-btn::before {
.button::before {
font-size: 16px;
cursor: pointer;
transition: transform 0.5s ease-in-out;
}
#show-hide-btn:hover::before {
.button:hover::before {
transform: translateY(-10px);
}
@ -193,6 +206,25 @@ textarea#notes {
color: darkorange;
}
#note-list {
display: none;
}
#note-list ul {
margin: 0;
padding: 0;
list-style-type: none;
list-style: none;
}
.noteListLinks {
cursor: pointer;
text-decoration: none;
color: purple;
font-weight: bold;
font-size: 16px;
}
div#refQuery {
display: none;
position: absolute;
@ -211,4 +243,19 @@ div#refQuery #search {
width: 150px;
height: 25px;
cursor: pointer;
}
#passage-popup {
display: none;
position: absolute;
z-index: 100;
background-color: #fff;
color: black;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
width: 300px;
height: 300px;
overflow-x: scroll;
}

View File

@ -1,6 +1,5 @@
// Get the link element
const link = document.querySelector('.hamburger');
var converter = null;
var md = null;
var references = {};
let saved = false;
@ -27,9 +26,6 @@ document.querySelector('#notes').addEventListener('keyup', function (event) {
});
function setHeight() {
converter = new showdown.Converter();
//converter.setFlavor();
md = new markdownit({
html: true,
linkify: true,
@ -48,6 +44,9 @@ function setHeight() {
ref = document.querySelector('.ref');
ref.style.height = (window.innerHeight - 125) + 'px';
noteList = document.querySelector('#note-list');
noteList.style.height = (window.innerHeight - 130) + 'px';
notes = document.querySelector('.notes');
notes.style.height = (window.innerHeight - 130) + 'px';
@ -58,6 +57,8 @@ function setHeight() {
dt = new Date();
date.value = dt.getFullYear() + '-' + ((dt.getMonth() < 9) ? '0' + (dt.getMonth() + 1) : (dt.getMonth() + 1)) + '-' + dt.getDate();
var user = getCookie('user');
document.querySelector('#user').value = user;
setTimeout(saveNote, saveTimeout);
}
@ -108,6 +109,7 @@ function saveNote(event) {
series: document.querySelector('#series').value,
passage: document.querySelector('#passage').value,
note: document.querySelector('#notes').value,
user: document.querySelector('#user').value,
refs: references
};
fetch('/index.php/save-note', {
@ -138,6 +140,7 @@ function validateNote() {
const title = document.querySelector('#noteTitle');
const id = document.querySelector('#noteId');
const psg = document.querySelector('#passage');
const user = document.querySelector('#user');
if (!isUuidV4Valid(id.value)) { return false; }
if (!title.value.length) { return false; }
@ -146,6 +149,7 @@ function validateNote() {
if (!parseInt(series.value)) { return false; }
if (!psg.value) { return false; }
if (!note.value.length) { return false; }
if (!user.value) { return false; }
return true;
}
@ -216,6 +220,9 @@ function newSpeaker() {
document.querySelector('#newSpeaker').style.display = 'block';
document.querySelector('#speaker').style.display = 'none';
}
saved = false;
textDirty = true;
}
function saveSpeaker(event) {
@ -251,6 +258,9 @@ function newSeries() {
document.querySelector('#newSeries').style.display = 'block';
document.querySelector('#series').style.display = 'none';
}
saved = false;
textDirty = true;
}
function saveSeries(event) {
@ -321,7 +331,7 @@ function queryRef() {
list.appendChild(newList);
const ref = document.querySelector('#ref');
ref.innerHTML = converter.makeHtml(results.text);
ref.innerHTML = md.render(results.text);
references[results.title] = results.text;
@ -342,7 +352,7 @@ function makeButton(title) {
var btn = document.createElement('button');
btn.innerText = title;
btn.addEventListener('click', function () {
document.querySelector('#ref').innerHTML = converter.makeHtml(references[title]);
document.querySelector('#ref').innerHTML = md.render(references[title]);
});
btn.addEventListener('dblclick', function () {
@ -542,29 +552,73 @@ function previewNote() {
function findLinks() {
var links = document.querySelector('#notePreview').querySelectorAll('a');
//alert(links.length);
}
function showSearchNote(event) {
event.preventDefault();
var searchNote = document.querySelector('#noteSearch');
if (searchNote.style.display == 'none') {
searchNote.style.display = 'block';
} else {
searchNote.style.display = 'none';
for (var i = 0; i < links.length; i++) {
links[i].addEventListener('mouseover', function (e) {
e.preventDefault();
var passage = this.href.split('/');
passage = passage[passage.length - 1];
fetch(this.href, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
'passage': passage
})
})
.then(response => response.text())
.then(result => {
showPassage(e, result + "<button onclick='closePopup()'>Close</button>");
});
});
}
}
function searchNote() {
const search = document.querySelector('#noteSearchQuery');
function showPassage(event, text) {
// Create a new div element for the popup
const popup = document.querySelector('#passage-popup');
popup.innerHTML = md.render(text);
fetch('/index.php/search-note', {
// Position the popup relative to the cursor
let x = event.clientX + window.pageXOffset;
let y = event.clientY + window.pageYOffset;
// Set the position of the popup element
popup.style.top = `${y}px`;
popup.style.left = `${x}px`;
popup.style.display = 'block';
}
function closePopup() {
const popup = document.querySelector('#passage-popup');
popup.innerHTML = '';
popup.style.display = 'none';
}
function openNote() {
const noteList = document.querySelector('#note-list');
const refs = document.querySelector('#ref');
if (noteList.style.display == 'block') {
noteList.style.display = 'none';
refs.style.display = 'block';
} else {
noteList.style.display = 'block';
refs.style.display = 'none';
link.click();
}
}
function retrieveNote(id) {
fetch('/index.php/get-note', {
method: 'POST',
header: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"search": search.value
'id': id
})
})
.then(response => response.json())
@ -577,9 +631,6 @@ function searchNote() {
document.querySelector('#noteDate').value = result.date;
document.querySelector('#noteId').value = result.id;
document.querySelector('#noteSearch').style.display = 'none';
link.click();
if (result.references) {
references = result.references;
}
@ -593,9 +644,36 @@ function searchNote() {
newList.appendChild(button);
list.appendChild(newList);
}
openNote();
});
}
function changeUser(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + value + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
}
/**
* Generates a random UUIDv4 string.
*

View File

@ -10,6 +10,7 @@ use App\Entity\Speaker;
use App\Entity\Template;
use App\Entity\Notes;
use App\Entity\Reference;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -233,6 +234,17 @@ class AjaxController extends AbstractController
return $res;
}
#[Route('/get-note', name: 'app_get_note')]
public function getNote(Request $req, EntityManagerInterface $emi): Response
{
$res = new Response();
$data = json_decode($req->getContent());
$note = $emi->getRepository(Notes::class)->find($data->id);
$res->setContent(json_encode($note));
return $res;
}
#[Route('/save-note', name: 'app_save_note', methods: ['POST'])]
public function saveNote(Request $req, EntityManagerInterface $emi): Response
{
@ -248,8 +260,10 @@ class AjaxController extends AbstractController
$series = $emi->getRepository(Series::class)->find($data->series);
$speaker = $emi->getRepository(Speaker::class)->find($data->speaker);
$user = $emi->getRepository(User::class)->find($data->user);
$note->setTitle($data->title)
$note->setUser($user)
->setTitle($data->title)
->setDate(new DateTime($data->date))
->setSeries($series)
->setSpeaker($speaker)

View File

@ -6,6 +6,7 @@ use App\Entity\Speaker;
use App\Entity\Template;
use App\Entity\Series;
use App\Entity\Notes;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -18,9 +19,18 @@ class DefaultController extends AbstractController
#[Route('/', name: 'app_default')]
public function index(EntityManagerInterface $emi): Response
{
$user = null;
if (isset($_COOKIE['user'])) {
$user = $emi->getRepository(User::class)->findBy(['email' => $_COOKIE['user']]);
if (is_array($user) && count($user) == 1) {
$user = $user[0];
}
}
$speakers = $emi->getRepository(Speaker::class)->findAll();
$series = $emi->getRepository(Series::class)->findAll();
$templates = $emi->getRepository(Template::class)->findAll();
$notes = $emi->getRepository(Notes::class)->findUserNotes($user);
$uuid = Uuid::v4();
return $this->render('default/index.html.twig', [
@ -28,6 +38,7 @@ class DefaultController extends AbstractController
'speakers' => $speakers,
'series' => $series,
'templates' => $templates,
'notes' => $notes,
'id' => $uuid,
]);
}

View File

@ -36,6 +36,9 @@ class Notes implements JsonSerializable
#[ORM\Column(type: Types::JSON, nullable: true)]
private ?array $refs = null;
#[ORM\ManyToOne(inversedBy: 'notes')]
private ?User $user = null;
/**
* Retrieves the ID of the object.
*
@ -154,6 +157,35 @@ class Notes implements JsonSerializable
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
public function toLink(): string
{
return "<a href='#' onclick=\"retrieveNote('{$this->id}')\">".
$this->title.
"</a>";
}
public function toTableRow(): string
{
return "<tr>".
"<td>{$this->toLink()}</td>".
"<td>{$this->speaker->getName()}</td>".
"<td>{$this->passage}</td>".
"<td>{$this->date->format('M j, Y')}</td>".
"</tr>";
}
public function jsonSerialize(): array
{
return [

View File

@ -3,6 +3,7 @@
namespace App\Repository;
use App\Entity\Notes;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@ -73,13 +74,16 @@ class NotesRepository extends ServiceEntityRepository
// ;
// }
// public function findOneBySomeField($value): ?Notes
// {
// return $this->createQueryBuilder('n')
// ->andWhere('n.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
public function findUserNotes(?User $value): ?array
{
if (!$value) {
return null;
}
return $this->createQueryBuilder('n')
->andWhere('n.user = :val')
->setParameter('val', $value->getId())
->getQuery()
->getResult();
}
}

View File

@ -3,7 +3,6 @@
<head>
<meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title>
<!--<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">-->
{% block stylesheets %}
{% endblock %}
</head>

View File

@ -11,7 +11,6 @@
<script src='/js/script.js'></script>
<script src="https://kit.fontawesome.com/f15a79324f.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/13.0.2/markdown-it.min.js" integrity="sha512-ohlWmsCxOu0bph1om5eDL0jm/83eH09fvqLDhiEdiqfDeJbEvz4FSbeY0gLJSVJwQAp0laRhTXbUQG+ZUuifUQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/showdown/2.1.0/showdown.min.js'></script>
{% endblock %}
{% block body %}
@ -20,9 +19,9 @@
<i class="fa fa-bars hamburger" aria-hidden="true"></i>
<ul class="hamburger-list" style="display: none">
<li><a href="#" onclick='newNote()'>New Note</a></li>
<li><a href="#" onclick='showSearchNote(event)'>Open Note</a></li>
<li><a href='#' onclick='openNote()'>Open Note</a></li>
<li><a href="#" onclick="saveNote();link.click();">Save Note</a></li>
<li><a href='#' onclick='discardNote()'>Discard Note</a></li>
<li><a href='#' onclick='discardNote()'>Delete Note</a></li>
<li><hr/></li>
<li><a href='/index.php/reference-editor'>Reference Editor</a></li>
<li><a href='#' onclick="openRef()">Open Reference</a></li>
@ -30,7 +29,11 @@
<li><a href='/index.php/template-editor'>Template Editor</a></li>
</ul>&nbsp;&nbsp;
<i id='save-check' class='fa fa-check' style='opacity:0;'></i>
<div id='res'></div>
<select id='user' onchange="changeUser('user', this.value)">
<option value=''>-- User --</option>
<option value='godsgood33@gmail.com'>Ryan</option>
<option value='kimprather01@gmail.com'>Kim</option>
</select>
</section>
<section class="ref-tab">
<ul id='ref-list'>
@ -39,11 +42,28 @@
<section class="ref">
<h2>Reference</h2>
<div id="ref"></div>
<div id='note-list'>
<table>
<thead>
<tr>
<th>Title</th>
<th>Speaker</th>
<th>Passage</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{% for n in notes %}
{{ n.toTableRow() | raw }}<br />
{% endfor %}
</tbody>
</table>
</div>
</section>
<section class="notes">
<div id='note-header-left'>
<h2>Notes</h2>
<button id='show-hide-btn' onclick='toggleFields()'>Show</button>
<button id='show-hide-btn' class='button' onclick='toggleFields()'>Show</button>
</div>
<div id='note-header-right'>
<select id='template' onchange="retrieveTemplate('template','notes')">
@ -52,13 +72,13 @@
<option value="{{ t.id }}">{{ t.name }}</option>
{% endfor %}
</select>
<input type="button" id="previewBtn" value="Preview" onclick='previewNote()'><br />
<input type="button" id="previewBtn" class='button' value="Preview" onclick='previewNote()'><br />
</div>
<div id='fields-container'>
<input type="hidden" id="noteId" value="{{ id }}" />
<input type="text" id="noteTitle" placeholder="Title..." />
<input type='date' id='noteDate' />
<input type='date' id='noteDate' onchange='textDirty=true;saved=false;' />
<input type='text' id='newSpeaker' placeholder='Name...' onkeyup='saveSpeaker(event)' />
<select id="speaker" onchange='newSpeaker()'>
<option value=0>-- Speaker --</option>
@ -75,7 +95,7 @@
<option value='{{ s.id }}'>{{ s.name }}</option>
{% endfor %}
</select>
<input type='text' id='passage' placeholder='Passage...' />
<input type='text' id='passage' placeholder='Passage...' onchange='saved=false;textDirty=true;' />
</div>
<textarea id="notes" wrap="hard"></textarea>
@ -101,8 +121,6 @@
<button id="searchBtn" onclick="queryRef()">Search</button>
</div>
<div id='noteSearch'>
<input type='text' id='noteSearchQuery' placeholder='Search...' /><br/>
<button id='noteSearchButton' onclick='searchNote()'>Search</button>
<div id='passage-popup'>
</div>
{% endblock %}