From 030d7c2c84743d07bde1218009f284e09ca54650 Mon Sep 17 00:00:00 2001 From: pedro-mendonca Date: Wed, 2 Oct 2024 08:57:24 +0100 Subject: [PATCH] Add meta route and view --- assets/css/style.css | 2 +- assets/css/style.css.map | 2 +- assets/css/style.min.css | 2 +- assets/css/style.scss | 3 +- gp-templates/gptoolbox-meta.php | 202 ++++++++++++++++++++++++++ gp-templates/gptoolbox-tools-meta.php | 21 +++ includes/class-toolbox.php | 3 +- includes/routes/class-meta.php | 43 ++++++ 8 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 gp-templates/gptoolbox-meta.php create mode 100644 gp-templates/gptoolbox-tools-meta.php create mode 100644 includes/routes/class-meta.php diff --git a/assets/css/style.css b/assets/css/style.css index bce6bfc..0b0d577 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -31,7 +31,7 @@ table.gp-table td span.unknown { color: var(--gp-color-fg-muted); font-style: italic; } -table.gp-table.gp-toolbox.tools-permission-admin, table.gp-table.gp-toolbox.tools-permission-validator, table.gp-table.gp-toolbox.tools-permission-other, table.gp-table.gp-toolbox.tools-originals, table.gp-table.gp-toolbox.tools-translation-sets, table.gp-table.gp-toolbox.tools-translations, table.gp-table.gp-toolbox.tools-glossaries { +table.gp-table.gp-toolbox.tools-permission-admin, table.gp-table.gp-toolbox.tools-permission-validator, table.gp-table.gp-toolbox.tools-permission-other, table.gp-table.gp-toolbox.tools-originals, table.gp-table.gp-toolbox.tools-translation-sets, table.gp-table.gp-toolbox.tools-translations, table.gp-table.gp-toolbox.tools-glossaries, table.gp-table.gp-toolbox.tools-meta { width: auto; } table.gp-table.translation-sets tbody tr td.stats:not(.percent) { diff --git a/assets/css/style.css.map b/assets/css/style.css.map index 500415f..e215b9e 100644 --- a/assets/css/style.css.map +++ b/assets/css/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAAA;AAME;EACC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;;AAKF;EACC;EACA;EACA;;AAKA;EACC;EACA;EACA;EACA;;AAKF;EAOC;;AAaI;EAEC;;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAWF;EACC;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;EAEC;;AAEA;AAAA;AAAA;AAAA;EACC;;AAIF;EACC;EACA;;AAGD;EACC;EACA;;AAmBL;EACC;;AAME;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAmBP;EACC;;;AAQD;EACC;;;AAMF;EACC;;AAIC;EACC;EACA;;AAEA;EACC;;AAEA;EACC;;;AAYL;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AAKF;AAAA;EAEC;;;AAKA;AAAA;EAEC;;AAKA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAKF;EACC;;;AAKF;EACC;EACA;;AAIC;EACC;EACA;EACA;EACA","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAAA;AAME;EACC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;;AAKF;EACC;EACA;EACA;;AAKA;EACC;EACA;EACA;EACA;;AAKF;EAQC;;AAaI;EAEC;;AAIC;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAWF;EACC;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;EAEC;;AAEA;AAAA;AAAA;AAAA;EACC;;AAIF;EACC;EACA;;AAGD;EACC;EACA;;AAmBL;EACC;;AAME;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAmBP;EACC;;;AAQD;EACC;;;AAMF;EACC;;AAIC;EACC;EACA;;AAEA;EACC;;AAEA;EACC;;;AAYL;EACC;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;EACA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AAKF;AAAA;EAEC;;;AAKA;AAAA;EAEC;;AAKA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAKF;EACC;;;AAKF;EACC;EACA;;AAIC;EACC;EACA;EACA;EACA","file":"style.css"} \ No newline at end of file diff --git a/assets/css/style.min.css b/assets/css/style.min.css index 051009d..0aef09e 100644 --- a/assets/css/style.min.css +++ b/assets/css/style.min.css @@ -1,2 +1,2 @@ -table.gp-table button{display:inline-block}table.gp-table button.hidden{display:none}table.gp-table button.delete{background:none;border:none;color:var(--gp-color-primary-500);cursor:pointer;padding:0}table.gp-table button.delete:disabled{color:var(--gp-color-btn-disabled-text);cursor:default}table.gp-table button.delete span.dashicons{font-size:1rem;vertical-align:middle}table.gp-table div.progress-notice{font-size:.75em;font-style:italic;white-space:nowrap}table.gp-table td span.unknown{color:var(--gp-color-fg-muted);font-style:italic;text-align:center;vertical-align:middle}table.gp-table.gp-toolbox.tools-glossaries,table.gp-table.gp-toolbox.tools-originals,table.gp-table.gp-toolbox.tools-permission-admin,table.gp-table.gp-toolbox.tools-permission-other,table.gp-table.gp-toolbox.tools-permission-validator,table.gp-table.gp-toolbox.tools-translation-sets,table.gp-table.gp-toolbox.tools-translations{width:auto}table.gp-table.translation-sets tbody tr td.stats:not(.percent){background-color:var(--gp-color-secondary-100)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight a{opacity:1}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.translated{background-color:var(--gp-color-status-current-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.fuzzy{background-color:var(--gp-color-status-fuzzy-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.untranslated{background-color:inherit}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.waiting{background-color:var(--gp-color-status-waiting-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.old{background-color:var(--gp-color-status-old-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.rejected{background-color:var(--gp-color-status-rejected-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.changesrequested{background-color:var(--gp-color-status-changesrequested-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.warnings{background-color:inherit}table.gp-table.translation-sets tbody tr td.stats.changesrequested div.progress-notice,table.gp-table.translation-sets tbody tr td.stats.old div.progress-notice,table.gp-table.translation-sets tbody tr td.stats.rejected div.progress-notice{font-size:.75em;font-style:italic;white-space:nowrap}table.gp-table.translation-sets tbody tr td.stats.changesrequested a,table.gp-table.translation-sets tbody tr td.stats.changesrequested button,table.gp-table.translation-sets tbody tr td.stats.old a,table.gp-table.translation-sets tbody tr td.stats.old button,table.gp-table.translation-sets tbody tr td.stats.rejected a,table.gp-table.translation-sets tbody tr td.stats.rejected button{display:inline-block}table.gp-table.translation-sets tbody tr td.stats.changesrequested a.hidden,table.gp-table.translation-sets tbody tr td.stats.changesrequested button.hidden,table.gp-table.translation-sets tbody tr td.stats.old a.hidden,table.gp-table.translation-sets tbody tr td.stats.old button.hidden,table.gp-table.translation-sets tbody tr td.stats.rejected a.hidden,table.gp-table.translation-sets tbody tr td.stats.rejected button.hidden{display:none}table.gp-table.translation-sets tbody tr td.stats.changesrequested a,table.gp-table.translation-sets tbody tr td.stats.old a,table.gp-table.translation-sets tbody tr td.stats.rejected a{padding:0 1rem;width:100%}table.gp-table.translation-sets tbody tr td.stats.changesrequested button.delete,table.gp-table.translation-sets tbody tr td.stats.old button.delete,table.gp-table.translation-sets tbody tr td.stats.rejected button.delete{position:absolute;translate:-1rem}table.gp-table.tools-permission-validator tr.duplicate{background-color:var(--gp-color-attention-emphasis)}table.gp-table.tools-permission-validator tr.duplicate td.action span.duplicate{background-color:#fff;border:1px solid var(--gp-color-bubble-inactive-project-text);border-radius:1em;color:var(--gp-color-bubble-inactive-project-text);font-size:80%;font-weight:500;margin-left:.2rem;padding:.2em .5em;text-align:center;text-decoration:none;text-shadow:none}section.gp-toolbox{margin-top:2rem}.notice.notice-info{background-color:var(--gp-color-primary-50)}div.gp-heading div.gp-toolbox-tools{margin-left:auto}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link{font-size:1.125rem;font-weight:600}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link.current{text-decoration:underline}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link.current:hover{text-decoration-thickness:.125rem}.tablesorter-glotpress .tablesorter-header:not(.sorter-false){padding-left:1em;padding-right:2.5em}table.gp-toolbox.tools-glossaries td.entries,table.gp-toolbox.tools-glossaries td.id:not(.unknown),td.stats{text-align:center}table.gp-toolbox.tools-glossaries td.entries a{color:var(--gp-color-fg-default);display:block;font-weight:600;text-decoration:none}table.gp-toolbox.tools-glossaries td.entries a:focus,table.gp-toolbox.tools-glossaries td.entries a:hover{text-decoration:underline;text-decoration-thickness:.125rem;text-underline-offset:.1em;text-underline-position:under}table.gp-table tbody td,table.gp-table tbody th{padding:.5em 2em}.gptoolbox-description code,.gptoolbox-description span.translation-status{padding:0 4px}.gptoolbox-description span.translation-status.current{background-color:var(--gp-color-status-current-subtle)}.gptoolbox-description span.translation-status.fuzzy{background-color:var(--gp-color-status-fuzzy-subtle)}.gptoolbox-description span.translation-status.waiting{background-color:var(--gp-color-status-waiting-subtle)}.gptoolbox-description span.translation-status.old{background-color:var(--gp-color-status-old-subtle)}.gptoolbox-description span.translation-status.rejected{background-color:var(--gp-color-status-rejected-subtle)}.gptoolbox-description span.translation-status.changesrequested{background-color:var(--gp-color-status-changesrequested-subtle)}.gptoolbox-description code{background-color:var(--gp-color-primary-50)}ul.gptoolbox-description{list-style:none;padding-left:.5rem}ul.gptoolbox-description li:before{color:var(--gp-color-primary);content:"\f147";font-family:dashicons;vertical-align:middle} +table.gp-table button{display:inline-block}table.gp-table button.hidden{display:none}table.gp-table button.delete{background:none;border:none;color:var(--gp-color-primary-500);cursor:pointer;padding:0}table.gp-table button.delete:disabled{color:var(--gp-color-btn-disabled-text);cursor:default}table.gp-table button.delete span.dashicons{font-size:1rem;vertical-align:middle}table.gp-table div.progress-notice{font-size:.75em;font-style:italic;white-space:nowrap}table.gp-table td span.unknown{color:var(--gp-color-fg-muted);font-style:italic;text-align:center;vertical-align:middle}table.gp-table.gp-toolbox.tools-glossaries,table.gp-table.gp-toolbox.tools-meta,table.gp-table.gp-toolbox.tools-originals,table.gp-table.gp-toolbox.tools-permission-admin,table.gp-table.gp-toolbox.tools-permission-other,table.gp-table.gp-toolbox.tools-permission-validator,table.gp-table.gp-toolbox.tools-translation-sets,table.gp-table.gp-toolbox.tools-translations{width:auto}table.gp-table.translation-sets tbody tr td.stats:not(.percent){background-color:var(--gp-color-secondary-100)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight a{opacity:1}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.translated{background-color:var(--gp-color-status-current-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.fuzzy{background-color:var(--gp-color-status-fuzzy-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.untranslated{background-color:inherit}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.waiting{background-color:var(--gp-color-status-waiting-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.old{background-color:var(--gp-color-status-old-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.rejected{background-color:var(--gp-color-status-rejected-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.changesrequested{background-color:var(--gp-color-status-changesrequested-subtle)}table.gp-table.translation-sets tbody tr td.stats:not(.percent).highlight.warnings{background-color:inherit}table.gp-table.translation-sets tbody tr td.stats.changesrequested div.progress-notice,table.gp-table.translation-sets tbody tr td.stats.old div.progress-notice,table.gp-table.translation-sets tbody tr td.stats.rejected div.progress-notice{font-size:.75em;font-style:italic;white-space:nowrap}table.gp-table.translation-sets tbody tr td.stats.changesrequested a,table.gp-table.translation-sets tbody tr td.stats.changesrequested button,table.gp-table.translation-sets tbody tr td.stats.old a,table.gp-table.translation-sets tbody tr td.stats.old button,table.gp-table.translation-sets tbody tr td.stats.rejected a,table.gp-table.translation-sets tbody tr td.stats.rejected button{display:inline-block}table.gp-table.translation-sets tbody tr td.stats.changesrequested a.hidden,table.gp-table.translation-sets tbody tr td.stats.changesrequested button.hidden,table.gp-table.translation-sets tbody tr td.stats.old a.hidden,table.gp-table.translation-sets tbody tr td.stats.old button.hidden,table.gp-table.translation-sets tbody tr td.stats.rejected a.hidden,table.gp-table.translation-sets tbody tr td.stats.rejected button.hidden{display:none}table.gp-table.translation-sets tbody tr td.stats.changesrequested a,table.gp-table.translation-sets tbody tr td.stats.old a,table.gp-table.translation-sets tbody tr td.stats.rejected a{padding:0 1rem;width:100%}table.gp-table.translation-sets tbody tr td.stats.changesrequested button.delete,table.gp-table.translation-sets tbody tr td.stats.old button.delete,table.gp-table.translation-sets tbody tr td.stats.rejected button.delete{position:absolute;translate:-1rem}table.gp-table.tools-permission-validator tr.duplicate{background-color:var(--gp-color-attention-emphasis)}table.gp-table.tools-permission-validator tr.duplicate td.action span.duplicate{background-color:#fff;border:1px solid var(--gp-color-bubble-inactive-project-text);border-radius:1em;color:var(--gp-color-bubble-inactive-project-text);font-size:80%;font-weight:500;margin-left:.2rem;padding:.2em .5em;text-align:center;text-decoration:none;text-shadow:none}section.gp-toolbox{margin-top:2rem}.notice.notice-info{background-color:var(--gp-color-primary-50)}div.gp-heading div.gp-toolbox-tools{margin-left:auto}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link{font-size:1.125rem;font-weight:600}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link.current{text-decoration:underline}div.gp-heading div.gp-toolbox-tools a.gp-toolbox-tool-link.current:hover{text-decoration-thickness:.125rem}.tablesorter-glotpress .tablesorter-header:not(.sorter-false){padding-left:1em;padding-right:2.5em}table.gp-toolbox.tools-glossaries td.entries,table.gp-toolbox.tools-glossaries td.id:not(.unknown),td.stats{text-align:center}table.gp-toolbox.tools-glossaries td.entries a{color:var(--gp-color-fg-default);display:block;font-weight:600;text-decoration:none}table.gp-toolbox.tools-glossaries td.entries a:focus,table.gp-toolbox.tools-glossaries td.entries a:hover{text-decoration:underline;text-decoration-thickness:.125rem;text-underline-offset:.1em;text-underline-position:under}table.gp-table tbody td,table.gp-table tbody th{padding:.5em 2em}.gptoolbox-description code,.gptoolbox-description span.translation-status{padding:0 4px}.gptoolbox-description span.translation-status.current{background-color:var(--gp-color-status-current-subtle)}.gptoolbox-description span.translation-status.fuzzy{background-color:var(--gp-color-status-fuzzy-subtle)}.gptoolbox-description span.translation-status.waiting{background-color:var(--gp-color-status-waiting-subtle)}.gptoolbox-description span.translation-status.old{background-color:var(--gp-color-status-old-subtle)}.gptoolbox-description span.translation-status.rejected{background-color:var(--gp-color-status-rejected-subtle)}.gptoolbox-description span.translation-status.changesrequested{background-color:var(--gp-color-status-changesrequested-subtle)}.gptoolbox-description code{background-color:var(--gp-color-primary-50)}ul.gptoolbox-description{list-style:none;padding-left:.5rem}ul.gptoolbox-description li:before{color:var(--gp-color-primary);content:"\f147";font-family:dashicons;vertical-align:middle} /*# sourceMappingURL=assets\css\style.css.map */ \ No newline at end of file diff --git a/assets/css/style.scss b/assets/css/style.scss index a60938c..e748b09 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -54,7 +54,8 @@ table { &.gp-toolbox.tools-originals, &.gp-toolbox.tools-translation-sets, &.gp-toolbox.tools-translations, - &.gp-toolbox.tools-glossaries { + &.gp-toolbox.tools-glossaries, + &.gp-toolbox.tools-meta { width: auto; } diff --git a/gp-templates/gptoolbox-meta.php b/gp-templates/gptoolbox-meta.php new file mode 100644 index 0000000..accb659 --- /dev/null +++ b/gp-templates/gptoolbox-meta.php @@ -0,0 +1,202 @@ + esc_html__( 'Tools', 'gp-toolbox' ), + '/tools/meta/' => esc_html__( 'Meta', 'gp-toolbox' ), +); + +// Get GlotPress page title. +Toolbox::page_title( $breadcrumbs ); + +// Get GlotPress breadcrumbs. +Toolbox::page_breadcrumbs( $breadcrumbs ); + +// Load GlotPress Header template. +gp_tmpl_header(); + +$args = array( + 'title' => esc_html__( 'Meta', 'gp-toolbox' ), // Page title. + 'description' => esc_html__( 'Overview of all Meta.', 'gp-toolbox' ), // Page description. +); + +// Load GP-Toolbox header template. +gp_tmpl_load( 'gptoolbox-header', $args ); + +?> +

+ object_id. If there is no parent Object in the database with the same ID, then the Meta is orphaned.', 'gp-toolbox' ) ); + ?> +

+all(); + +// Get GlotPress Meta entries. +$gp_meta = array(); +foreach ( GP::$meta->all() as $meta ) { + $gp_meta[ $meta->meta_id ] = $meta; +} + +// Get GlotPress glossaries. +$gp_glossaries = array(); +foreach ( GP::$glossary->all() as $glossary ) { + $gp_glossaries[ $glossary->id ] = $glossary; +} + +// Get GlotPress glossary entries. +$gp_glossary_entries = array(); +foreach ( GP::$glossary_entry->all() as $glossary_entry ) { + $gp_glossary_entries[ $glossary_entry->id ] = $glossary_entry; +} + +// Get GlotPress permissions. +$gp_permissions = array(); +foreach ( GP::$permission->all() as $permission ) { + $gp_permissions[ $permission->id ] = $permission; +} + +// Get GlotPress translations. +$gp_translations = array(); +foreach ( GP::$translation->all() as $translation ) { + $gp_translations[ $translation->id ] = $translation; +} + +// Get GlotPress translation sets. +$gp_translation_sets = array(); +foreach ( GP::$translation_set->all() as $translation_set ) { + $gp_translation_sets[ $translation_set->id ] = $translation_set; +} + +// Get GlotPress projects. +$gp_projects = array(); +foreach ( GP::$project->all() as $project ) { + $gp_projects[ $project->id ] = $project; +} + +// Get GlotPress originals. +$gp_originals = array(); +foreach ( GP::$original->all() as $original ) { + $gp_originals[ $original->id ] = $original; +} + +/* +$orphaned_meta = array(); +foreach ( $gp_meta as $meta ) { + if ( ! isset( $gp_projects[ $meta->project_id ] ) ) { + $orphaned_meta[ $meta->project_id ][ $meta->meta_id ] = $meta; + } +} +*/ + +// TODO: Allow delete Meta entries. + +?> +
+ +

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + project_id ] ?? false; + + // Check if project is known. Double check for GP_Project object. + if ( ! $project ) { + // Unknown project. + + ?> + + + + + + + +
meta_id ) ); ?>object_type ) ); ?>object_id ) ); ?>meta_key ) ); ?>meta_value ) ); ?> + + project_id ) + ) + ); + ?> + + + name ) ); + ?> +
+ +
+ +

+ +

+ + +prepend( '/tools/permissions', array( __NAMESPACE__ . '\Routes\Permissions', 'get_route' ) ); GP::$router->prepend( '/tools/translations', array( __NAMESPACE__ . '\Routes\Translations', 'get_route' ) ); GP::$router->prepend( '/tools/translation-sets', array( __NAMESPACE__ . '\Routes\Translation_Sets', 'get_route' ) ); + GP::$router->prepend( '/tools/meta', array( __NAMESPACE__ . '\Routes\Meta', 'get_route' ) ); GP::$router->prepend( '/tools/about', array( __NAMESPACE__ . '\Routes\About', 'get_route' ) ); } @@ -682,13 +683,13 @@ public static function tools_pages() { 'title' => esc_html__( 'Glossaries', 'gp-toolbox' ), 'tools_section' => 'gptoolbox-tools-glossaries', ), - /* phpcs:ignore // GP Meta tools. 'tools_meta' => array( 'url' => '/tools/meta/', 'title' => esc_html__( 'Meta', 'gp-toolbox' ), 'tools_section' => 'gptoolbox-tools-meta', ), + /* phpcs:ignore // GP Locales tools. 'tools_locales' => array( 'url' => '/tools/locales/', diff --git a/includes/routes/class-meta.php b/includes/routes/class-meta.php new file mode 100644 index 0000000..ddb1e4a --- /dev/null +++ b/includes/routes/class-meta.php @@ -0,0 +1,43 @@ +