Commit 6e8c6ec3 authored by Coung Ngo's avatar Coung Ngo Committed by Ezekiel Kigbo

Move ~/issuable_list to ~/vue_shared

parent 18fc6343
...@@ -26,7 +26,7 @@ import { emptyStateHelper } from '../service_desk_helper'; ...@@ -26,7 +26,7 @@ import { emptyStateHelper } from '../service_desk_helper';
import Issuable from './issuable.vue'; import Issuable from './issuable.vue';
/** /**
* @deprecated Use app/assets/javascripts/issuable_list/components/issuable_list_root.vue instead * @deprecated Use app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue instead
*/ */
export default { export default {
LOADING_LIST_ITEMS_LENGTH, LOADING_LIST_ITEMS_LENGTH,
......
...@@ -18,8 +18,8 @@ import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; ...@@ -18,8 +18,8 @@ import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import { ITEM_TYPE } from '~/groups/constants'; import { ITEM_TYPE } from '~/groups/constants';
import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue'; import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue'; import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/issuable_list/constants'; import { IssuableListTabs, IssuableStates } from '~/vue_shared/issuable/list/constants';
import { import {
CREATED_DESC, CREATED_DESC,
i18n, i18n,
......
<script> <script>
import { GlEmptyState } from '@gitlab/ui'; import { GlEmptyState } from '@gitlab/ui';
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { FilterStateEmptyMessage } from '../constants'; import { FilterStateEmptyMessage } from '../constants';
......
...@@ -5,9 +5,9 @@ import EpicsFilteredSearchMixin from 'ee/roadmap/mixins/filtered_search_mixin'; ...@@ -5,9 +5,9 @@ import EpicsFilteredSearchMixin from 'ee/roadmap/mixins/filtered_search_mixin';
import createFlash from '~/flash'; import createFlash from '~/flash';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableListTabs, DEFAULT_PAGE_SIZE } from '~/issuable_list/constants'; import { IssuableListTabs, DEFAULT_PAGE_SIZE } from '~/vue_shared/issuable/list/constants';
import { parsePikadayDate, dateInWords } from '~/lib/utils/datetime_utility'; import { parsePikadayDate, dateInWords } from '~/lib/utils/datetime_utility';
import { s__, sprintf } from '~/locale'; import { s__, sprintf } from '~/locale';
......
import { AvailableSortOptions } from '~/issuable_list/constants'; import { AvailableSortOptions } from '~/vue_shared/issuable/list/constants';
import { __ } from '~/locale'; import { __ } from '~/locale';
export const EpicsSortOptions = [ export const EpicsSortOptions = [
......
import Vue from 'vue'; import Vue from 'vue';
import VueApollo from 'vue-apollo'; import VueApollo from 'vue-apollo';
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
import createDefaultClient from '~/lib/graphql'; import createDefaultClient from '~/lib/graphql';
import { parseBoolean, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { parseBoolean, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { queryToObject } from '~/lib/utils/url_utility'; import { queryToObject } from '~/lib/utils/url_utility';
......
<script> <script>
import { GlEmptyState, GlButton, GlIcon, GlSprintf } from '@gitlab/ui'; import { GlEmptyState, GlButton, GlIcon, GlSprintf } from '@gitlab/ui';
import { externalIssuesListEmptyStateI18n as i18n } from 'ee/external_issues_list/constants'; import { externalIssuesListEmptyStateI18n as i18n } from 'ee/external_issues_list/constants';
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
export default { export default {
components: { components: {
......
...@@ -9,13 +9,13 @@ import { ...@@ -9,13 +9,13 @@ import {
} from '@gitlab/ui'; } from '@gitlab/ui';
import * as Sentry from '@sentry/browser'; import * as Sentry from '@sentry/browser';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { import {
IssuableStates, IssuableStates,
IssuableListTabs, IssuableListTabs,
AvailableSortOptions, AvailableSortOptions,
DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE,
} from '~/issuable_list/constants'; } from '~/vue_shared/issuable/list/constants';
import { i18n } from '~/issues_list/constants'; import { i18n } from '~/issues_list/constants';
import { import {
FILTERED_SEARCH_LABELS, FILTERED_SEARCH_LABELS,
......
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
import { __, s__ } from '~/locale'; import { __, s__ } from '~/locale';
export const externalIssuesListEmptyStateI18n = { export const externalIssuesListEmptyStateI18n = {
......
import Vue from 'vue'; import Vue from 'vue';
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { queryToObject } from '~/lib/utils/url_utility'; import { queryToObject } from '~/lib/utils/url_utility';
......
import { DEFAULT_PAGE_SIZE } from '~/issuable_list/constants'; import { DEFAULT_PAGE_SIZE } from '~/vue_shared/issuable/list/constants';
import { i18n } from '~/issues_list/constants'; import { i18n } from '~/issues_list/constants';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
......
import { DEFAULT_PAGE_SIZE } from '~/issuable_list/constants'; import { DEFAULT_PAGE_SIZE } from '~/vue_shared/issuable/list/constants';
import { i18n } from '~/issues_list/constants'; import { i18n } from '~/issues_list/constants';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
......
...@@ -3,7 +3,7 @@ import { GlButton } from '@gitlab/ui'; ...@@ -3,7 +3,7 @@ import { GlButton } from '@gitlab/ui';
import Api from '~/api'; import Api from '~/api';
import createFlash from '~/flash'; import createFlash from '~/flash';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { updateHistory, setUrlParams, queryToObject } from '~/lib/utils/url_utility'; import { updateHistory, setUrlParams, queryToObject } from '~/lib/utils/url_utility';
......
...@@ -5,15 +5,16 @@ import EpicsListRoot from 'ee/epics_list/components/epics_list_root.vue'; ...@@ -5,15 +5,16 @@ import EpicsListRoot from 'ee/epics_list/components/epics_list_root.vue';
import { EpicsSortOptions } from 'ee/epics_list/constants'; import { EpicsSortOptions } from 'ee/epics_list/constants';
import { mockFormattedEpic } from 'ee_jest/roadmap/mock_data'; import { mockFormattedEpic } from 'ee_jest/roadmap/mock_data';
import { stubComponent } from 'helpers/stub_component'; import { stubComponent } from 'helpers/stub_component';
import { mockAuthor, mockLabels } from 'jest/issuable_list/mock_data'; import { mockAuthor, mockLabels } from 'jest/vue_shared/issuable/list/mock_data';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableListTabs } from '~/issuable_list/constants'; import { IssuableListTabs } from '~/vue_shared/issuable/list/constants';
jest.mock('~/issuable_list/constants', () => ({ jest.mock('~/vue_shared/issuable/list/constants', () => ({
DEFAULT_PAGE_SIZE: 2, DEFAULT_PAGE_SIZE: 2,
IssuableListTabs: jest.requireActual('~/issuable_list/constants').IssuableListTabs, IssuableListTabs: jest.requireActual('~/vue_shared/issuable/list/constants').IssuableListTabs,
AvailableSortOptions: jest.requireActual('~/issuable_list/constants').AvailableSortOptions, AvailableSortOptions: jest.requireActual('~/vue_shared/issuable/list/constants')
.AvailableSortOptions,
})); }));
const mockRawEpic = { const mockRawEpic = {
......
...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; ...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import ExternalIssuesListEmptyState from 'ee/external_issues_list/components/external_issues_list_empty_state.vue'; import ExternalIssuesListEmptyState from 'ee/external_issues_list/components/external_issues_list_empty_state.vue';
import { externalIssuesListEmptyStateI18n } from 'ee/external_issues_list/constants'; import { externalIssuesListEmptyStateI18n } from 'ee/external_issues_list/constants';
import { IssuableStates } from '~/issuable_list/constants'; import { IssuableStates } from '~/vue_shared/issuable/list/constants';
import { mockProvide } from '../mock_data'; import { mockProvide } from '../mock_data';
......
...@@ -10,7 +10,7 @@ import jiraIssuesResolver from 'ee/integrations/jira/issues_list/graphql/resolve ...@@ -10,7 +10,7 @@ import jiraIssuesResolver from 'ee/integrations/jira/issues_list/graphql/resolve
import createMockApollo from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises'; import waitForPromises from 'helpers/wait_for_promises';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { i18n } from '~/issues_list/constants'; import { i18n } from '~/issues_list/constants';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status'; import httpStatus from '~/lib/utils/http_status';
...@@ -22,11 +22,12 @@ import { ...@@ -22,11 +22,12 @@ import {
} from '../mock_data'; } from '../mock_data';
jest.mock('~/flash'); jest.mock('~/flash');
jest.mock('~/issuable_list/constants', () => ({ jest.mock('~/vue_shared/issuable/list/constants', () => ({
DEFAULT_PAGE_SIZE: 2, DEFAULT_PAGE_SIZE: 2,
IssuableStates: jest.requireActual('~/issuable_list/constants').IssuableStates, IssuableStates: jest.requireActual('~/vue_shared/issuable/list/constants').IssuableStates,
IssuableListTabs: jest.requireActual('~/issuable_list/constants').IssuableListTabs, IssuableListTabs: jest.requireActual('~/vue_shared/issuable/list/constants').IssuableListTabs,
AvailableSortOptions: jest.requireActual('~/issuable_list/constants').AvailableSortOptions, AvailableSortOptions: jest.requireActual('~/vue_shared/issuable/list/constants')
.AvailableSortOptions,
})); }));
jest.mock( jest.mock(
'~/vue_shared/components/filtered_search_bar/tokens/label_token.vue', '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue',
......
...@@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter'; ...@@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import createApolloProvider from 'ee/external_issues_list/graphql'; import createApolloProvider from 'ee/external_issues_list/graphql';
import getZentaoIssues from 'ee/integrations/zentao/issues_list/graphql/queries/get_zentao_issues.query.graphql'; import getZentaoIssues from 'ee/integrations/zentao/issues_list/graphql/queries/get_zentao_issues.query.graphql';
import zentaoIssuesResolver from 'ee/integrations/zentao/issues_list/graphql/resolvers/zentao_issues'; import zentaoIssuesResolver from 'ee/integrations/zentao/issues_list/graphql/resolvers/zentao_issues';
import { DEFAULT_PAGE_SIZE } from '~/issuable_list/constants'; import { DEFAULT_PAGE_SIZE } from '~/vue_shared/issuable/list/constants';
import { i18n } from '~/issues_list/constants'; import { i18n } from '~/issues_list/constants';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { mockZentaoIssues } from '../mock_data'; import { mockZentaoIssues } from '../mock_data';
......
...@@ -7,7 +7,7 @@ import getIssuesCountsQuery from 'ee_else_ce/issues_list/queries/get_issues_coun ...@@ -7,7 +7,7 @@ import getIssuesCountsQuery from 'ee_else_ce/issues_list/queries/get_issues_coun
import createMockApollo from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import { getIssuesCountsQueryResponse, getIssuesQueryResponse } from 'jest/issues_list/mock_data'; import { getIssuesCountsQueryResponse, getIssuesQueryResponse } from 'jest/issues_list/mock_data';
import { convertToGraphQLId } from '~/graphql_shared/utils'; import { convertToGraphQLId } from '~/graphql_shared/utils';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { import {
TOKEN_TYPE_ASSIGNEE, TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR, TOKEN_TYPE_AUTHOR,
......
...@@ -3,9 +3,9 @@ import { nextTick } from 'vue'; ...@@ -3,9 +3,9 @@ import { nextTick } from 'vue';
import TestCaseListRoot from 'ee/test_case_list/components/test_case_list_root.vue'; import TestCaseListRoot from 'ee/test_case_list/components/test_case_list_root.vue';
import { TEST_HOST } from 'helpers/test_constants'; import { TEST_HOST } from 'helpers/test_constants';
import { mockIssuable } from 'jest/issuable_list/mock_data'; import { mockIssuable } from 'jest/vue_shared/issuable/list/mock_data';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
jest.mock('~/flash'); jest.mock('~/flash');
jest.mock('ee/test_case_list/constants', () => ({ jest.mock('ee/test_case_list/constants', () => ({
......
...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; ...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import TestCaseShowRoot from 'ee/test_case_show/components/test_case_show_root.vue'; import TestCaseShowRoot from 'ee/test_case_show/components/test_case_show_root.vue';
import TestCaseSidebar from 'ee/test_case_show/components/test_case_sidebar.vue'; import TestCaseSidebar from 'ee/test_case_show/components/test_case_sidebar.vue';
import { mockCurrentUserTodo } from 'jest/issuable_list/mock_data'; import { mockCurrentUserTodo } from 'jest/vue_shared/issuable/list/mock_data';
import IssuableBody from '~/issuable_show/components/issuable_body.vue'; import IssuableBody from '~/issuable_show/components/issuable_body.vue';
import IssuableEditForm from '~/issuable_show/components/issuable_edit_form.vue'; import IssuableEditForm from '~/issuable_show/components/issuable_edit_form.vue';
......
...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; ...@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import Mousetrap from 'mousetrap'; import Mousetrap from 'mousetrap';
import TestCaseSidebar from 'ee/test_case_show/components/test_case_sidebar.vue'; import TestCaseSidebar from 'ee/test_case_show/components/test_case_sidebar.vue';
import { mockCurrentUserTodo, mockLabels } from 'jest/issuable_list/mock_data'; import { mockCurrentUserTodo, mockLabels } from 'jest/vue_shared/issuable/list/mock_data';
import { keysFor, ISSUABLE_CHANGE_LABEL } from '~/behaviors/shortcuts/keybindings'; import { keysFor, ISSUABLE_CHANGE_LABEL } from '~/behaviors/shortcuts/keybindings';
import ProjectSelect from '~/vue_shared/components/sidebar/issuable_move_dropdown.vue'; import ProjectSelect from '~/vue_shared/components/sidebar/issuable_move_dropdown.vue';
......
...@@ -4,7 +4,7 @@ import TestCaseShowRoot from 'ee/test_case_show/components/test_case_show_root.v ...@@ -4,7 +4,7 @@ import TestCaseShowRoot from 'ee/test_case_show/components/test_case_show_root.v
import markTestCaseTodoDone from 'ee/test_case_show/queries/mark_test_case_todo_done.mutation.graphql'; import markTestCaseTodoDone from 'ee/test_case_show/queries/mark_test_case_todo_done.mutation.graphql';
import moveTestCase from 'ee/test_case_show/queries/move_test_case.mutation.graphql'; import moveTestCase from 'ee/test_case_show/queries/move_test_case.mutation.graphql';
import updateTestCase from 'ee/test_case_show/queries/update_test_case.mutation.graphql'; import updateTestCase from 'ee/test_case_show/queries/update_test_case.mutation.graphql';
import { mockCurrentUserTodo } from 'jest/issuable_list/mock_data'; import { mockCurrentUserTodo } from 'jest/vue_shared/issuable/list/mock_data';
import Api from '~/api'; import Api from '~/api';
import createFlash from '~/flash'; import createFlash from '~/flash';
......
import { mockIssuable, mockCurrentUserTodo } from 'jest/issuable_list/mock_data'; import { mockIssuable, mockCurrentUserTodo } from 'jest/vue_shared/issuable/list/mock_data';
export const mockTestCase = { export const mockTestCase = {
...mockIssuable, ...mockIssuable,
......
import { mockIssuable as issuable } from '../issuable_list/mock_data'; import { mockIssuable as issuable } from 'jest/vue_shared/issuable/list/mock_data';
export const mockIssuable = { export const mockIssuable = {
...issuable, ...issuable,
......
...@@ -21,8 +21,8 @@ import createFlash, { FLASH_TYPES } from '~/flash'; ...@@ -21,8 +21,8 @@ import createFlash, { FLASH_TYPES } from '~/flash';
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue'; import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue'; import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/issuable_list/constants'; import { IssuableListTabs, IssuableStates } from '~/vue_shared/issuable/list/constants';
import IssuesListApp from '~/issues_list/components/issues_list_app.vue'; import IssuesListApp from '~/issues_list/components/issues_list_app.vue';
import NewIssueDropdown from '~/issues_list/components/new_issue_dropdown.vue'; import NewIssueDropdown from '~/issues_list/components/new_issue_dropdown.vue';
import { import {
......
import { shallowMount } from '@vue/test-utils'; import { shallowMount } from '@vue/test-utils';
import IssuableBulkEditSidebar from '~/issuable_list/components/issuable_bulk_edit_sidebar.vue'; import IssuableBulkEditSidebar from '~/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar.vue';
const createComponent = ({ expanded = true } = {}) => const createComponent = ({ expanded = true } = {}) =>
shallowMount(IssuableBulkEditSidebar, { shallowMount(IssuableBulkEditSidebar, {
......
import { GlLink, GlLabel, GlIcon, GlFormCheckbox, GlSprintf } from '@gitlab/ui'; import { GlLink, GlLabel, GlIcon, GlFormCheckbox, GlSprintf } from '@gitlab/ui';
import { useFakeDate } from 'helpers/fake_date'; import { useFakeDate } from 'helpers/fake_date';
import { shallowMountExtended as shallowMount } from 'helpers/vue_test_utils_helper'; import { shallowMountExtended as shallowMount } from 'helpers/vue_test_utils_helper';
import IssuableItem from '~/issuable_list/components/issuable_item.vue'; import IssuableItem from '~/vue_shared/issuable/list/components/issuable_item.vue';
import IssuableAssignees from '~/vue_shared/components/issue/issue_assignees.vue'; import IssuableAssignees from '~/vue_shared/components/issue/issue_assignees.vue';
import { mockIssuable, mockRegularLabel, mockScopedLabel } from '../mock_data'; import { mockIssuable, mockRegularLabel, mockScopedLabel } from '../mock_data';
......
...@@ -4,9 +4,9 @@ import VueDraggable from 'vuedraggable'; ...@@ -4,9 +4,9 @@ import VueDraggable from 'vuedraggable';
import { TEST_HOST } from 'helpers/test_constants'; import { TEST_HOST } from 'helpers/test_constants';
import IssuableItem from '~/issuable_list/components/issuable_item.vue'; import IssuableItem from '~/vue_shared/issuable/list/components/issuable_item.vue';
import IssuableListRoot from '~/issuable_list/components/issuable_list_root.vue'; import IssuableListRoot from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
import IssuableTabs from '~/issuable_list/components/issuable_tabs.vue'; import IssuableTabs from '~/vue_shared/issuable/list/components/issuable_tabs.vue';
import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import { mockIssuableListProps, mockIssuables } from '../mock_data'; import { mockIssuableListProps, mockIssuables } from '../mock_data';
......
import { GlTab, GlBadge } from '@gitlab/ui'; import { GlTab, GlBadge } from '@gitlab/ui';
import { mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import IssuableTabs from '~/issuable_list/components/issuable_tabs.vue'; import IssuableTabs from '~/vue_shared/issuable/list/components/issuable_tabs.vue';
import { mockIssuableListProps } from '../mock_data'; import { mockIssuableListProps } from '../mock_data';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment