diff --git a/config/schema/draggableviews.views.schema.yml b/config/schema/draggableviews.views.schema.yml new file mode 100644 index 0000000..acf32bd --- /dev/null +++ b/config/schema/draggableviews.views.schema.yml @@ -0,0 +1,24 @@ +views.field.draggable_views_field: + type: views_field + label: 'Draggable Views Field' + mapping: + action_title: + type: label + label: 'Action title' + include_exclude: + type: string + label: 'Available actions' + selected_actions: + type: string + label: 'Available actions' + +views.sort.draggable_views_sort_default: + type: views_sort + label: 'Draggableviews Sort Default' + mapping: + draggable_views_reference: + type: string + label: 'Views Reference' + draggable_views_null_order: + type: string + label: 'NUll stacking order' diff --git a/draggableviews.module b/draggableviews.module index dd34ff0..7c0ea07 100644 --- a/draggableviews.module +++ b/draggableviews.module @@ -25,7 +25,8 @@ function draggableviews_views_data_alter(&$data) { 'id' => 'numeric', ], 'sort' => [ - 'id' => 'standard', + 'id' => 'draggable_views_sort_default', + 'help' => t('Sort by the weight value.'), ], 'filter' => [ 'help' => t('Filter by the draggableviews weight value (Native handler only).'), @@ -219,30 +220,3 @@ function draggableviews_views_submit(&$form, FormStateInterface $form_state) { drupal_set_message(t('There was an error while saving the data. Please, try gain.'), 'warning'); } } - -/** - * Implements hook_views_query_alter(). - */ -function draggableviews_views_query_alter(ViewExecutable $view, QueryPluginBase $query) { - // Add additional `join condition` for fixing table join. - // Cannot add it in the draggableviews_views_data_alter because we need view - // data. - if ($query instanceof Sql && isset($query->getTableQueue()['draggableviews_structure'])) { - /** @var \Drupal\views\Plugin\views\join\Standard $join */ - $join = $query->getTableQueue()['draggableviews_structure']['join']; - $join->extra = [ - [ - 'field' => 'view_name', - 'operator' => '=', - 'value' => $view->id(), - 'numeric' => FALSE, - ], - [ - 'field' => 'view_display', - 'operator' => '=', - 'value' => $view->current_display, - 'numeric' => FALSE, - ], - ]; - } -} diff --git a/modules/draggableviews_demo/config/install/views.view.draggableviews_demo.yml b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo.yml index 4bb7c4d..a2f97ca 100644 --- a/modules/draggableviews_demo/config/install/views.view.draggableviews_demo.yml +++ b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo.yml @@ -8,8 +8,6 @@ dependencies: - draggableviews - node - user -_core: - default_config_hash: jNovwA94yRL5frztAOmdSCWDJHEa4UJhryQKRWYwJ98 id: draggableviews_demo label: 'Draggableviews Demo' module: views @@ -229,7 +227,7 @@ display: decimal: . separator: ',' format_plural: false - format_plural_string: "1\x03@count" + format_plural_string: !!binary MQNAY291bnQ= prefix: '' suffix: '' plugin_id: numeric @@ -296,8 +294,10 @@ display: order: ASC exposed: false expose: - label: '' - plugin_id: standard + label: 'DraggableViews Weight' + draggable_views_reference: this + draggable_views_null_order: after + plugin_id: draggable_views_sort_default created: id: created table: node_field_data @@ -336,7 +336,7 @@ display: position: 1 display_options: display_extenders: { } - path: draggableviews-demo + path: draggableviews-demo/simple display_description: '' fields: title: @@ -439,12 +439,417 @@ display: decimal: . separator: ',' format_plural: false - format_plural_string: "1\x03@count" + format_plural_string: !!binary MQNAY291bnQ= prefix: '' suffix: '' plugin_id: numeric defaults: fields: false + sorts: false + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: 'DraggableViews Weight' + draggable_views_reference: 'draggableviews_demo:draggableviews_demo_order' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_display_content: + display_plugin: page + id: draggableviews_demo_display_content + display_title: 'Display Page - Rendered Content' + position: 1 + display_options: + display_extenders: { } + path: draggableviews-demo/rendered-content + display_description: '' + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + defaults: + fields: false + sorts: false + style: false + row: false + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: 'DraggableViews Weight' + draggable_views_reference: 'draggableviews_demo:draggableviews_demo_order' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + style: + type: default + options: { } + row: + type: 'entity:node' + options: + relationship: none + view_mode: teaser + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_display_reversed: + display_plugin: page + id: draggableviews_demo_display_reversed + display_title: 'Display Page - Reversed' + position: 1 + display_options: + display_extenders: { } + path: draggableviews-demo/reversed + display_description: '' + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + label: 'DraggableViews Weight' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + set_precision: false + precision: 0 + decimal: . + separator: ',' + format_plural: false + format_plural_string: !!binary MQNAY291bnQ= + prefix: '' + suffix: '' + plugin_id: numeric + defaults: + fields: false + sorts: false + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: 'DraggableViews Weight' + draggable_views_reference: 'draggableviews_demo:page_2' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_display_reversed_content: + display_plugin: page + id: draggableviews_demo_display_reversed_content + display_title: 'Display Page - Reversed Rendered Content' + position: 1 + display_options: + display_extenders: { } + path: draggableviews-demo/reversed-rendered-content + display_description: '' + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + defaults: + fields: false + sorts: false + style: false + row: false + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: 'DraggableViews Weight' + draggable_views_reference: 'draggableviews_demo:page_2' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + created: + id: created + table: node_field_data + field: created + order: DESC + entity_type: node + entity_field: created + plugin_id: date + relationship: none + group_type: group + admin_label: '' + exposed: false + expose: + label: '' + granularity: second + style: + type: default + options: { } + row: + type: 'entity:node' + options: + relationship: none + view_mode: teaser cache_metadata: max-age: -1 contexts: @@ -461,7 +866,7 @@ display: position: 2 display_options: display_extenders: { } - path: draggableviews-demo/order + path: draggableviews-demo/simple/order menu: type: tab title: 'Order Draggableviews Demo' @@ -517,3 +922,67 @@ display: - 'user.node_grants:view' - user.permissions tags: { } + draggableviews_demo_order_reversed: + display_plugin: page + id: draggableviews_demo_order_reversed + display_title: 'Order Page - Reverse' + position: 2 + display_options: + display_extenders: { } + path: draggableviews-demo/reversed/order-reverse + menu: + type: tab + title: 'Order Draggableviews Demo' + description: '' + expanded: false + parent: '' + weight: 0 + context: '0' + menu_name: main + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + override: true + sticky: false + caption: '' + summary: '' + description: '' + columns: + title: title + info: + title: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + default: '-1' + empty_table: false + defaults: + style: false + row: false + title: false + access: false + row: + type: 'entity:node' + options: + view_mode: teaser + title: 'Draggableviews Demo Order Page - Revers' + access: + type: perm + options: + perm: 'access draggableviews' + display_description: '' + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } diff --git a/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_complex.yml b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_complex.yml new file mode 100644 index 0000000..d168a34 --- /dev/null +++ b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_complex.yml @@ -0,0 +1,1086 @@ +langcode: en +status: true +dependencies: + config: + - node.type.draggableviews_demo + module: + - draggableviews + - node + - user +id: draggableviews_demo_complex +label: 'Draggable Views Demo (Complex)' +module: views +description: 'Combine Two different Sorts into one view. Example: Sorted Featured content on top of sorted normal content.' +tag: '' +base_table: node_field_data +base_field: nid +core: 8.x +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + options: { } + query: + type: views_query + options: + disable_sql_rewrite: false + distinct: false + replica: false + query_comment: '' + query_tags: { } + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + pager: + type: mini + options: + items_per_page: 10 + offset: 0 + id: 0 + total_pages: null + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + tags: + previous: ‹‹ + next: ›› + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + draggableviews: + id: draggableviews + table: node_field_data + field: draggableviews + relationship: none + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + action_title: Action + include_exclude: exclude + selected_actions: null + entity_type: node + entity_field: nid + plugin_id: draggable_views_field + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + label: Promoted + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: boolean + settings: + format: yes-no + format_custom_true: '' + format_custom_false: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + entity_type: node + entity_field: promote + plugin_id: field + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + label: 'Draggable Weight' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + set_precision: false + precision: 0 + decimal: . + separator: ',' + format_plural: false + format_plural_string: !!binary MQNAY291bnQ= + prefix: '' + suffix: '' + plugin_id: numeric + filters: + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + operator: in + value: + draggableviews_demo: draggableviews_demo + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: type + plugin_id: bundle + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: 'draggableviews_demo_complex:draggableviews_demo_order_featured' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + weight_1: + id: weight_1 + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: 'draggableviews_demo_complex:draggableviews_demo_order_standard' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + header: { } + footer: { } + empty: { } + relationships: { } + arguments: { } + display_extenders: { } + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_display_complex: + display_plugin: page + id: draggableviews_demo_display_complex + display_title: 'Display Page Complex' + position: 3 + display_options: + display_extenders: { } + display_description: '' + path: draggableviews-demo-complex + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + label: Promoted + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: boolean + settings: + format: yes-no + format_custom_true: '' + format_custom_false: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + entity_type: node + entity_field: promote + plugin_id: field + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + label: 'Draggable Weight' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + set_precision: false + precision: 0 + decimal: . + separator: ',' + format_plural: false + format_plural_string: !!binary MQNAY291bnQ= + prefix: '' + suffix: '' + plugin_id: numeric + defaults: + fields: false + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_order_featured: + display_plugin: page + id: draggableviews_demo_order_featured + display_title: 'Order Featured Content Page' + position: 1 + display_options: + display_extenders: { } + display_description: '' + path: draggableviews-demo-complex/sort-featured + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + override: true + sticky: false + caption: '' + summary: '' + description: '' + columns: + title: title + draggableviews: draggableviews + promote: promote + weight: weight + info: + title: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + draggableviews: + align: '' + separator: '' + empty_column: false + responsive: '' + promote: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + weight: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + default: '-1' + empty_table: false + defaults: + style: false + row: false + filters: false + filter_groups: false + sorts: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + filters: + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + operator: in + value: + draggableviews_demo: draggableviews_demo + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: type + plugin_id: bundle + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: promote + plugin_id: boolean + filter_groups: + operator: AND + groups: + 1: AND + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: 'this' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + draggableviews_demo_order_standard: + display_plugin: page + id: draggableviews_demo_order_standard + display_title: 'Order Standard Content Page' + position: 1 + display_options: + display_extenders: { } + display_description: '' + path: draggableviews-demo-complex/sort-standard + filters: + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + operator: in + value: + draggableviews_demo: draggableviews_demo + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: type + plugin_id: bundle + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + operator: '=' + value: '0' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: promote + plugin_id: boolean + defaults: + filters: false + filter_groups: false + style: false + row: false + fields: false + sorts: false + filter_groups: + operator: AND + groups: + 1: AND + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + override: true + sticky: false + caption: '' + summary: '' + description: '' + columns: + title: title + draggableviews: draggableviews + info: + title: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + draggableviews: + align: '' + separator: '' + empty_column: false + responsive: '' + default: '-1' + empty_table: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + draggableviews: + id: draggableviews + table: node_field_data + field: draggableviews + relationship: none + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + action_title: Action + include_exclude: exclude + selected_actions: null + entity_type: node + entity_field: nid + plugin_id: draggable_views_field + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + label: 'Promoted to front page' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: boolean + settings: + format: default + format_custom_true: '' + format_custom_false: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + entity_type: node + entity_field: promote + plugin_id: field + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: this + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } diff --git a/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_null_order_test.yml b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_null_order_test.yml new file mode 100644 index 0000000..9154dda --- /dev/null +++ b/modules/draggableviews_demo/config/install/views.view.draggableviews_demo_null_order_test.yml @@ -0,0 +1,434 @@ +langcode: en +status: true +dependencies: + config: + - node.type.draggableviews_demo + module: + - draggableviews + - node + - user +id: draggableviews_demo_null_order_test +label: 'Draggable Views Demo (Null Order Test)' +module: views +description: 'Combine Two different Sorts into one view. Example: Sorted Featured content on top of sorted normal content.' +tag: '' +base_table: node_field_data +base_field: nid +core: 8.x +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + options: { } + query: + type: views_query + options: + disable_sql_rewrite: false + distinct: false + replica: false + query_comment: '' + query_tags: { } + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + pager: + type: mini + options: + items_per_page: 10 + offset: 0 + id: 0 + total_pages: null + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + tags: + previous: ‹‹ + next: ›› + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: fields + options: + inline: { } + separator: '' + hide_empty: false + default_field_elements: true + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + label: '' + alter: + alter_text: false + make_link: false + absolute: false + trim: false + word_boundary: false + ellipsis: false + strip_tags: false + html: false + hide_empty: false + empty_zero: false + settings: + link_to_entity: true + plugin_id: field + relationship: none + group_type: group + admin_label: '' + exclude: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_alter_empty: true + click_sort_column: value + type: string + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + draggableviews: + id: draggableviews + table: node_field_data + field: draggableviews + relationship: none + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + action_title: Action + include_exclude: exclude + selected_actions: null + entity_type: node + entity_field: nid + plugin_id: draggable_views_field + promote: + id: promote + table: node_field_data + field: promote + relationship: none + group_type: group + admin_label: '' + label: Promoted + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: boolean + settings: + format: yes-no + format_custom_true: '' + format_custom_false: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + entity_type: node + entity_field: promote + plugin_id: field + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + label: 'Draggable Weight' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + set_precision: false + precision: 0 + decimal: . + separator: ',' + format_plural: false + format_plural_string: !!binary MQNAY291bnQ= + prefix: '' + suffix: '' + plugin_id: numeric + filters: + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + operator: in + value: + draggableviews_demo: draggableviews_demo + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: type + plugin_id: bundle + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: 'draggableviews_demo_complex:draggableviews_demo_order_featured' + draggable_views_null_order: before + plugin_id: draggable_views_sort_default + header: { } + footer: { } + empty: { } + relationships: { } + arguments: { } + display_extenders: { } + title: 'Null Order Before' + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + display_null_after: + display_plugin: page + id: display_null_after + display_title: 'Display Page - Null Order After' + position: 1 + display_options: + display_extenders: { } + display_description: '' + path: draggableviews-demo-complex/null-after + sorts: + weight: + id: weight + table: draggableviews_structure + field: weight + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + draggable_views_reference: 'draggableviews_demo_complex:draggableviews_demo_order_featured' + draggable_views_null_order: after + plugin_id: draggable_views_sort_default + defaults: + sorts: false + title: false + title: 'Null Order After' + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + display_null_before: + display_plugin: page + id: display_null_before + display_title: 'Display Page - Null Order Before' + position: 1 + display_options: + display_extenders: { } + display_description: '' + path: draggableviews-demo-complex/null-before + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } diff --git a/src/Plugin/views/sort/DraggableViewsSort.php b/src/Plugin/views/sort/DraggableViewsSort.php new file mode 100644 index 0000000..bade307 --- /dev/null +++ b/src/Plugin/views/sort/DraggableViewsSort.php @@ -0,0 +1,193 @@ + '']; + $options['draggable_views_null_order'] = ['default' => 'after']; + return $options; + } + + /** + * {@inheritdoc} + */ + public function buildOptionsForm(&$form, FormStateInterface $form_state) { + parent::buildOptionsForm($form, $form_state); + + $view_options = $this->getViewSortDataOptions(); + + $form['draggable_views_reference'] = [ + '#type' => 'select', + '#title' => $this->t('Draggable Views Data'), + '#options' => $view_options, + '#description' => $this->t('Draggable Views Data to sort on.'), + '#default_value' => $this->options['draggable_views_reference'], + '#weight' => -1, + ]; + + $form['draggable_views_null_order'] = [ + '#type' => 'radios', + '#title' => $this->t('NULL Value Order'), + '#options' => [ + 'before' => "Before", + 'after' => "After", + ], + '#description' => $this->t('If an entity does not currently belong in the list, should it be added to the list at the begining or the end.'), + '#default_value' => $this->options['draggable_views_null_order'], + '#weight' => -1, + ]; + } + + /** + * Called to add the sort to a query. + */ + public function query() { + + // We should variablise these somehow?? + $base = 'draggableviews_structure'; + $base_field = "entity_id"; + + // Grab our view/plugin reference. + list($view_id, $view_display_id) = $this->splitViewSortDataOptions($this->options['draggable_views_reference']); + + $def = $this->definition; + $def['table'] = $base; + $def['field'] = $base_field; + $def['left_table'] = $this->query->view->storage->get('base_table'); + $def['left_field'] = $this->query->view->storage->get('base_field'); + $def['adjusted'] = TRUE; + + $def['extra'][] = [ + 'field' => 'view_name', + 'value' => $view_id, + ]; + $def['extra'][] = [ + 'field' => 'view_display', + 'value' => $view_display_id, + ]; + + if (!empty($this->definition['extra'])) { + $def['extra'] = $this->definition['extra']; + } + + if (!empty($def['join_id'])) { + $id = $def['join_id']; + } + else { + $id = 'draggableviews_with_args'; + } + $join = Views::pluginManager('join')->createInstance($id, $def); + + // Use a short alias for this: + $alias = $def['table']; + + $this->alias = $this->query->addRelationship($alias, $join, $this->query->view->storage->get('base_table'), $this->relationship); + + if ($this->options['draggable_views_null_order'] == "before") { + $formula = "!ISNULL($this->alias.$this->realField)"; + } + else { + $formula = "ISNULL($this->alias.$this->realField)"; + } + + // We add both to handle ordering of NULL values. + $this->query->addOrderBy(NULL, $formula, $this->options['order'], $this->alias . "_" . $this->realField); + $this->query->addOrderBy($this->alias, $this->realField, $this->options['order']); + } + + /** + * Grab available draggable views. + */ + protected function getViewSortDataOptions() { + $view_data = []; + $query = \Drupal::entityQuery('view'); + $entity_ids = $query->execute(); + + foreach ($entity_ids as $view_id) { + $v = View::load($view_id); + + $default_display = NULL; + foreach ($v->get('display') as $display_id => $display) { + if ($display_id == "default") { + $default_display = $display; + } + else { + // Use default if fields are not overwritten. + $fields = !empty($display['display_options']['fields']) + ? $display['display_options']['fields'] + : $default_display['display_options']['fields']; + // Need to check that "fields" is an array, view may be configured to + // render rows otherwise. + if (is_array($fields) && in_array("draggableviews", array_keys($fields))) { + if (!isset($view_data[$view_id])) { + $view_data[$view_id] = [ + 'id' => $view_id, + 'label' => $v->label(), + 'displays' => [], + ]; + } + $view_data[$view_id]['displays'][$display_id] = [ + 'id' => $display_id, + 'label' => $display['display_title'], + ]; + } + } + } + } + + $view_select = [ + 'this' => "This View/Display", + ]; + foreach ($view_data as $view_id => $v_data) { + $view_key = $v_data['label'] . " (" . $view_id . ")"; + $view_select[$view_key] = []; + + foreach ($v_data['displays'] as $display) { + $display_key = $view_id . ":" . $display['id']; + + $view_select[$view_key][$display_key] = $display['label']; + } + } + + return $view_select; + } + + /** + * Split data into view/display ids. + */ + protected function splitViewSortDataOptions($data) { + if ($data == "this") { + return [$this->view->id(), $this->view->current_display]; + } + + $explode = explode(":", $data); + if (count($explode) != 2) { + return ["", ""]; + } + return $explode; + } + +} diff --git a/tests/src/Functional/DraggableviewsTest.php b/tests/src/Functional/DraggableviewsTest.php index ee3c1fd..1155b32 100644 --- a/tests/src/Functional/DraggableviewsTest.php +++ b/tests/src/Functional/DraggableviewsTest.php @@ -10,6 +10,9 @@ use Drupal\Tests\BrowserTestBase; * @group draggableviews */ class DraggableviewsTest extends BrowserTestBase { + + use \Drupal\Core\StringTranslation\StringTranslationTrait; + /** * Modules to enable. * @@ -29,6 +32,20 @@ class DraggableviewsTest extends BrowserTestBase { */ protected $profile = 'minimal'; + /** + * The nodes geenerated at creation. + * + * @var array + */ + protected $generatedNodes = []; + + /** + * Mock database connection. + * + * @var \Drupal\Core\Database\Connection + */ + protected $database; + /** * {@inheritdoc} */ @@ -54,9 +71,14 @@ class DraggableviewsTest extends BrowserTestBase { $node = $this->drupalCreateNode([ 'type' => 'draggableviews_demo', 'title' => $datumContent[0], + 'promote' => $datumContent[2], ]); $node->save(); + + $this->generatedNodes[] = $node; } + + $this->setOrdering(); } /** @@ -72,22 +94,52 @@ class DraggableviewsTest extends BrowserTestBase { [ 'Draggable Content 1', 'Draggable Content Body 1', + FALSE, ], [ 'Draggable Content 2', 'Draggable Content Body 2', + FALSE, ], [ 'Draggable Content 3', 'Draggable Content Body 3', + FALSE, ], [ 'Draggable Content 4', 'Draggable Content Body 4', + FALSE, ], [ 'Draggable Content 5', 'Draggable Content Body 5', + FALSE, + ], + [ + 'Draggable Content 6', + 'Draggable Content Body 6', + TRUE, + ], + [ + 'Draggable Content 7', + 'Draggable Content Body 7', + TRUE, + ], + [ + 'Draggable Content 8', + 'Draggable Content Body 8', + TRUE, + ], + [ + 'Draggable Content 9', + 'Draggable Content Body 9', + TRUE, + ], + [ + 'Draggable Content 10', + 'Draggable Content Body 10', + TRUE, ], ]; } @@ -98,26 +150,202 @@ class DraggableviewsTest extends BrowserTestBase { public function testDraggableviewsContent() { $assert_session = $this->assertSession(); - $this->drupalGet('draggableviews-demo'); + $this->drupalGet('draggableviews-demo/simple'); $this->assertSession()->statusCodeEquals(200); // Verify that anonymous useres cannot access the order page. - $this->drupalGet('draggableviews-demo/order'); + $this->drupalGet('draggableviews-demo/simple/order'); $this->assertSession()->statusCodeEquals(403); // Verify that authorized user has access to display page. $this->drupalLogin($this->adminUser); - $this->drupalGet('draggableviews-demo'); + $this->drupalGet('draggableviews-demo/simple'); $this->assertSession()->statusCodeEquals(200); // Verify that the page contains generated content. $assert_session->pageTextContains(t('Draggable Content 4')); // Verify that authorized user has access to order page. - $this->drupalGet('draggableviews-demo/order'); + $this->drupalGet('draggableviews-demo/simple/order'); $this->assertSession()->statusCodeEquals(200); // Verify that the page contains generated content. $assert_session->pageTextContains(t('Draggable Content 5')); } + /** + * Test Draggable views from a visual perspective. + */ + public function testDraggableviewsComplexVisual() { + $this->assertSession(); + $this->drupalLogin($this->adminUser); + + // Promoted. + $this->drupalGet('draggableviews-demo-complex/sort-featured'); + $this->assertSession()->statusCodeEquals(200); + + $this->assertSession()->pageTextContains("Draggable Content 10"); + $this->assertSession()->pageTextNotContains("Draggable Content 2"); + + $this->assertSession()->hiddenFieldValueEquals( + 'draggableviews[0][id]', + $this->generatedNodes[9]->id() + ); + + // Normal. + $this->drupalGet('draggableviews-demo-complex/sort-standard'); + $this->assertSession()->statusCodeEquals(200); + + $this->assertSession()->pageTextContains("Draggable Content 3"); + $this->assertSession()->pageTextNotContains("Draggable Content 7"); + + $this->assertSession()->hiddenFieldValueEquals( + 'draggableviews[0][id]', + $this->generatedNodes[0]->id() + ); + + $this->drupalGet('draggableviews-demo-complex'); + $this->assertSession()->pageTextMatches('/(Draggable Content 7).*(Draggable Content 6).*(Draggable Content 1).*(Draggable Content 2)/'); + + // Check Before Ordering. + $this->drupalGet('draggableviews-demo-complex/null-before'); + $this->assertSession()->pageTextMatches('/(Draggable Content 2).*(Draggable Content 10).*(Draggable Content 9).*(Draggable Content 8)/'); + + // Check After Ordering. + $this->drupalGet('draggableviews-demo-complex/null-after'); + $this->assertSession()->pageTextMatches('/(Draggable Content 10).*(Draggable Content 9).*(Draggable Content 8).*(Draggable Content 2)/'); + } + + /** + * Test Draggable views from a data perspective. + */ + public function testDraggableviewsComplexData() { + $this->assertSession(); + $this->drupalLogin($this->adminUser); + + // Promoted. + $view_results = views_get_view_result('draggableviews_demo_complex', 'draggableviews_demo_order_featured'); + $this->assertEquals(5, count($view_results), "We are expecting 5 items in this view. Got: " . count($view_results)); + + for ($i = 0; $i <= 4; $i++) { + $view_nid = $view_results[$i]->_entity->id(); + $expected_nid = $this->generatedNodes[(9 - $i)]->id(); + $this->assertEquals($expected_nid, $view_nid, "Expected $expected_nid and got: $view_nid"); + } + + // Standard. + $view_results = views_get_view_result('draggableviews_demo_complex', 'draggableviews_demo_order_standard'); + $this->assertEquals(5, count($view_results), "We are expecting 5 items in this view. Got: " . count($view_results)); + + for ($i = 0; $i <= 4; $i++) { + $view_nid = $view_results[$i]->_entity->id(); + $expected_nid = $this->generatedNodes[$i]->id(); + $this->assertEquals($expected_nid, $view_nid, "Expected $expected_nid and got: $view_nid"); + } + + // Check Before Ordering. + $view_results = views_get_view_result('draggableviews_demo_null_order_test', 'display_null_before'); + $this->assertEquals(10, count($view_results), "We are expecting 5 items in this view. Got: " . count($view_results)); + + for ($i = 0; $i <= 9; $i++) { + $view_nid = $view_results[$i]->_entity->id(); + if ($i >= 5) { + $expected_nid = $this->generatedNodes[(9 - ($i - 5))]->id(); + } + else { + $expected_nid = $this->generatedNodes[$i]->id(); + } + + $this->assertEquals($expected_nid, $view_nid, "Bi: $i :: Expected $expected_nid and got: $view_nid"); + } + + // Check After Ordering. + $view_results = views_get_view_result('draggableviews_demo_null_order_test', 'display_null_after'); + $this->assertEquals(10, count($view_results), "We are expecting 5 items in this view. Got: " . count($view_results)); + + for ($i = 0; $i <= 9; $i++) { + $view_nid = $view_results[$i]->_entity->id(); + if ($i >= 5) { + $expected_nid = $this->generatedNodes[($i - 5)]->id(); + } + else { + $expected_nid = $this->generatedNodes[(9 - $i)]->id(); + } + + $this->assertEquals($expected_nid, $view_nid, "Ai: $i :: Expected $expected_nid and got: $view_nid"); + } + } + + /** + * Set draggableviews ordering. + */ + protected function setOrdering() { + // Set weight values. + $this->rebuildContainer(); + $connection = $this->container->get('database'); + + // Promoted nodes. + $weight = 0; + for ($i = 9; $i >= 5; $i--) { + $record = [ + 'view_name' => 'draggableviews_demo_complex', + 'view_display' => 'draggableviews_demo_order_featured', + 'args' => '[]', + 'entity_id' => $this->generatedNodes[$i]->id(), + 'weight' => $weight, + 'parent' => 0, + ]; + + $connection->insert('draggableviews_structure')->fields($record)->execute(); + $weight++; + } + + // Normal nodes. + $weight = 0; + for ($i = 0; $i <= 4; $i++) { + $record = [ + 'view_name' => 'draggableviews_demo_complex', + 'view_display' => 'draggableviews_demo_order_standard', + 'args' => '[]', + 'entity_id' => $this->generatedNodes[$i]->id(), + 'weight' => $weight, + 'parent' => 0, + ]; + + $connection->insert('draggableviews_structure')->fields($record)->execute(); + $weight++; + } + + // Full List. + $weight = 0; + for ($i = 0; $i <= 9; $i++) { + $record = [ + 'view_name' => 'draggableviews_demo', + 'view_display' => 'draggableviews_demo_order', + 'args' => '[]', + 'entity_id' => $this->generatedNodes[$i]->id(), + 'weight' => $weight, + 'parent' => 0, + ]; + + $connection->insert('draggableviews_structure')->fields($record)->execute(); + $weight++; + } + + // Full list reversed. + $weight = 0; + for ($i = 9; $i >= 0; $i--) { + $record = [ + 'view_name' => 'draggableviews_demo', + 'view_display' => 'draggableviews_demo_order_reversed', + 'args' => '[]', + 'entity_id' => $this->generatedNodes[$i]->id(), + 'weight' => $weight, + 'parent' => 0, + ]; + + $connection->insert('draggableviews_structure')->fields($record)->execute(); + $weight++; + } + } + }