diff --git a/build.gradle b/build.gradle index 1559bc7..1fefb2f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ description = "Presentation app" group = 'org.jlab' version = new File("${projectDir}/VERSION").text.trim() ext.version = project.version +ext.smoothnessVersion = '5.2.0' ext.releaseDate = new Date().format('MMM dd yyyy') tasks.withType(JavaCompile).configureEach { @@ -18,6 +19,9 @@ repositories { mavenCentral() } dependencies { + // No matter what smoothness weblib MUST be included in WAR (https://github.com/JeffersonLab/smoothness/issues/4) + implementation "org.jlab:smoothness-weblib:${smoothnessVersion}" + // Java 11 / Java EE 8 oddly doesn't support POSTING multipart/form-data implementation 'org.apache.httpcomponents:httpmime:4.5.14' @@ -46,6 +50,9 @@ war { filter { String line -> line.replaceAll("@RELEASE_DATE@", releaseDate) } + filter { + String line -> line.replaceAll("@SMOOTHNESS_VERSION@", smoothnessVersion) + } } } spotless { diff --git a/container/oracle/initdb.d/02_ddl.sql b/container/oracle/initdb.d/02_ddl.sql index bb14987..b3f7c5f 100644 --- a/container/oracle/initdb.d/02_ddl.sql +++ b/container/oracle/initdb.d/02_ddl.sql @@ -67,6 +67,18 @@ CREATE SEQUENCE PRESENTER_OWNER.SLIDE_ID NOCACHE ORDER; +CREATE SEQUENCE PRESENTER_OWNER.TEAM_ID + START WITH 1 + NOCYCLE + NOCACHE + ORDER; + +CREATE SEQUENCE PRESENTER_OWNER.TEAM_STATUS_REPORT_ID + START WITH 1 + NOCYCLE + NOCACHE + ORDER; + CREATE TABLE PRESENTER_OWNER.PRESENTATION ( PRESENTATION_ID INTEGER NOT NULL , @@ -332,4 +344,46 @@ CREATE TABLE PRESENTER_OWNER.STAFF ( "STAFF_ID" NUMBER(*,0) NOT NULL, "USERNAME" VARCHAR2(32) -); \ No newline at end of file +); + +CREATE TABLE PRESENTER_OWNER.TEAM +( + TEAM_ID INTEGER NOT NULL, + NAME VARCHAR2(128 CHAR) NOT NULL, + DESCRIPTION VARCHAR2(1024 CHAR) NULL, + DIRECTORY_ROLE VARCHAR2(64 CHAR) NOT NULL, + WEIGHT INTEGER DEFAULT 0 NOT NULL, + ARCHIVED_YN VARCHAR2(1 CHAR) DEFAULT 'N' NOT NULL, + CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID), + CONSTRAINT TEAM_AK1 UNIQUE (NAME), + CONSTRAINT TEAM_CK1 CHECK (ARCHIVED_YN IN ('Y', 'N')) +); + +CREATE TABLE PRESENTER_OWNER.TEAM_STATUS_REPORT +( + TEAM_STATUS_REPORT_ID INTEGER NOT NULL, + TEAM_ID INTEGER NOT NULL, + YMD TIMESTAMP(0) NOT NULL, + ACCOMPLISHED CLOB NULL, + IN_PROGRESS CLOB NULL, + PLANNED CLOB NULL, + ROADBLOCKS CLOB NULL, + CONSTRAINT TEAM_STATUS_REPORT_PK PRIMARY KEY (TEAM_STATUS_REPORT_ID), + CONSTRAINT TEAM_STATUS_REPORT_FK FOREIGN KEY (TEAM_ID) REFERENCES PRESENTER_OWNER.TEAM(TEAM_ID), + CONSTRAINT TEAM_STATUS_REPORT_AK1 UNIQUE (TEAM_ID, YMD), + CONSTRAINT TEAM_STATUS_REPORT_CK1 CHECK (EXTRACT(HOUR FROM YMD) = 0 AND EXTRACT(MINUTE FROM YMD) = 0 AND EXTRACT(SECOND FROM YMD) = 0) +); + +CREATE TABLE PRESENTER_OWNER.SETTING +( + KEY VARCHAR2(128 CHAR) NOT NULL, + VALUE VARCHAR2(4000 BYTE) NOT NULL, + TYPE VARCHAR2(32 CHAR) DEFAULT 'STRING' NOT NULL, + DESCRIPTION VARCHAR2(2048 CHAR) NOT NULL, + TAG VARCHAR2(32 CHAR) DEFAULT 'OTHER' NOT NULL, + WEIGHT INTEGER DEFAULT 0 NOT NULL, + CHANGE_ACTION_JNDI VARCHAR2(128 CHAR) NULL , + CONSTRAINT SETTING_PK PRIMARY KEY (KEY), + CONSTRAINT SETTING_CK1 CHECK (TYPE IN ('STRING', 'BOOLEAN', 'CSV')), + CONSTRAINT SETTING_CK2 CHECK ((VALUE in ('Y', 'N') AND TYPE = 'BOOLEAN') OR TYPE <> 'BOOLEAN') +); diff --git a/container/oracle/initdb.d/03_default_data.sql b/container/oracle/initdb.d/03_default_data.sql index f279f2d..f0ac859 100644 --- a/container/oracle/initdb.d/03_default_data.sql +++ b/container/oracle/initdb.d/03_default_data.sql @@ -1,2 +1,46 @@ alter session set container = XEPDB1; +-- Special characters such as the ampersand will result in prompt without this directive. +SET DEFINE OFF; + +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Injector', 'Accelerator division center for injectors and sources group', 'cis', 0, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Mechanical Support', 'Accelerator division electrical engineering support services group', 'eess', 1, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'RF', 'Radio frequency electrical work group', 'rf', 2, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'SRF', 'Super radio frequency work group', 'srf', 3, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Vacuum', 'Vacuum group', 'vac', 4, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'DC Power', 'DC Power group', 'dcpower', 5, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Instrumentation & Controls', 'I&C group', 'ic', 6, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Safety Systems', 'Safety group', 'ssg', 7, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Survey & Alignment', 'Alignment group', 'alignment', 8, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Accelerator Computing', 'Accelerator division computing group', 'acg', 9, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Cryogenics', 'Cryo group', 'cryo', 10, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'F&O', 'Facilities group', 'facilities', 11, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'ES&H', 'ES&H group', 'health', 12, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Hall A (Moller Install)', 'Physics division Hall A', 'halla', 13, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Hall B', 'I&C group', 'hallb', 14, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Hall C', 'I&C group', 'hallc', 15, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Hall D', 'I&C group', 'halld', 16, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'LERF', 'LERF group', 'lerf', 17, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'Gun Test Stand', 'GTS group', 'gts', 18, 'N'); +insert into PRESENTER_OWNER.TEAM (TEAM_ID, NAME, DESCRIPTION, DIRECTORY_ROLE, WEIGHT, ARCHIVED_YN) values (PRESENTER_OWNER.TEAM_ID.nextval, 'UITF', 'UITF group', 'uitf', 19, 'N'); + +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 1, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 2, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 3, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 4, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 5, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 6, TRUNC(SYSDATE), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 1, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 2, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 3, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 4, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 5, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 6, TRUNC(SYSDATE - INTERVAL '1' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 1, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 2, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 3, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 4, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 5, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); +insert into PRESENTER_OWNER.TEAM_STATUS_REPORT(TEAM_STATUS_REPORT_ID, TEAM_ID, YMD, ACCOMPLISHED, IN_PROGRESS, PLANNED, ROADBLOCKS) values (PRESENTER_OWNER.TEAM_STATUS_REPORT_ID.nextval, 6, TRUNC(SYSDATE - INTERVAL '2' DAY), 'Nothing Accomplished!', 'Nothing in progress!', 'Nothing planned', 'Nothing blocking!'); + + diff --git a/container/oracle/initdb.d/04_settings.sql b/container/oracle/initdb.d/04_settings.sql new file mode 100644 index 0000000..376597b --- /dev/null +++ b/container/oracle/initdb.d/04_settings.sql @@ -0,0 +1,34 @@ +alter session set container = XEPDB1; + +-- SETTING CONFIG +-- Update with your schema name +ALTER SESSION SET CURRENT_SCHEMA = PRESENTER_OWNER; + +-- REQUIRED: Admin Config +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('ADMIN_ROLE_NAME', 'presenter-admin', 'STRING', 'App-specific Admin Role Name', 'AUTH', 1); + +-- OPTIONAL: CDN Config +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('SMOOTHNESS_CDN_ENABLED', 'N', 'BOOLEAN', 'Smoothness weblib resources from CDN. Defaults to No = serve files locally. CDN is for minified files on shared Content Delivery Network (CDN) server - Nice for when multiple apps use same resources to have warm cache.', 'CDN', 1); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('SMOOTHNESS_SERVER', 'ace.jlab.org/cdn', 'STRING', 'Host name and port of content delivery network host for shared smoothness resources. Only used if SMOOTHNESS_CDN_ENABLED = Y', 'CDN', 2); + +-- OPTIONAL: IP READ FILTER (ACL) +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('IP_READ_FILTER_ENABLED', 'N', 'BOOLEAN', 'Whether to enable IP filtering of pages requiring auth to view. You must redeploy the app for this setting change to take effect.', 'ACL', 1); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT, CHANGE_ACTION_JNDI) values ('IP_READ_ALLOWLIST_PATTERN', '127\.0.*', 'STRING', 'Java REGEX Pattern of allowed IPs for unauthenticated access to view IpReadFilter pages', 'ACL', 2, 'java:global/smoothness/IpReadAllowlistReconfigureService'); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('IP_READ_URL_PATTERN', '/*', 'STRING', 'URL patterns to match when applying the IP Read Filter. You must redeploy the app for this setting change to take effect.', 'ACL', 3); + +-- OPTIONAL: Notification Banner +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('NOTIFICATION_ENABLED', 'Y', 'BOOLEAN', 'Notification banner enabled', 'NOTIFICATION', 1); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('NOTIFICATION_MESSAGE', 'Development Environment', 'STRING', 'Notification message', 'NOTIFICATION', 2); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('NOTIFICATION_LINK_NAME', 'Home', 'STRING', 'Notification link name', 'NOTIFICATION', 3); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('NOTIFICATION_LINK_URL', 'https://github.com/JeffersonLab/presenter', 'STRING', 'Notification link URL', 'NOTIFICATION', 4); + +-- OPTIONAL: Help Page +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('HELP_CONTENT_CONTACT', 'John Doe (jdoe)', 'STRING', 'Content Contact for help page', 'HELP', 1); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('HELP_TECHNICAL_CONTACT', 'John Doe (jdoe)', 'STRING', 'Technical Contact for help page', 'HELP', 2); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('HELP_DOC_CSV', 'https://github.com/JeffersonLab/presenter|Home', 'CSV', 'CSV of documentation items where each item is a URL and a Label separated with the pipe symbol', 'HELP', 3); + +-- OPTIONAL: Email +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('EMAIL_ENABLED', 'Y', 'BOOLEAN', 'Emails (including Help/Feedback) enabled', 'EMAIL', 1); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('EMAIL_TESTING_ENABLED', 'N', 'BOOLEAN', 'Send all emails to testlead user group', 'EMAIL', 2); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('EMAIL_DOMAIN_NAME', '@jlab.org', 'STRING', 'The email domain to append to usernames, starting with and including the ampersat.', 'EMAIL', 3); +insert into SETTING (KEY, VALUE, TYPE, DESCRIPTION, TAG, WEIGHT) values ('EMAIL_SENDER_ADDRESS', 'template@jlab.org', 'STRING', 'Email address to use as sender from emails generated in this app. Note: this is not the same as "from".', 'EMAIL', 4); diff --git a/src/main/java/org/jlab/presenter/business/session/AccActivityRecordFacade.java b/src/main/java/org/jlab/presenter/business/session/AccActivityRecordFacade.java index bac8cf9..835f914 100644 --- a/src/main/java/org/jlab/presenter/business/session/AccActivityRecordFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/AccActivityRecordFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class AccActivityRecordFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/AccessRecordFacade.java b/src/main/java/org/jlab/presenter/business/session/AccessRecordFacade.java index dc528ff..808d625 100644 --- a/src/main/java/org/jlab/presenter/business/session/AccessRecordFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/AccessRecordFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class AccessRecordFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/BeamToHallRecordFacade.java b/src/main/java/org/jlab/presenter/business/session/BeamToHallRecordFacade.java index ec2e601..f162ecc 100644 --- a/src/main/java/org/jlab/presenter/business/session/BeamToHallRecordFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/BeamToHallRecordFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class BeamToHallRecordFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/BodySlideFacade.java b/src/main/java/org/jlab/presenter/business/session/BodySlideFacade.java index d9e6f2d..11d34ab 100644 --- a/src/main/java/org/jlab/presenter/business/session/BodySlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/BodySlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class BodySlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/BtaRecordFacade.java b/src/main/java/org/jlab/presenter/business/session/BtaRecordFacade.java index f29f766..184c6d0 100644 --- a/src/main/java/org/jlab/presenter/business/session/BtaRecordFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/BtaRecordFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class BtaRecordFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/BtaShiftInfoSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/BtaShiftInfoSlideFacade.java index 1777619..5a6fc37 100644 --- a/src/main/java/org/jlab/presenter/business/session/BtaShiftInfoSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/BtaShiftInfoSlideFacade.java @@ -13,7 +13,7 @@ */ @Stateless public class BtaShiftInfoSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/CCPresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/CCPresentationFacade.java index caec570..5e15d14 100644 --- a/src/main/java/org/jlab/presenter/business/session/CCPresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/CCPresentationFacade.java @@ -16,7 +16,7 @@ */ @Stateless(mappedName = "CCPresentationFacade") public class CCPresentationFacade extends ShiftPresentationFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/IFrameSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/IFrameSlideFacade.java index 9feadbb..2d21a05 100644 --- a/src/main/java/org/jlab/presenter/business/session/IFrameSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/IFrameSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class IFrameSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/ImageSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/ImageSlideFacade.java index db15c3f..2770b41 100644 --- a/src/main/java/org/jlab/presenter/business/session/ImageSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/ImageSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class ImageSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/LASOPresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/LASOPresentationFacade.java index da5ccd3..98b1c46 100644 --- a/src/main/java/org/jlab/presenter/business/session/LASOPresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/LASOPresentationFacade.java @@ -17,7 +17,7 @@ @Stateless public class LASOPresentationFacade extends ShiftPresentationFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/LOPresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/LOPresentationFacade.java index 5e67de7..c696b1f 100644 --- a/src/main/java/org/jlab/presenter/business/session/LOPresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/LOPresentationFacade.java @@ -17,7 +17,7 @@ @Stateless public class LOPresentationFacade extends ShiftPresentationFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/PDPresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/PDPresentationFacade.java index ceb59bb..6628f0e 100644 --- a/src/main/java/org/jlab/presenter/business/session/PDPresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PDPresentationFacade.java @@ -26,7 +26,7 @@ @DeclareRoles({"pd", "presenter-admin"}) public class PDPresentationFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @EJB SlideFacade slideFacade; diff --git a/src/main/java/org/jlab/presenter/business/session/PdAccessSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/PdAccessSlideFacade.java index 710b657..c50d631 100644 --- a/src/main/java/org/jlab/presenter/business/session/PdAccessSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PdAccessSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class PdAccessSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/PdBeamAccSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/PdBeamAccSlideFacade.java index 82eea86..0c3c06b 100644 --- a/src/main/java/org/jlab/presenter/business/session/PdBeamAccSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PdBeamAccSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class PdBeamAccSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/PdInfoSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/PdInfoSlideFacade.java index 878049d..f5dd180 100644 --- a/src/main/java/org/jlab/presenter/business/session/PdInfoSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PdInfoSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class PdInfoSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/PresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/PresentationFacade.java index 8dd9728..1441b22 100644 --- a/src/main/java/org/jlab/presenter/business/session/PresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PresentationFacade.java @@ -63,7 +63,7 @@ public class PresentationFacade extends AbstractFacade { private static final Logger LOGGER = Logger.getLogger(PresentationFacade.class.getName()); - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Resource private SessionContext context; diff --git a/src/main/java/org/jlab/presenter/business/session/PresentationLogFacade.java b/src/main/java/org/jlab/presenter/business/session/PresentationLogFacade.java index 6e9d7e6..79fcade 100644 --- a/src/main/java/org/jlab/presenter/business/session/PresentationLogFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/PresentationLogFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class PresentationLogFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/ShiftInfoSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/ShiftInfoSlideFacade.java index ce5ed89..41c2352 100644 --- a/src/main/java/org/jlab/presenter/business/session/ShiftInfoSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/ShiftInfoSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class ShiftInfoSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/SlideFacade.java b/src/main/java/org/jlab/presenter/business/session/SlideFacade.java index 864518d..2cdf24f 100644 --- a/src/main/java/org/jlab/presenter/business/session/SlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/SlideFacade.java @@ -22,7 +22,7 @@ @DeclareRoles({"pd", "cc", "presenter-admin"}) public class SlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Resource private SessionContext context; diff --git a/src/main/java/org/jlab/presenter/business/session/TeamFacade.java b/src/main/java/org/jlab/presenter/business/session/TeamFacade.java new file mode 100644 index 0000000..8c0d5da --- /dev/null +++ b/src/main/java/org/jlab/presenter/business/session/TeamFacade.java @@ -0,0 +1,105 @@ +package org.jlab.presenter.business.session; + +import jakarta.annotation.security.DeclareRoles; +import jakarta.annotation.security.PermitAll; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.criteria.*; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import org.jlab.presenter.persistence.entity.Team; +import org.jlab.presenter.persistence.enumeration.Include; +import org.jlab.smoothness.business.service.UserAuthorizationService; +import org.jlab.smoothness.persistence.view.User; + +/** + * @author ryans + */ +@Stateless +@DeclareRoles("presenter-admin") +public class TeamFacade extends AbstractFacade { + + @PersistenceContext(unitName = "webappPU") + private EntityManager em; + + public TeamFacade() { + super(Team.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + @PermitAll + public Team findTeamWithMembers(BigInteger teamId) { + Team team = find(teamId); + + if (team != null) { + UserAuthorizationService userService = UserAuthorizationService.getInstance(); + List userList = userService.getUsersInRole(team.getDirectoryRole()); + team.setMembers(userList); + } + + return team; + } + + private List getFilters( + CriteriaBuilder cb, + CriteriaQuery cq, + Root root, + Include includeArchived) { + List filters = new ArrayList<>(); + + if (includeArchived == null) { + filters.add(cb.equal(root.get("archived"), false)); + } else if (Include.EXCLUSIVELY == includeArchived) { + filters.add(cb.equal(root.get("archived"), true)); + } // else Include.YES, which means don't filter at all + + return filters; + } + + @PermitAll + public List filterList(Include includeArchived, int offset, int max) { + CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Team.class); + Root root = cq.from(Team.class); + cq.select(root); + + List filters = getFilters(cb, cq, root, includeArchived); + + if (!filters.isEmpty()) { + cq.where(cb.and(filters.toArray(new Predicate[] {}))); + } + + List orders = new ArrayList<>(); + Path p0 = root.get("weight"); + Order o0 = cb.asc(p0); + orders.add(o0); + Path p1 = root.get("name"); + Order o1 = cb.asc(p1); + orders.add(o1); + cq.orderBy(orders); + return getEntityManager() + .createQuery(cq) + .setFirstResult(offset) + .setMaxResults(max) + .getResultList(); + } + + @PermitAll + public List findAllWithMembers(Include includeArchived) { + List teamList = filterList(includeArchived, 0, Integer.MAX_VALUE); + + for (Team team : teamList) { + UserAuthorizationService userService = UserAuthorizationService.getInstance(); + List userList = userService.getUsersInRole(team.getDirectoryRole()); + team.setMembers(userList); + } + + return teamList; + } +} diff --git a/src/main/java/org/jlab/presenter/business/session/TeamStatusReportFacade.java b/src/main/java/org/jlab/presenter/business/session/TeamStatusReportFacade.java new file mode 100644 index 0000000..6fcecfa --- /dev/null +++ b/src/main/java/org/jlab/presenter/business/session/TeamStatusReportFacade.java @@ -0,0 +1,92 @@ +package org.jlab.presenter.business.session; + +import jakarta.annotation.security.DeclareRoles; +import jakarta.annotation.security.PermitAll; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.*; +import java.util.ArrayList; +import java.util.List; +import org.jlab.presenter.persistence.entity.Team; +import org.jlab.presenter.persistence.entity.TeamStatusReport; + +/** + * @author ryans + */ +@Stateless +@DeclareRoles("presenter-admin") +public class TeamStatusReportFacade extends AbstractFacade { + + @PersistenceContext(unitName = "webappPU") + private EntityManager em; + + public TeamStatusReportFacade() { + super(TeamStatusReport.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + private List getFilters( + CriteriaBuilder cb, + CriteriaQuery cq, + Root root, + Team team) { + List filters = new ArrayList<>(); + + if (team != null) { + filters.add(cb.equal(root.get("team").get("teamId"), team.getTeamId())); + } + + return filters; + } + + @PermitAll + public List filterList(Team team, int offset, int max) { + CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(TeamStatusReport.class); + Root root = cq.from(TeamStatusReport.class); + cq.select(root); + + List filters = getFilters(cb, cq, root, team); + + if (!filters.isEmpty()) { + cq.where(cb.and(filters.toArray(new Predicate[] {}))); + } + + List orders = new ArrayList<>(); + Path p0 = root.get("ymd"); + Order o0 = cb.asc(p0); + orders.add(o0); + Path p1 = root.get("team").get("name"); + Order o1 = cb.asc(p1); + orders.add(o1); + cq.orderBy(orders); + return getEntityManager() + .createQuery(cq) + .setFirstResult(offset) + .setMaxResults(max) + .getResultList(); + } + + @PermitAll + public long countList(Team team) { + CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(TeamStatusReport.class); + + List filters = getFilters(cb, cq, root, team); + + if (!filters.isEmpty()) { + cq.where(cb.and(filters.toArray(new Predicate[] {}))); + } + + cq.select(cb.count(root)); + TypedQuery q = getEntityManager().createQuery(cq); + return q.getSingleResult(); + } +} diff --git a/src/main/java/org/jlab/presenter/business/session/TitleBodyImageSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/TitleBodyImageSlideFacade.java index c4b5979..36c375b 100644 --- a/src/main/java/org/jlab/presenter/business/session/TitleBodyImageSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/TitleBodyImageSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class TitleBodyImageSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/TitleBodySlideFacade.java b/src/main/java/org/jlab/presenter/business/session/TitleBodySlideFacade.java index 2d5ef77..ad7c4a8 100644 --- a/src/main/java/org/jlab/presenter/business/session/TitleBodySlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/TitleBodySlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class TitleBodySlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/TitleImageSlideFacade.java b/src/main/java/org/jlab/presenter/business/session/TitleImageSlideFacade.java index 7945889..6f96ac8 100644 --- a/src/main/java/org/jlab/presenter/business/session/TitleImageSlideFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/TitleImageSlideFacade.java @@ -10,7 +10,7 @@ */ @Stateless public class TitleImageSlideFacade extends AbstractFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/business/session/UITFPresentationFacade.java b/src/main/java/org/jlab/presenter/business/session/UITFPresentationFacade.java index 0bbec0e..f2a14ee 100644 --- a/src/main/java/org/jlab/presenter/business/session/UITFPresentationFacade.java +++ b/src/main/java/org/jlab/presenter/business/session/UITFPresentationFacade.java @@ -17,7 +17,7 @@ @Stateless public class UITFPresentationFacade extends ShiftPresentationFacade { - @PersistenceContext(unitName = "presenterPU") + @PersistenceContext(unitName = "webappPU") private EntityManager em; @Override diff --git a/src/main/java/org/jlab/presenter/persistence/entity/Team.java b/src/main/java/org/jlab/presenter/persistence/entity/Team.java new file mode 100644 index 0000000..df2459e --- /dev/null +++ b/src/main/java/org/jlab/presenter/persistence/entity/Team.java @@ -0,0 +1,134 @@ +package org.jlab.presenter.persistence.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.io.Serializable; +import java.math.BigInteger; +import java.util.List; +import org.jlab.smoothness.persistence.util.YnStringToBoolean; +import org.jlab.smoothness.persistence.view.User; + +/** + * @author ryans + */ +@Entity +@Table(name = "TEAM", schema = "PRESENTER_OWNER") +public class Team implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @SequenceGenerator(name = "TeamId", sequenceName = "TEAM_ID", allocationSize = 1) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TeamId") + @Basic(optional = false) + @NotNull + @Column(name = "TEAM_ID", nullable = false, precision = 22, scale = 0) + private BigInteger teamId; + + @Basic(optional = false) + @NotNull + @Size(min = 1, max = 128) + @Column(nullable = false, length = 128) + private String name; + + @Size(max = 1024) + @Column(length = 1024) + private String description; + + @NotNull + @Column(name = "DIRECTORY_ROLE", nullable = false, length = 64) + private String directoryRole; + + @Basic(optional = false) + @Column(name = "WEIGHT", nullable = false, precision = 22, scale = 0) + private BigInteger weight; + + @Basic + @Column(name = "ARCHIVED_YN", nullable = false, length = 1) + @Convert(converter = YnStringToBoolean.class) + private boolean archived; + + @Transient private List members; + + public Team() {} + + public BigInteger getTeamId() { + return teamId; + } + + public void setTeamId(BigInteger teamId) { + this.teamId = teamId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public BigInteger getWeight() { + return weight; + } + + public void setWeight(BigInteger weight) { + this.weight = weight; + } + + public boolean isArchived() { + return archived; + } + + public void setArchived(boolean archived) { + this.archived = archived; + } + + public String getDirectoryRole() { + return directoryRole; + } + + public void setDirectoryRole(String directoryRole) { + this.directoryRole = directoryRole; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (teamId != null ? teamId.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof Team)) { + return false; + } + Team other = (Team) object; + return (this.teamId != null || other.teamId == null) + && (this.teamId == null || this.teamId.equals(other.teamId)); + } + + @Override + public String toString() { + return "org.jlab.presenter.persistence.entity.Team[ teamId=" + teamId + " ]"; + } +} diff --git a/src/main/java/org/jlab/presenter/persistence/entity/TeamStatusReport.java b/src/main/java/org/jlab/presenter/persistence/entity/TeamStatusReport.java new file mode 100644 index 0000000..1a45a2e --- /dev/null +++ b/src/main/java/org/jlab/presenter/persistence/entity/TeamStatusReport.java @@ -0,0 +1,133 @@ +package org.jlab.presenter.persistence.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Date; +import java.util.Objects; + +@Entity +@Table(name = "TEAM_STATUS_REPORT", schema = "PRESENTER_OWNER") +public class TeamStatusReport implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @SequenceGenerator( + name = "TeamStatusReportId", + sequenceName = "TEAM_STATUS_REPORT_ID", + allocationSize = 1) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TeamStatusReportId") + @Basic(optional = false) + @NotNull + @Column(name = "TEAM_STATUS_REPORT_ID", nullable = false, precision = 22, scale = 0) + private BigInteger teamStatusReportId; + + @JoinColumn(name = "TEAM_ID", referencedColumnName = "TEAM_ID", nullable = false) + @ManyToOne(optional = false) + private Team team; + + @Basic(optional = false) + @Column(name = "YMD", nullable = false) + @Temporal(TemporalType.TIMESTAMP) + private Date ymd; + + @Column(name = "ACCOMPLISHED") + @Lob + private String accomplished; + + @Column(name = "IN_PROGRESS") + @Lob + private String inProgress; + + @Column(name = "PLANNED") + @Lob + private String planned; + + @Column(name = "ROADBLOCKS") + @Lob + private String roadblocks; + + public TeamStatusReport() {} + + public BigInteger getTeamStatusReportId() { + return teamStatusReportId; + } + + public void setTeamStatusReportId(BigInteger teamStatusReportId) { + this.teamStatusReportId = teamStatusReportId; + } + + public Team getTeam() { + return team; + } + + public void setTeam(Team team) { + this.team = team; + } + + public Date getYmd() { + return ymd; + } + + public void setYmd(Date ymd) { + this.ymd = ymd; + } + + public String getAccomplished() { + return accomplished; + } + + public void setAccomplished(String accomplished) { + this.accomplished = accomplished; + } + + public String getInProgress() { + return inProgress; + } + + public void setInProgress(String inProgress) { + this.inProgress = inProgress; + } + + public String getPlanned() { + return planned; + } + + public void setPlanned(String planned) { + this.planned = planned; + } + + public String getRoadblocks() { + return roadblocks; + } + + public void setRoadblocks(String roadblocks) { + this.roadblocks = roadblocks; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 73 * hash + (this.teamStatusReportId != null ? this.teamStatusReportId.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final TeamStatusReport other = (TeamStatusReport) obj; + return Objects.equals(this.teamStatusReportId, other.teamStatusReportId); + } + + @Override + public String toString() { + return "TeamStatusReport{" + "teamStatusReportId=" + teamStatusReportId + '}'; + } +} diff --git a/src/main/java/org/jlab/presenter/persistence/enumeration/Include.java b/src/main/java/org/jlab/presenter/persistence/enumeration/Include.java new file mode 100644 index 0000000..24eae96 --- /dev/null +++ b/src/main/java/org/jlab/presenter/persistence/enumeration/Include.java @@ -0,0 +1,6 @@ +package org.jlab.presenter.persistence.enumeration; + +public enum Include { + YES, + EXCLUSIVELY +} diff --git a/src/main/java/org/jlab/presenter/presentation/controller/ContextRootController.java b/src/main/java/org/jlab/presenter/presentation/controller/ContextRootController.java new file mode 100644 index 0000000..2969fe5 --- /dev/null +++ b/src/main/java/org/jlab/presenter/presentation/controller/ContextRootController.java @@ -0,0 +1,34 @@ +package org.jlab.presenter.presentation.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author ryans + */ +@WebServlet( + name = "ContextRootController", + urlPatterns = {""}) +public class ContextRootController extends HttpServlet { + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // Using welcome-file in web.xml is less-good way of doing this as instead of redirect, it's a + // forward. + response.sendRedirect(request.getContextPath() + "/presentations"); + } +} diff --git a/src/main/java/org/jlab/presenter/presentation/controller/DashboardController.java b/src/main/java/org/jlab/presenter/presentation/controller/DashboardController.java new file mode 100644 index 0000000..9f9c0c0 --- /dev/null +++ b/src/main/java/org/jlab/presenter/presentation/controller/DashboardController.java @@ -0,0 +1,32 @@ +package org.jlab.presenter.presentation.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author ryans + */ +@WebServlet( + name = "DashboardController", + urlPatterns = {"/dashboard"}) +public class DashboardController extends HttpServlet { + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.getRequestDispatcher("/WEB-INF/views/dashboard.jsp").forward(request, response); + } +} diff --git a/src/main/java/org/jlab/presenter/presentation/controller/PDMenu.java b/src/main/java/org/jlab/presenter/presentation/controller/Presentations.java similarity index 98% rename from src/main/java/org/jlab/presenter/presentation/controller/PDMenu.java rename to src/main/java/org/jlab/presenter/presentation/controller/Presentations.java index d130be2..617baa4 100644 --- a/src/main/java/org/jlab/presenter/presentation/controller/PDMenu.java +++ b/src/main/java/org/jlab/presenter/presentation/controller/Presentations.java @@ -34,11 +34,11 @@ * @author ryans */ @WebServlet( - name = "PDMenu", - urlPatterns = {"/pd-menu"}) -public class PDMenu extends HttpServlet { + name = "Presentations", + urlPatterns = {"/presentations"}) +public class Presentations extends HttpServlet { - private static final Logger logger = Logger.getLogger(PDMenu.class.getName()); + private static final Logger logger = Logger.getLogger(Presentations.class.getName()); @EJB PresentationFacade presentationFacade; @EJB PDPresentationFacade pdPresentationFacade; @EJB CCPresentationFacade ccPresentationFacade; @@ -85,7 +85,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/pd-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/presentations.jsp") .forward(request, response); } @@ -182,7 +182,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/pd-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/presentations.jsp") .forward( request, response); /*This is bad. Should not forward from POST. This POST should be done via AJAX*/ diff --git a/src/main/java/org/jlab/presenter/presentation/controller/StatusReports.java b/src/main/java/org/jlab/presenter/presentation/controller/StatusReports.java new file mode 100644 index 0000000..de1c947 --- /dev/null +++ b/src/main/java/org/jlab/presenter/presentation/controller/StatusReports.java @@ -0,0 +1,121 @@ +package org.jlab.presenter.presentation.controller; + +import jakarta.ejb.EJB; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigInteger; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; +import org.jlab.presenter.business.session.TeamFacade; +import org.jlab.presenter.business.session.TeamStatusReportFacade; +import org.jlab.presenter.persistence.entity.Team; +import org.jlab.presenter.persistence.entity.TeamStatusReport; +import org.jlab.smoothness.presentation.util.Paginator; +import org.jlab.smoothness.presentation.util.ParamConverter; +import org.jlab.smoothness.presentation.util.ParamUtil; + +/** + * @author ryans + */ +@WebServlet( + name = "Status Reports", + urlPatterns = {"/status-reports"}) +public class StatusReports extends HttpServlet { + + @EJB TeamFacade teamFacade; + + @EJB TeamStatusReportFacade teamStatusReportFacade; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + int offset = ParamUtil.convertAndValidateNonNegativeInt(request, "offset", 0); + int max = ParamUtil.convertAndValidateNonNegativeInt(request, "max", 10); + + if (max > 1000) { + max = 1000; + } + + BigInteger teamId = ParamConverter.convertBigInteger(request, "teamId"); + + Team selectedTeam = null; + + if (teamId != null) { + selectedTeam = teamFacade.find(teamId); + + if (selectedTeam == null) { + throw new ServletException("Team with id " + teamId + " not found"); + } + } + + List teamList = teamFacade.findAllWithMembers(null); + List teamStatusReportList = + teamStatusReportFacade.filterList(selectedTeam, offset, max); + + Long totalRecords = teamStatusReportFacade.countList(selectedTeam); + + Paginator paginator = new Paginator(totalRecords.intValue(), offset, max); + + String selectionMessage = createSelectionMessage(paginator, selectedTeam); + + request.setAttribute("teamList", teamList); + request.setAttribute("teamStatusReportList", teamStatusReportList); + request.setAttribute("paginator", paginator); + request.setAttribute("selectionMessage", selectionMessage); + + request.getRequestDispatcher("/WEB-INF/views/status-reports.jsp").forward(request, response); + } + + private String createSelectionMessage(Paginator paginator, Team team) { + DecimalFormat formatter = new DecimalFormat("###,###"); + + StringBuilder selectionMessage = new StringBuilder("All Reports"); + + List filters = new ArrayList<>(); + + if (team != null) { + filters.add("Team \"" + team.getName() + "\""); + } + + if (!filters.isEmpty()) { + selectionMessage = new StringBuilder(filters.get(0)); + + for (int i = 1; i < filters.size(); i++) { + String filter = filters.get(i); + selectionMessage.append(" and ").append(filter); + } + } + + if (paginator.getTotalRecords() < paginator.getMaxPerPage() && paginator.getOffset() == 0) { + selectionMessage + .append(" {") + .append(formatter.format(paginator.getTotalRecords())) + .append("}"); + } else { + selectionMessage + .append(" {") + .append(formatter.format(paginator.getStartNumber())) + .append(" - ") + .append(formatter.format(paginator.getEndNumber())) + .append(" of ") + .append(formatter.format(paginator.getTotalRecords())) + .append("}"); + } + + return selectionMessage.toString(); + } +} diff --git a/src/main/java/org/jlab/presenter/presentation/controller/setup/TeamsController.java b/src/main/java/org/jlab/presenter/presentation/controller/setup/TeamsController.java new file mode 100644 index 0000000..051cc41 --- /dev/null +++ b/src/main/java/org/jlab/presenter/presentation/controller/setup/TeamsController.java @@ -0,0 +1,51 @@ +package org.jlab.presenter.presentation.controller.setup; + +import jakarta.ejb.EJB; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import org.jlab.presenter.business.session.TeamFacade; +import org.jlab.presenter.persistence.entity.Team; + +/** + * @author ryans + */ +@WebServlet( + name = "TeamsController", + urlPatterns = {"/setup/teams"}) +public class TeamsController extends HttpServlet { + + @EJB TeamFacade teamFacade; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + String name = request.getParameter("name"); + + List teamList = teamFacade.findAllWithMembers(null); + + String selectionMessage = null; + + if (name != null) { + selectionMessage = "Team \"" + name + "\""; + } + + request.setAttribute("selectionMessage", selectionMessage); + request.setAttribute("teamList", teamList); + + request.getRequestDispatcher("/WEB-INF/views/setup/teams.jsp").forward(request, response); + } +} diff --git a/src/main/java/org/jlab/presenter/presentation/controller/CCMenu.java b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/CebafShiftLogs.java similarity index 94% rename from src/main/java/org/jlab/presenter/presentation/controller/CCMenu.java rename to src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/CebafShiftLogs.java index 36e9437..b6526b1 100644 --- a/src/main/java/org/jlab/presenter/presentation/controller/CCMenu.java +++ b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/CebafShiftLogs.java @@ -1,4 +1,4 @@ -package org.jlab.presenter.presentation.controller; +package org.jlab.presenter.presentation.controller.shiftlogs; import jakarta.ejb.EJB; import jakarta.servlet.ServletException; @@ -30,9 +30,9 @@ * @author ryans */ @WebServlet( - name = "CCMenu", - urlPatterns = {"/cc-menu"}) -public class CCMenu extends HttpServlet { + name = "CebafShiftLogs", + urlPatterns = {"/shift-logs/cebaf"}) +public class CebafShiftLogs extends HttpServlet { @EJB PresentationFacade presentationFacade; @EJB CCPresentationFacade ccPresentationFacade; @@ -67,7 +67,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/cc-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/cebaf.jsp") .forward(request, response); } @@ -124,7 +124,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!messages.isEmpty()) { getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/cc-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/cebaf.jsp") .forward(request, response); } else { diff --git a/src/main/java/org/jlab/presenter/presentation/controller/LASOMenu.java b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LasoShiftLogs.java similarity index 94% rename from src/main/java/org/jlab/presenter/presentation/controller/LASOMenu.java rename to src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LasoShiftLogs.java index 133b9d6..887890d 100644 --- a/src/main/java/org/jlab/presenter/presentation/controller/LASOMenu.java +++ b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LasoShiftLogs.java @@ -1,4 +1,4 @@ -package org.jlab.presenter.presentation.controller; +package org.jlab.presenter.presentation.controller.shiftlogs; import jakarta.ejb.EJB; import jakarta.servlet.ServletException; @@ -31,9 +31,9 @@ * @author ryans */ @WebServlet( - name = "LASOMenu", - urlPatterns = {"/laso-menu"}) -public class LASOMenu extends HttpServlet { + name = "LasoShiftLogs", + urlPatterns = {"/shift-logs/laso"}) +public class LasoShiftLogs extends HttpServlet { @EJB PresentationFacade presentationFacade; @EJB LASOPresentationFacade lasoPresentationFacade; @@ -68,7 +68,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/laso-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/laso.jsp") .forward(request, response); } @@ -125,7 +125,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!messages.isEmpty()) { getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/laso-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/laso.jsp") .forward(request, response); } else { diff --git a/src/main/java/org/jlab/presenter/presentation/controller/LOMenu.java b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LerfShiftLogs.java similarity index 94% rename from src/main/java/org/jlab/presenter/presentation/controller/LOMenu.java rename to src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LerfShiftLogs.java index 68670e1..ae4723d 100644 --- a/src/main/java/org/jlab/presenter/presentation/controller/LOMenu.java +++ b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/LerfShiftLogs.java @@ -1,4 +1,4 @@ -package org.jlab.presenter.presentation.controller; +package org.jlab.presenter.presentation.controller.shiftlogs; import jakarta.ejb.EJB; import jakarta.servlet.ServletException; @@ -31,9 +31,9 @@ * @author ryans */ @WebServlet( - name = "LOMenu", - urlPatterns = {"/lo-menu"}) -public class LOMenu extends HttpServlet { + name = "LerfShiftLogs", + urlPatterns = {"/shift-logs/lerf"}) +public class LerfShiftLogs extends HttpServlet { @EJB PresentationFacade presentationFacade; @EJB LOPresentationFacade loPresentationFacade; @@ -68,7 +68,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/lo-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/lerf.jsp") .forward(request, response); } @@ -126,7 +126,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!messages.isEmpty()) { getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/lo-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/lerf.jsp") .forward(request, response); } else { diff --git a/src/main/java/org/jlab/presenter/presentation/controller/UITFMenu.java b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/UitfShiftLogs.java similarity index 94% rename from src/main/java/org/jlab/presenter/presentation/controller/UITFMenu.java rename to src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/UitfShiftLogs.java index a392ff8..316c432 100644 --- a/src/main/java/org/jlab/presenter/presentation/controller/UITFMenu.java +++ b/src/main/java/org/jlab/presenter/presentation/controller/shiftlogs/UitfShiftLogs.java @@ -1,4 +1,4 @@ -package org.jlab.presenter.presentation.controller; +package org.jlab.presenter.presentation.controller.shiftlogs; import jakarta.ejb.EJB; import jakarta.servlet.ServletException; @@ -27,9 +27,9 @@ * @author ryans */ @WebServlet( - name = "UITFMenu", - urlPatterns = {"/uitf-menu"}) -public class UITFMenu extends HttpServlet { + name = "UitfShiftLogs", + urlPatterns = {"/shift-logs/uitf"}) +public class UitfShiftLogs extends HttpServlet { @EJB PresentationFacade presentationFacade; @EJB UITFPresentationFacade uitfPresentationFacade; @@ -64,7 +64,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/uitf-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/uitf.jsp") .forward(request, response); } @@ -122,7 +122,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) if (!messages.isEmpty()) { getServletConfig() .getServletContext() - .getRequestDispatcher("/WEB-INF/views/uitf-menu.jsp") + .getRequestDispatcher("/WEB-INF/views/shiftlogs/uitf.jsp") .forward(request, response); } else { diff --git a/src/main/java/org/jlab/presenter/presentation/filter/IPAuthFilter.java b/src/main/java/org/jlab/presenter/presentation/filter/IPAuthFilter.java index 1be8f06..44ae8f5 100644 --- a/src/main/java/org/jlab/presenter/presentation/filter/IPAuthFilter.java +++ b/src/main/java/org/jlab/presenter/presentation/filter/IPAuthFilter.java @@ -34,7 +34,7 @@ public class IPAuthFilter implements Filter { "/resources", "/keep-alive", "/logout", - "/pd-menu" // welcome page + "/presentations" // welcome page }; public static final String LOCAL_PATTERN_STRING = "127\\.0\\.0\\.1"; diff --git a/src/main/java/org/jlab/presenter/presentation/util/PresentationMenuUtil.java b/src/main/java/org/jlab/presenter/presentation/util/PresentationMenuUtil.java index 6acbd2a..b734c5b 100644 --- a/src/main/java/org/jlab/presenter/presentation/util/PresentationMenuUtil.java +++ b/src/main/java/org/jlab/presenter/presentation/util/PresentationMenuUtil.java @@ -38,7 +38,7 @@ public class PresentationMenuUtil { public static void delete( HttpServletRequest request, HttpServletResponse response, BigInteger presentationId) throws IOException { - response.sendRedirect("pd-menu"); + response.sendRedirect("presentations"); } private PresentationMenuUtil() { diff --git a/src/main/java/org/jlab/presenter/presentation/util/ShowInfo.java b/src/main/java/org/jlab/presenter/presentation/util/ShowInfo.java index 2817752..fbcf126 100644 --- a/src/main/java/org/jlab/presenter/presentation/util/ShowInfo.java +++ b/src/main/java/org/jlab/presenter/presentation/util/ShowInfo.java @@ -361,7 +361,7 @@ public List getTemplateList() { @Override public String getMenuUrl() { - return "pd-menu"; + return "presentations"; } @Override @@ -411,7 +411,7 @@ public List getTemplateList() { @Override public String getMenuUrl() { - return "cc-menu"; + return "shift-logs/cebaf"; } @Override @@ -456,7 +456,7 @@ public List getTemplateList() { @Override public String getMenuUrl() { - return "laso-menu"; + return "shift-logs/laso"; } @Override @@ -505,7 +505,7 @@ public List getTemplateList() { @Override public String getMenuUrl() { - return "lo-menu"; + return "shift-logs/lerf"; } @Override @@ -550,7 +550,7 @@ public List getTemplateList() { @Override public String getMenuUrl() { - return "uitf-menu"; + return "shift-logs/uitf"; } @Override diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 232c4b0..2f173c4 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -2,7 +2,7 @@ - + org.hibernate.jpa.HibernatePersistenceProvider jdbc/presenter false @@ -11,5 +11,6 @@ + org.jlab.smoothness.persistence.entity.Setting diff --git a/src/main/webapp/WEB-INF/tags/app-script.tag b/src/main/webapp/WEB-INF/tags/app-script.tag new file mode 100644 index 0000000..6a3eb9a --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/app-script.tag @@ -0,0 +1,2 @@ +<%@tag description="App Script Tag" pageEncoding="UTF-8"%> + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/app-style.tag b/src/main/webapp/WEB-INF/tags/app-style.tag new file mode 100644 index 0000000..81aa3b1 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/app-style.tag @@ -0,0 +1,2 @@ +<%@tag description="App Style Tag" pageEncoding="UTF-8"%> + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/footnote.tag b/src/main/webapp/WEB-INF/tags/footnote.tag new file mode 100644 index 0000000..22584b4 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/footnote.tag @@ -0,0 +1 @@ +<%@tag description="Footnote Tag" pageEncoding="UTF-8"%> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/header-extra.tag b/src/main/webapp/WEB-INF/tags/header-extra.tag new file mode 100644 index 0000000..228677c --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/header-extra.tag @@ -0,0 +1 @@ +<%@tag description="Header Extra Tag" pageEncoding="UTF-8"%> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/page.tag b/src/main/webapp/WEB-INF/tags/page.tag deleted file mode 100644 index 0dfb156..0000000 --- a/src/main/webapp/WEB-INF/tags/page.tag +++ /dev/null @@ -1,141 +0,0 @@ -<%@tag description="The Site Page Template Tag" pageEncoding="UTF-8"%> -<%@taglib prefix="c" uri="jakarta.tags.core"%> -<%@taglib prefix="fn" uri="jakarta.tags.functions"%> -<%@attribute name="title"%> -<%@attribute name="stylesheets" fragment="true"%> -<%@attribute name="scripts" fragment="true"%> - - - - - - - <c:out value="${initParam.appShortName}"/> - ${title} - - - - - - - - - - - - - - -
-
-
-
-
-

-
- - - - - -
- -
-
- - -
-
- - - - - - - - - - Login - - SU - - -
-
-
-
-

- -
-
-
-
- -
-
-
- - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/primary-nav.tag b/src/main/webapp/WEB-INF/tags/primary-nav.tag new file mode 100644 index 0000000..bc1eb91 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/primary-nav.tag @@ -0,0 +1,27 @@ +<%@tag description="Primary Navigation Tag" pageEncoding="UTF-8"%> +<%@taglib prefix="c" uri="jakarta.tags.core"%> +<%@taglib prefix="fn" uri="jakarta.tags.functions"%> +<%@taglib prefix="fmt" uri="jakarta.tags.fmt"%> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/setup-nav.tag b/src/main/webapp/WEB-INF/tags/setup-nav.tag new file mode 100644 index 0000000..cc6d164 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/setup-nav.tag @@ -0,0 +1,16 @@ +<%@tag description="Setup Navigation Tag" pageEncoding="UTF-8"%> +<%@taglib prefix="c" uri="jakarta.tags.core"%> +<%@taglib prefix="fn" uri="jakarta.tags.functions"%> +<%@taglib prefix="fmt" uri="jakarta.tags.fmt"%> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/shift-logs-nav.tag b/src/main/webapp/WEB-INF/tags/shift-logs-nav.tag new file mode 100644 index 0000000..36ae0b8 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/shift-logs-nav.tag @@ -0,0 +1,19 @@ +<%@tag description="Shift Logs Navigation Tag" pageEncoding="UTF-8"%> +<%@taglib prefix="c" uri="jakarta.tags.core"%> +<%@taglib prefix="fn" uri="jakarta.tags.functions"%> +<%@taglib prefix="fmt" uri="jakarta.tags.fmt"%> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tags/shift-logs-page.tag b/src/main/webapp/WEB-INF/tags/shift-logs-page.tag new file mode 100644 index 0000000..8224170 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/shift-logs-page.tag @@ -0,0 +1,32 @@ +<%@tag description="The Shift Logs Page Template Tag" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%> +<%@taglib prefix="c" uri="jakarta.tags.core"%> +<%@taglib prefix="fn" uri="jakarta.tags.functions" %> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> +<%@taglib prefix="t" tagdir="/WEB-INF/tags"%> +<%@attribute name="title" %> +<%@attribute name="stylesheets" fragment="true" %> +<%@attribute name="scripts" fragment="true" %> + + + + + + + + + +
+
+
+

Shift Logs

+ +
+
+
+ +
+
+
+
diff --git a/src/main/webapp/WEB-INF/tags/user-extra.tag b/src/main/webapp/WEB-INF/tags/user-extra.tag new file mode 100644 index 0000000..ad266be --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/user-extra.tag @@ -0,0 +1 @@ +<%@tag description="User Extra Tag" pageEncoding="UTF-8"%> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/dashboard.jsp b/src/main/webapp/WEB-INF/views/dashboard.jsp new file mode 100644 index 0000000..aece80f --- /dev/null +++ b/src/main/webapp/WEB-INF/views/dashboard.jsp @@ -0,0 +1,85 @@ +<%@taglib prefix="sql" uri="jakarta.tags.sql"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@taglib prefix="c" uri="jakarta.tags.core"%> +<%@taglib prefix="fn" uri="jakarta.tags.functions"%> +<%@taglib prefix="fmt" uri="jakarta.tags.fmt"%> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> + + + + + + + + + +
+ +
+
+
+ Time + +
+
+ Taxonomy +
    +
  • +
    + +
    +
    + +
    +
  • +
+
+
+ + +
+
+

+
+ + + + + + + + + + + + + + + + + + + + + + +
Day / TeamAccomplishedIn ProgressPlannedRoadblocks
+
+
+
+ + +
+
+
+
diff --git a/src/main/webapp/WEB-INF/views/error.jsp b/src/main/webapp/WEB-INF/views/error.jsp index 01ed2b9..f7adf16 100644 --- a/src/main/webapp/WEB-INF/views/error.jsp +++ b/src/main/webapp/WEB-INF/views/error.jsp @@ -2,9 +2,10 @@ <%@taglib prefix="c" uri="jakarta.tags.core"%> <%@taglib prefix="fn" uri="jakarta.tags.functions"%> <%@taglib prefix="fmt" uri="jakarta.tags.fmt"%> +<%@taglib prefix="s" uri="jlab.tags.smoothness"%> <%@taglib prefix="t" tagdir="/WEB-INF/tags"%> - +