Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion asklib.info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ core: 8.x
package: Kirjastot.fi
description: "Kysy kirjastonhoitajalta"
configure: asklib.admin
core_version_requirement: ">=8"
dependencies:
- autoslug
- finto_taxonomy
- forum
- kifiform
- kifimail
- symfony_mailer
- kifisearch
- kifistats
- language
Expand Down
4 changes: 2 additions & 2 deletions asklib.install
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;

function asklib_install() {
$em = Drupal::entityManager();
$em = \Drupal::service('entity_type.manager');

$em->getStorage('field_storage_config')->create([
'entity_type' => 'asklib_question',
Expand Down Expand Up @@ -58,7 +58,7 @@ function asklib_update_8002() {
$entity = \Drupal::entityTypeManager()->getStorage('entity_form_mode')->load('asklib_question.edit');
if(!$entity) {
// If not load and write the configuration to Drupal config.
$config_path = drupal_get_path('module', 'asklib') . '/config/install';
$config_path = \Drupal::service('extension.list.module')->getPath('asklib') . '/config/install';
$source = new FileStorage($config_path);
$config_storage = \Drupal::service('config.storage');
$config_storage->write('core.entity_form_mode.asklib_question.edit', $source->read('core.entity_form_mode.asklib_question.edit'));
Expand Down
3 changes: 3 additions & 0 deletions asklib.libraries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ question-edit-form:
js:
public/js/toggle-answered.js: {}
public/js/kifiform-tags-custom.js: {}
dependencies:
- core/jquery
- core/once
field-target-library:
css:
component:
Expand Down
99 changes: 77 additions & 22 deletions asklib.module
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<?php

use Drupal\asklib\Form\MailGroupTermForm;
use Drupal\asklib\Form\MailGroupUserForm;
use Drupal\Core\Database\Query\ConditionInterface;
use Drupal\Core\Extension\Extension;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Access\AccessResult;
Expand All @@ -24,6 +28,8 @@ use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\cache\CachePluginBase;
use Drupal\views\Plugin\views\query\QueryPluginBase;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\symfony_mailer\EmailInterface;
use Drupal\symfony_mailer\Exception\SkipMailException;

function asklib_theme() {
return [
Expand Down Expand Up @@ -85,13 +91,13 @@ function asklib_theme() {
function asklib_entity_type_build(array &$entity_types) {
if (isset($entity_types['taxonomy_term'])) {
$term = $entity_types['taxonomy_term'];
$term->setFormClass('asklib_admin', \Drupal\asklib\Form\MailGroupTermForm::class);
$term->setFormClass('asklib_admin', MailGroupTermForm::class);
$term->setLinkTemplate('asklib-mail-group-form', '/admin/config/asklib/emails/{taxonomy_term}');
}

if (isset($entity_types['user'])) {
$user = $entity_types['user'];
$user->setFormClass('asklib_admin', \Drupal\asklib\Form\MailGroupUserForm::class);
$user->setFormClass('asklib_admin', MailGroupUserForm::class);
$user->setLinkTemplate('asklib-mail-group-form', '/admin/config/asklib/emails/users/{user}');
}
}
Expand All @@ -112,8 +118,9 @@ function asklib_mail($key, &$message, $params) {
function asklib_cron() {
$day_limit = Drupal::config('asklib.settings')->get('reserved_window');
$date_limit = date('Y-m-d', strtotime(sprintf('-%d days', $day_limit)));
$storage = Drupal::entityManager()->getStorage('asklib_question');
$storage = \Drupal::service('entity_type.manager')->getStorage('asklib_question');
$qids = $storage->getQuery()
->accessCheck(FALSE)
->condition('state', QuestionInterface::STATE_RESERVED)
->execute();
$questions = $storage->loadMultiple($qids);
Expand Down Expand Up @@ -146,7 +153,7 @@ function _asklib_clear_old_question_contact_info()
{
$two_years_ago = mktime(1, 0, 0, date("m"), date("d"), date("Y") - 2);
$storage = \Drupal::entityTypeManager()->getStorage('asklib_question');
$query = $storage->getQuery();
$query = $storage->getQuery()->accessCheck(FALSE);
$info_not_cleared = $query->orConditionGroup()
->exists('email')
->condition('name', 'Kysyjätieto poistettu', '<>');
Expand Down Expand Up @@ -267,8 +274,9 @@ function asklib_views_query_alter(ViewExecutable $view, QueryPluginBase $query)
function asklib_bug_fix_rss_query(array &$conditions) {
foreach ($conditions as &$rule) {
if (is_array($rule)) {
if ($rule['field'] instanceof \Drupal\Core\Database\Query\ConditionInterface) {
asklib_bug_fix_rss_query($rule['field']->conditions());
if ($rule['field'] instanceof ConditionInterface) {
$conditions = $rule['field']->conditions();
asklib_bug_fix_rss_query($conditions);
} elseif (is_string($rule['field'])) {
if (trim($rule['field']) == 'asklib_question__feeds.feeds = :asklib_question__feeds_feeds') {
$rule['field'] = 'asklib_question__feeds.feeds_target_id = :asklib_question__feeds_feeds';
Expand All @@ -280,7 +288,8 @@ function asklib_bug_fix_rss_query(array &$conditions) {

function asklib_views_pre_execute(ViewExecutable $view) {
if ($view->storage->id() == 'asklib_rss') {
asklib_bug_fix_rss_query($view->build_info['query']->conditions());
$conditions = $view->build_info['query']->conditions();
asklib_bug_fix_rss_query($conditions);
}
}

Expand All @@ -306,6 +315,19 @@ function asklib_form_alter(&$form, FormStateInterface $form_state, $form_id) {
}
}

function asklib_form_asklib_question_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if (
isset($form['municipality']['widget']['#options']) &&
is_array($form['municipality']['widget']['#options'])
) {
$options = $form['municipality']['widget']['#options'];
uasort($options, function ($a, $b) {
return strcoll($a, $b); // Locale-aware string comparison
});
$form['municipality']['widget']['#options'] = $options;
}
}

function asklib_preprocess_views_view_table(&$variables) {
if ($variables['view']->id() != 'asklib_index') {
return;
Expand Down Expand Up @@ -390,6 +412,14 @@ function asklib_preprocess_asklib_question(&$variables) {
'resource' => 'https://www.kirjastot.fi/kysy/' . $variables['elements']['#asklib_question']->id(),
];

/**
* NOTE: These fields should be hidden from Drupal's built-in display management form.
* Currently, asklib does not provide one. Asklib question has only one view mode called "full".
* For future development, we could implement view support for asklib_question and asklib_answer.
*/
unset($variables['question']['municipality']);
unset($variables['question']['user']);

$variables['question']['title_meta'] = [
'#weight' => -1000,
'#theme' => 'rdf_metadata',
Expand Down Expand Up @@ -418,6 +448,9 @@ function asklib_preprocess_asklib_answer(&$variables) {
$variables['content'][$key] = $variables['elements'][$key];
}

// See the NOTE in asklib_preprocess_asklib_question about display managment.
unset($variables['content']['created']);

$view = Drupal::entityTypeManager()->getViewBuilder('asklib_question');
$displays = $variables['elements']['#asklib_answer']->getQuestion()->get('displays');
$rendered = $view->viewField($displays, $displays->getFieldDefinition()->getDisplayOptions('view'));
Expand Down Expand Up @@ -447,13 +480,25 @@ function asklib_form_comment_comment_asklib_form_alter(&$form, FormStateInterfac
$form['field_email']['widget'][0]['value']['#attributes']['autocomplete'] = 'email';
}

function asklib_user_login($account) {
$route_name = Drupal::routeMatch()->getRouteName();
/**
* Implements hook_form_FORM_ID_alter().
*/
function asklib_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
$form['#submit'][] = 'asklib_user_login_submit';
}

/**
* Form submission handler for user_login_form().
*
* Redirects the user to the asklib dashboard user can answer questions.
*/
function asklib_user_login_submit(&$form, FormStateInterface $form_state) {
$account = Drupal::currentUser();

// Redirect only when request comes from the login form.
if ($route_name == 'user.login' && $account->hasPermission('answer questions')) {
$url = Url::fromRoute('asklib.admin_index')->toString();
RedirectResponse::create($url)->send();
if ($account->hasPermission('answer questions')) {
$url = Url::fromRoute('asklib.admin_index');
$form_state->setRedirectUrl($url);
}
}

Expand All @@ -463,7 +508,7 @@ function asklib_user_update(UserInterface $user) {
}
}

function asklib_system_info_alter(array &$info, \Drupal\Core\Extension\Extension $file, $type) {
function asklib_system_info_alter(array &$info, Extension $file, $type) {
if ($type != 'theme' || !in_array($file->getName(), ['seven', 'kifi_admin'])) {
return;
}
Expand Down Expand Up @@ -560,7 +605,7 @@ function asklib_tokens($type, array $tokens, array $data, array $options, Bubble
}

if ($type == 'asklib_answer') {
$answer = isset($data['asklib_answer']) ? $data['asklib_answer'] : $data['asklib_question']->getAnswer();
$answer = $data['asklib_answer'] ?? $data['asklib_question']->getAnswer();

if ($answer) {
foreach ($tokens as $name => $original) {
Expand Down Expand Up @@ -615,12 +660,13 @@ function asklib_preprocess_html(array &$variables) {

if (!$user->get('field_asklib_library')->target_id) {
$url = Url::fromRoute('entity.user.asklib_mail_group_form', ['user' => $user->id()])->toString();
drupal_set_message(t('Changes to Ask a Librarian: Set your home library in <a href=":url">settings</a>.', [':url' => $url]), 'warning');
\Drupal::messenger()->addWarning(t('Changes to Ask a Librarian: Set your home library in <a href=":url">settings</a>.', [':url' => $url]));
}
}
}

function asklib_toolbar() {
$items = [];
$items['asklib'] = [
'#type' => 'toolbar_item',
'#weight' => 200,
Expand Down Expand Up @@ -750,10 +796,14 @@ function asklib_asklib_question_delete(QuestionInterface $question) {
/*
* NOTE: Makes deleting questions in hordes veeeery slow!
*/
$url = Url::fromRoute('entity.asklib_question.canonical', ['asklib_question' => $question->id()]);
Drupal::service('path.alias_storage')->delete(['source' => $url]);
$path = '/asklib_question/' . $question->id();

// Drupal::service('path.alias_storage')->delete(['source' => $url]);
$aliases = Drupal::service('entity_type.manager')->getStorage('path_alias')->loadByProperties(['path' => $path]);
foreach ($aliases as $alias) {
$alias->delete();
}

search_index_clear('asklib_search_elastic', $question->id());
}

function asklib_delete_question_index(QuestionInterface $question) {
Expand All @@ -768,10 +818,8 @@ function asklib_delete_question_index(QuestionInterface $question) {
'type' => 'content',
'id' => sprintf('asklib_question:%d:%s', $question->id(), $language->getId())
]);
} catch (\Elasticsearch\Common\Exceptions\Missing404Exception $e) {
// Question was not indexed before, pass.
} catch (\Elasticsearch\Common\Exceptions\NoNodesAvailableException $e) {
// Elasticsearch is down (or not installed), pass.
} catch (\Exception $e) {
\Drupal::logger('asklib')->error($e->getMessage());
}
}
}
Expand All @@ -794,3 +842,10 @@ function asklib_build_question_index(QuestionInterface $question) {
->execute();
}
}
function asklib_mailer_post_render(EmailInterface $email) {
$do_not_send = $email->getParam('do_not_send');
if ($do_not_send)
{
throw new SkipMailException();
}
}
2 changes: 1 addition & 1 deletion asklib.routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ asklib.admin_email_groups:
_controller: 'Drupal\asklib\Controller\MailGroupController::groups'
requirements:
_permission: 'administer asklib'
asklib.admin_email_groups:
asklib.admin_email_single_group:
path: '/admin/config/asklib/emails/groups/{taxonomy_term}'
defaults:
_title: 'Email groups'
Expand Down
8 changes: 4 additions & 4 deletions asklib.services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ services:
- { name: cache.context }
asklib.breadcrumb.default:
class: Drupal\system\PathBasedBreadcrumbBuilder
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current']
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@path.matcher']
tags:
- { name: asklib_breadcrumb, priority: 0 }
asklib.breadcrumb.archive:
Expand All @@ -34,17 +34,17 @@ services:
- { name: asklib_breadcrumb, priority: 100 }
asklib.breadcrumb.question_from_collection:
class: 'Drupal\asklib\Breadcrumb\QuestionFromCollectionCrumb'
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@request_stack', '@entity_type.manager']
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@path.matcher', '@request_stack', '@entity_type.manager']
tags:
- { name: asklib_breadcrumb, priority: 200 }
asklib.breadcrumb.collection_from_keyword_index:
class: 'Drupal\asklib\Breadcrumb\QuestionFromKeywordIndexCrumb'
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@request_stack', '@entity_type.manager']
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@path.matcher', '@request_stack', '@entity_type.manager']
tags:
- { name: asklib_breadcrumb, priority: 200 }
asklib.breadcrumb.taxonomy:
class: 'Drupal\asklib\Breadcrumb\TaxonomyCrumb'
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@request_stack']
arguments: ['@router.request_context', '@access_manager', '@router', '@path_processor_manager', '@config.factory', '@title_resolver', '@current_user', '@path.current', '@path.matcher', '@request_stack']
tags:
- { name: asklib_breadcrumb, priority: 200 }
asklib.breadcrumb_proxy:
Expand Down
3 changes: 1 addition & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"type": "drupal-module",
"license": "GPL-2.0+",
"require": {
"html2text/html2text": "^4.0",
"elasticsearch/elasticsearch": "^5.3"
"html2text/html2text": "^4.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
langcode: fi
status: true
dependencies:
module:
- asklib
id: asklib.answer
configuration:
email_subject:
value: 'Vastaus Kysy kirjastonhoitajalta -palvelusta'
email_body:
content:
value: "<p>Hei!</p>\r\n<p>Vastaus Kysy kirjastonhoitajalta -palveluun lähettämääsi kysymykseen.</p>\r\n\r\n<blockquote>\r\n <p>[asklib_answer:body]</p>\r\n {% if has_answer_details %}\r\n <p class=\"hidden-details\">[asklib_answer:details]</p>\r\n {% endif %}\r\n {% if is_admin %}\r\n <cite>[asklib_answer:author], Kirjastot.fi-toimitus</cite>\r\n {% else %}\r\n <cite>[asklib_answer:author], [asklib_answer:library]</cite>\r\n {% endif %}\r\n <blockquote>\r\n <p>[asklib_question:body]</p>\r\n {% if has_question_details %}\r\n <p class=\"hidden-details\">[asklib_question:details]</p>\r\n {% endif %}\r\n </blockquote>\r\n\r\n \r\n\r\n<p></p>\r\n <p>[asklib_answer:signature]</p>\r\n</blockquote>"
format: email_html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
langcode: fi
status: true
dependencies:
module:
- asklib
id: asklib.new_question
configuration:
email_subject:
value: '[Kysy kirjastonhoitajalta] Kuittaus vastaanotetusta kysymyksestä (asiakas)'
email_body:
content:
value: "<p>Hei!</p>\r\n<p>Kiitos kysymyksestäsi. Vastaamme siihen kolmen työpäivän kuluessa. Vastaamme vain <a href=\"https://www.kirjastot.fi/kysy/kysymyslomakkeen-tayttoohje\">tietopalvelukysymyksiin</a>. Käytämme kirjaston käytössä olevia lähteitä ja vastaamme kirjastoammattilaisen osaamisella. Kirjastot.fi-toimitus, toimitus@kirjastot.fi.</p>\r\n<blockquote>\r\n <cite>[asklib_question:email]</cite>\r\n <p>[asklib_question:body]</p>\r\n</blockquote>"
format: email_html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
langcode: fi
status: true
dependencies:
module:
- asklib
id: asklib.new_question_admin
configuration:
email_subject:
value: '[Kysy kirjastonhoitajalta] Ilmoitus uudesta kysymyksestä (vastaajat)'
email_body:
content:
value: "<p>Kirjastonne alueelta on saapunut uusi kysymys vastattavaksi Kysy kirjastonhoitajalta -palveluun. Kirjaudu osoitteessa https://www.kirjastot.fi/user/login</p>\r\n<p><a href=\"{{ url('view.asklib_index.page_1') }}\">Odottavat kysymykset</a></p>\r\n<blockquote>\r\n <cite>[asklib_question:email]</cite>\r\n <p>[asklib_question:body]</p>\r\n</blockquote>\r\n"
format: email_html
12 changes: 0 additions & 12 deletions config/optional/search.page.asklib_question_elastic.yml

This file was deleted.

3 changes: 3 additions & 0 deletions config/schema/asklib.schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
entity_reference_selection.asklib_question_municipality_selection:
type: entity_reference_selection.default
label: 'Question municipality selection handler settings'
4 changes: 1 addition & 3 deletions public/js/kifiform-tags-custom.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
(function($) {
"use strict";

$("form.asklib-question-edit-form input.form-autocomplete")
.once("asklib-tag-insert")
$(once("asklib-tag-insert", "form.asklib-question-edit-form input.form-autocomplete"))
.on("kififormtaginsert", function(event, ui) {
console.log(event);

if (ui.item.autocompleted == true) {
// This is valid as long autocomplete is configured to match only Finto terms.
Expand Down
Loading