LP#1938835: customizable staff portal - schema, IDL, and seed data
authorGalen Charlton <gmc@equinoxOLI.org>
Mon, 2 Aug 2021 22:12:57 +0000 (18:12 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 24 Mar 2022 12:54:35 +0000 (08:54 -0400)
This patch adds two new database tables and corresponding IDL classes:

* config.ui_staff_portal_page_entry_type (types of portal widgets)
* config.ui_staff_portal_page_entry (entries/widgets for the portal)

It also adds a new permission, ADMIN_STAFF_PORTAL_PAGE, for managing
the new entries, seed data for the stock portal, and a grid setting
for the portal admin interface.

Sponsored-by: Pioneer Library System
Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/800.fkeys.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.portal_page_table.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/YYYY.data.default_portal_page.sql [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/ZZZZ.data.portal_admin_perm.sql [new file with mode: 0644]

index 1e379ed..eb915c1 100644 (file)
@@ -13901,6 +13901,44 @@ SELECT  usr,
                </permacrud>
        </class>
 
+    <class id="cusppet" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::ui_staff_portal_page_entry_type" oils_persist:tablename="config.ui_staff_portal_page_entry_type" reporter:label="Portal Page Entry Type">
+        <fields oils_persist:primary="code">
+            <field name="code" reporter:label="Entry Type Code" reporter:datatype="text" reporter:selector="label" oils_obj:required="true"/>
+            <field name="label" reporter:label="Entry Type Label" reporter:datatype="text" oils_obj:required="true"/>
+        </fields>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <retrieve/>
+                       </actions>
+               </permacrud>
+       </class>
+
+    <class id="cusppe" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::ui_staff_portal_page_entry" oils_persist:tablename="config.ui_staff_portal_page_entry" reporter:label="Portal Page Entry">
+        <fields oils_persist:primary="id" oils_persist:sequence="config.ui_staff_portal_page_entry_id_seq">
+            <field name="id" reporter:label="ID" reporter:datatype="id" reporter:selector="label"/>
+            <field name="page_col" reporter:label="Page Column" reporter:datatype="int" oils_obj:required="true"/>
+            <field name="col_pos" reporter:label="Column Position" reporter:datatype="int" oils_obj:required="true"/>
+            <field name="entry_type" reporter:label="Entry Type" reporter:datatype="link" oils_obj:required="true"/>
+            <field name="label" reporter:label="Entry Label" reporter:datatype="text"/>
+            <field name="image_url" reporter:label="Entry Image URL" reporter:datatype="text"/>
+            <field name="target_url" reporter:label="Entry Target URL" reporter:datatype="text"/>
+            <field name="entry_text" reporter:label="Entry Text" reporter:datatype="text"/>
+                       <field name="owner" reporter:label="Owner" reporter:datatype="link" oils_obj:required="true"/>
+        </fields>
+               <links>
+                       <link field="entry_type" reltype="has_a" key="code" map="" class="cusppet"/>
+                       <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_STAFF_PORTAL_PAGE" context_field="owner"/>
+                <retrieve permission="STAFF_LOGIN" context_field="owner"/>
+                <update permission="ADMIN_STAFF_PORTAL_PAGE" context_field="owner"/>
+                <delete permission="ADMIN_STAFF_PORTAL_PAGE" context_field="owner"/>
+            </actions>
+        </permacrud>
+    </class>
+
        <!-- ********************************************************************************************************************* -->
 </IDL>
 
index 07fe6cc..f49c1de 100644 (file)
@@ -1383,4 +1383,21 @@ CREATE TABLE config.geolocation_service (
     api_key      TEXT
 );
 
+CREATE TABLE config.ui_staff_portal_page_entry_type (
+    code        TEXT PRIMARY KEY,
+    label       TEXT NOT NULL
+);
+
+CREATE TABLE config.ui_staff_portal_page_entry (
+    id          SERIAL PRIMARY KEY,
+    page_col    INTEGER NOT NULL,
+    col_pos     INTEGER NOT NULL,
+    entry_type  TEXT NOT NULL, -- REFERENCES config.ui_staff_portal_page_entry_type(code)
+    label       TEXT,
+    image_url   TEXT,
+    target_url  TEXT,
+    entry_text  TEXT,
+    owner       INT NOT NULL -- REFERENCES actor.org_unit (id)
+);
+
 COMMIT;
index 6ddf4cc..9fdb933 100644 (file)
@@ -269,4 +269,9 @@ ALTER TABLE config.print_template ADD CONSTRAINT cpt_owner_fkey
 ALTER TABLE config.geolocation_service ADD CONSTRAINT cgs_owner_fkey
     FOREIGN KEY (owner) REFERENCES  actor.org_unit(id) DEFERRABLE INITIALLY DEFERRED;
 
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_entry_type_fkey
+    FOREIGN KEY (entry_type) REFERENCES  config.ui_staff_portal_page_entry_type(code) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_owner_fkey
+    FOREIGN KEY (owner) REFERENCES  actor.org_unit(id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
 COMMIT;
index 0da9827..0ca785a 100644 (file)
@@ -1964,10 +1964,11 @@ INSERT INTO permission.perm_list ( id, code, description ) VALUES
  ( 634, 'UPDATE_RECORD_NOTE', oils_i18n_gettext(634,
     'Allow the user to update a record note', 'ppl', 'description')),
  ( 635, 'DELETE_RECORD_NOTE', oils_i18n_gettext(635,
-    'Allow the user to delete a record note', 'ppl', 'description'))
+    'Allow the user to delete a record note', 'ppl', 'description')),
+ ( 636, 'ADMIN_STAFF_PORTAL_PAGE', oils_i18n_gettext( 636,
+    'Update the staff client portal page', 'ppl', 'description' ))
 ;
 
-
 SELECT SETVAL('permission.perm_list_id_seq'::TEXT, 1000);
 
 INSERT INTO permission.grp_tree (id, name, parent, description, perm_interval, usergroup, application_perm) VALUES
@@ -22079,4 +22080,43 @@ VALUES (
         'Grid Config: eg.grid.cat.bucket.batch_hold.list',
         'cwst', 'label'
     )
-);
\ No newline at end of file
+);
+
+INSERT INTO config.ui_staff_portal_page_entry_type (code, label)
+VALUES
+    ('link', oils_i18n_gettext('link', 'Link', 'cusppet', 'label')),
+    ('menuitem', oils_i18n_gettext('menuitem', 'Menu Item', 'cusppet', 'label')),
+    ('text', oils_i18n_gettext('text', 'Text and/or HTML', 'cusppet', 'label')),
+    ('header', oils_i18n_gettext('header', 'Header', 'cusppet', 'label')),
+    ('catalogsearch', oils_i18n_gettext('catalogsearch', 'Catalog Search Box', 'cusppet', 'label'));
+
+INSERT INTO config.ui_staff_portal_page_entry
+    (id, page_col, col_pos, entry_type, label, image_url, target_url, owner)
+VALUES
+    ( 1, 1, 0, 'header',        oils_i18n_gettext( 1, 'Circulation and Patrons', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 2, 1, 1, 'menuitem',      oils_i18n_gettext( 2, 'Check Out Items', 'cusppe', 'label'), '/images/portal/forward.png', '/eg/staff/circ/patron/bcsearch', 1)
+,   ( 3, 1, 2, 'menuitem',      oils_i18n_gettext( 3, 'Check In Items', 'cusppe', 'label'), '/images/portal/back.png', '/eg/staff/circ/checkin/index', 1)
+,   ( 4, 1, 3, 'menuitem',      oils_i18n_gettext( 4, 'Search For Patron By Name', 'cusppe', 'label'), '/images/portal/retreivepatron.png', '/eg/staff/circ/patron/search', 1)
+,   ( 5, 2, 0, 'header',        oils_i18n_gettext( 5, 'Item Search and Cataloging', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 6, 2, 1, 'catalogsearch', oils_i18n_gettext( 6, 'Search Catalog', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 7, 2, 2, 'menuitem',      oils_i18n_gettext( 7, 'Record Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/record/', 1)
+,   ( 8, 2, 3, 'menuitem',      oils_i18n_gettext( 8, 'Item Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/copy/', 1)
+,   ( 9, 3, 0, 'header',        oils_i18n_gettext( 9, 'Administration', 'cusppe', 'label'), NULL, NULL, 1)
+,   (10, 3, 1, 'link',          oils_i18n_gettext(10, 'Evergreen Documentation', 'cusppe', 'label'), '/images/portal/helpdesk.png', 'https://docs.evergreen-ils.org', 1)
+,   (11, 3, 2, 'menuitem',      oils_i18n_gettext(11, 'Workstation Administration', 'cusppe', 'label'), '/images/portal/helpdesk.png', '/eg/staff/admin/workstation/index', 1)
+,   (12, 3, 3, 'menuitem',      oils_i18n_gettext(12, 'Reports', 'cusppe', 'label'), '/images/portal/reports.png', '/eg/staff/reporter/legacy/main', 1)
+;
+
+SELECT setval('config.ui_staff_portal_page_entry_id_seq', 100);
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.config.ui_staff_portal_page_entry', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.config.ui_staff_portal_page_entry',
+        'Grid Config: admin.config.ui_staff_portal_page_entry',
+        'cwst', 'label'
+    )
+);
+
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.portal_page_table.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.portal_page_table.sql
new file mode 100644 (file)
index 0000000..41e872c
--- /dev/null
@@ -0,0 +1,34 @@
+BEGIN;
+
+CREATE TABLE config.ui_staff_portal_page_entry_type (
+    code        TEXT PRIMARY KEY,
+    label       TEXT NOT NULL
+);
+
+INSERT INTO config.ui_staff_portal_page_entry_type (code, label)
+VALUES
+    ('link', oils_i18n_gettext('link', 'Link', 'cusppet', 'label')),
+    ('menuitem', oils_i18n_gettext('menuitem', 'Menu Item', 'cusppet', 'label')),
+    ('text', oils_i18n_gettext('text', 'Text and/or HTML', 'cusppet', 'label')),
+    ('header', oils_i18n_gettext('header', 'Header', 'cusppet', 'label')),
+    ('catalogsearch', oils_i18n_gettext('catalogsearch', 'Catalog Search Box', 'cusppet', 'label'));
+
+
+CREATE TABLE config.ui_staff_portal_page_entry (
+    id          SERIAL PRIMARY KEY,
+    page_col    INTEGER NOT NULL,
+    col_pos     INTEGER NOT NULL,
+    entry_type  TEXT NOT NULL, -- REFERENCES config.ui_staff_portal_page_entry_type(code)
+    label       TEXT,
+    image_url   TEXT,
+    target_url  TEXT,
+    entry_text  TEXT,
+    owner       INT NOT NULL -- REFERENCES actor.org_unit (id)
+);
+
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_entry_type_fkey
+    FOREIGN KEY (entry_type) REFERENCES  config.ui_staff_portal_page_entry_type(code) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_owner_fkey
+    FOREIGN KEY (owner) REFERENCES  actor.org_unit(id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+COMMIT;
diff --git a/Open-ILS/src/sql/Pg/upgrade/YYYY.data.default_portal_page.sql b/Open-ILS/src/sql/Pg/upgrade/YYYY.data.default_portal_page.sql
new file mode 100644 (file)
index 0000000..4dbdd52
--- /dev/null
@@ -0,0 +1,34 @@
+BEGIN;
+
+INSERT INTO config.ui_staff_portal_page_entry
+    (id, page_col, col_pos, entry_type, label, image_url, target_url, owner)
+VALUES
+    ( 1, 1, 0, 'header',        oils_i18n_gettext( 1, 'Circulation and Patrons', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 2, 1, 1, 'menuitem',      oils_i18n_gettext( 2, 'Check Out Items', 'cusppe', 'label'), '/images/portal/forward.png', '/eg/staff/circ/patron/bcsearch', 1)
+,   ( 3, 1, 2, 'menuitem',      oils_i18n_gettext( 3, 'Check In Items', 'cusppe', 'label'), '/images/portal/back.png', '/eg/staff/circ/checkin/index', 1)
+,   ( 4, 1, 3, 'menuitem',      oils_i18n_gettext( 4, 'Search For Patron By Name', 'cusppe', 'label'), '/images/portal/retreivepatron.png', '/eg/staff/circ/patron/search', 1)
+,   ( 5, 2, 0, 'header',        oils_i18n_gettext( 5, 'Item Search and Cataloging', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 6, 2, 1, 'catalogsearch', oils_i18n_gettext( 6, 'Search Catalog', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 7, 2, 2, 'menuitem',      oils_i18n_gettext( 7, 'Record Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/record/', 1)
+,   ( 8, 2, 3, 'menuitem',      oils_i18n_gettext( 8, 'Item Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/copy/', 1)
+,   ( 9, 3, 0, 'header',        oils_i18n_gettext( 9, 'Administration', 'cusppe', 'label'), NULL, NULL, 1)
+,   (10, 3, 1, 'link',          oils_i18n_gettext(10, 'Evergreen Documentation', 'cusppe', 'label'), '/images/portal/helpdesk.png', 'https://docs.evergreen-ils.org', 1)
+,   (11, 3, 2, 'menuitem',      oils_i18n_gettext(11, 'Workstation Administration', 'cusppe', 'label'), '/images/portal/helpdesk.png', '/eg/staff/admin/workstation/index', 1)
+,   (12, 3, 3, 'menuitem',      oils_i18n_gettext(12, 'Reports', 'cusppe', 'label'), '/images/portal/reports.png', '/eg/staff/reporter/legacy/main', 1)
+;
+
+SELECT setval('config.ui_staff_portal_page_entry_id_seq', 100);
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.config.ui_staff_portal_page_entry', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.config.ui_staff_portal_page_entry',
+        'Grid Config: admin.config.ui_staff_portal_page_entry',
+        'cwst', 'label'
+    )
+);
+
+COMMIT;
+
diff --git a/Open-ILS/src/sql/Pg/upgrade/ZZZZ.data.portal_admin_perm.sql b/Open-ILS/src/sql/Pg/upgrade/ZZZZ.data.portal_admin_perm.sql
new file mode 100644 (file)
index 0000000..c9cbf20
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN;
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+( 636, 'ADMIN_STAFF_PORTAL_PAGE', oils_i18n_gettext( 636,
+   'Update the staff client portal page', 'ppl', 'description' ))
+;
+
+COMMIT;