diff --git a/app/controllers/design_elements_controller.rb b/app/controllers/design_elements_controller.rb index 3d6edeefa..0c1d97e3b 100644 --- a/app/controllers/design_elements_controller.rb +++ b/app/controllers/design_elements_controller.rb @@ -1,29 +1,40 @@ +# frozen_string_literal: true + class DesignElementsController < ApplicationController - def index - end + def index; end def test_select render json: { data: [ - ['1', 'One'], - ['2', 'Two'], - ['3', 'Three'], - ['4', 'Four'], - ['5', 'Five'], - ['6', 'Six'], - ['7', 'Seven'], - ['8', 'Eight'], - ['9', 'Nine'], - ['10', 'Ten'] + %w(1 One), + %w(2 Two), + %w(3 Three), + %w(4 Four), + %w(5 Five), + %w(6 Six), + %w(7 Seven), + %w(8 Eight), + %w(9 Nine), + %w(10 Ten) ].select { |item| item[1].downcase.include?(params[:query].downcase) } } end def test_table render json: { data: [ - { id: 1, attributes: {name: 'One' } }, - { id: 2, attributes: {name: 'Two' } }, - { id: 3, attributes: {name: 'Three' } }, - { id: 4, attributes: {name: 'Four' } }, + { id: 1, attributes: { + name: 'One', + description: nil, + date: { + value: I18n.l(DateTime.now, format: :default), + value_formatted: I18n.l(DateTime.now, format: :full_date), + editable: true + } + } }, + { id: 2, attributes: { name: 'Two', description: '[@admin~1]', date: { editable: true } } }, + { id: 3, + attributes: { name: 'Three', description: 'Long long long long name Long long long long name Long long long long name Long long long long name', + date: { editable: true } } }, + { id: 4, attributes: { name: 'Four', date: { editable: true } } } ], meta: { current_page: 1, diff --git a/app/javascript/packs/vue/design_system/table.js b/app/javascript/packs/vue/design_system/table.js index 6ac394a51..8d3072379 100644 --- a/app/javascript/packs/vue/design_system/table.js +++ b/app/javascript/packs/vue/design_system/table.js @@ -1,89 +1,60 @@ import { createApp } from 'vue/dist/vue.esm-bundler.js'; -import DataTable from '../shared/datatable/table.vue'; +import DataTable from '../../../vue/shared/datatable/table.vue'; +import DescriptionRenderer from '../../../vue/shared/datatable/renderers/description.vue'; +import DateRenderer from '../../../vue/shared/datatable/renderers/date.vue'; import { mountWithTurbolinks } from '../helpers/turbolinks.js'; const app = createApp({ + data() { + return { + dataUrl: '/design_elements/test_table' + }; + }, computed: { columnDefs() { - const columns = [{ - field: 'name', - flex: 1, - headerName: this.i18n.t('projects.index.card.name'), - sortable: true, - cellRenderer: 'NameRenderer' - }] + const columns = [ + { + field: 'name', + flex: 1, + headerName: 'Name', + sortable: true + }, + { + field: 'description', + flex: 1, + headerName: 'Description', + sortable: true, + cellRenderer: DescriptionRenderer + }, + { + field: 'date', + flex: 1, + headerName: 'Date', + sortable: true, + cellRenderer: DateRenderer, + cellRendererParams: { + placeholder: 'Add date', + field: 'date', + mode: 'datetime', + emptyPlaceholder: 'No date', + emitAction: 'updateDate' + } + } + ]; return columns; }, viewRenders() { - return [ - { type: 'table' }, - { type: 'cards' } - ]; + return []; }, toolbarActions() { - const left = []; - if (this.createUrl && this.currentViewMode !== 'archived') { - left.push({ - name: 'create', - icon: 'sn-icon sn-icon-new-task', - label: this.i18n.t('projects.index.new'), - type: 'emit', - path: this.createUrl, - buttonStyle: 'btn btn-primary' - }); - } - if (this.createFolderUrl) { - left.push({ - name: 'create_folder', - icon: 'sn-icon sn-icon-folder', - label: this.i18n.t('projects.index.new_folder'), - type: 'emit', - path: this.createFolderUrl, - buttonStyle: 'btn btn-light' - }); - } return { - left, + left: [], right: [] }; }, filters() { - const filters = [ - { - key: 'query', - type: 'Text' - }, - { - key: 'created_at', - type: 'DateRange', - label: this.i18n.t('filters_modal.created_on.label') - } - ]; - - if (this.currentViewMode === 'archived') { - filters.push({ - key: 'archived_at', - type: 'DateRange', - label: this.i18n.t('filters_modal.archived_on.label') - }); - } - - filters.push({ - key: 'members', - type: 'Select', - optionsUrl: this.usersFilterUrl, - optionRenderer: this.usersFilterRenderer, - labelRenderer: this.usersFilterRenderer, - label: this.i18n.t('projects.index.filters_modal.members.label'), - placeholder: this.i18n.t('projects.index.filters_modal.members.placeholder') - }); - - filters.push({ - key: 'folder_search', - type: 'Checkbox', - label: this.i18n.t('projects.index.filters_modal.folders.label') - }); + const filters = []; return filters; } diff --git a/app/javascript/vue/experiments/card.vue b/app/javascript/vue/experiments/card.vue index d4a8c71d2..6e5576b57 100644 --- a/app/javascript/vue/experiments/card.vue +++ b/app/javascript/vue/experiments/card.vue @@ -75,7 +75,7 @@ import RowMenuRenderer from '../shared/datatable/row_menu_renderer.vue'; import CardSelectorMixin from '../shared/datatable/mixins/card_selector.js'; import workflowImgMixin from './workflow_img_mixin.js'; -import Description from './renderers/description.vue'; +import Description from '../shared/datatable/renderers/description.vue'; export default { name: 'ProjectCard', diff --git a/app/javascript/vue/experiments/list.vue b/app/javascript/vue/experiments/list.vue index d4b126ed8..d272d38ba 100644 --- a/app/javascript/vue/experiments/list.vue +++ b/app/javascript/vue/experiments/list.vue @@ -61,7 +61,7 @@ import axios from '../../packs/custom_axios.js'; import DataTable from '../shared/datatable/table.vue'; -import DescriptionRenderer from './renderers/description.vue'; +import DescriptionRenderer from '../shared/datatable/renderers/description.vue'; import ConfirmationModal from '../shared/confirmation_modal.vue'; import CompletedTasksRenderer from './renderers/completed_tasks.vue'; import NameRenderer from './renderers/name.vue'; diff --git a/app/javascript/vue/my_modules/list.vue b/app/javascript/vue/my_modules/list.vue index 4904aee57..b4c1aff60 100644 --- a/app/javascript/vue/my_modules/list.vue +++ b/app/javascript/vue/my_modules/list.vue @@ -24,6 +24,7 @@ @archive="archive" @restore="restore" @duplicate="duplicate" + @updateDueDate="updateDueDate" @editTags="editTags"/> { + this.updateTable(); + }); + }, + formatDate(date) { + if (!(date instanceof Date)) return null; + + const y = date.getFullYear(); + const m = date.getMonth() + 1; + const d = date.getDate(); + const hours = date.getHours(); + const mins = date.getMinutes(); + return `${y}/${m}/${d} ${hours}:${mins}`; + }, updateTable() { this.tagsModalObject = null; this.newModalOpen = false; diff --git a/app/javascript/vue/my_modules/renderers/due_date.vue b/app/javascript/vue/my_modules/renderers/due_date.vue deleted file mode 100644 index b6bee83a1..000000000 --- a/app/javascript/vue/my_modules/renderers/due_date.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - diff --git a/app/javascript/vue/shared/datatable/renderers/date.vue b/app/javascript/vue/shared/datatable/renderers/date.vue new file mode 100644 index 000000000..18af9f600 --- /dev/null +++ b/app/javascript/vue/shared/datatable/renderers/date.vue @@ -0,0 +1,51 @@ + + + diff --git a/app/javascript/vue/experiments/renderers/description.vue b/app/javascript/vue/shared/datatable/renderers/description.vue similarity index 67% rename from app/javascript/vue/experiments/renderers/description.vue rename to app/javascript/vue/shared/datatable/renderers/description.vue index 5b694b478..349eb7773 100644 --- a/app/javascript/vue/experiments/renderers/description.vue +++ b/app/javascript/vue/shared/datatable/renderers/description.vue @@ -1,12 +1,12 @@