diff --git a/app/components/agenda/agenda-header.hbs b/app/components/agenda/agenda-header.hbs index 998fe66503..f0fb1b6732 100644 --- a/app/components/agenda/agenda-header.hbs +++ b/app/components/agenda/agenda-header.hbs @@ -15,13 +15,13 @@ {{moment-format @meeting.plannedStart "HH:mm"}} {{/unless}} - {{#if @meeting.kindToShow.label}} + {{#if @meeting.kind.label}} - - {{await @meeting.kindToShow.label}} + {{@meeting.kind.label}} {{/if}} diff --git a/app/components/agenda/future-agendas.hbs b/app/components/agenda/future-agendas.hbs index 4306738b23..eb9fec129a 100644 --- a/app/components/agenda/future-agendas.hbs +++ b/app/components/agenda/future-agendas.hbs @@ -94,7 +94,7 @@ {{/if}} - {{meeting.kindToShow.label}} + {{meeting.kind.label}}
diff --git a/app/components/meeting/edit-meeting-modal.hbs b/app/components/meeting/edit-meeting-modal.hbs index 93f0b3344e..2f48896a8c 100644 --- a/app/components/meeting/edit-meeting-modal.hbs +++ b/app/components/meeting/edit-meeting-modal.hbs @@ -1,7 +1,11 @@ - +
{{t "start-date"}} @@ -48,7 +52,7 @@ {{t "edit"}} diff --git a/app/components/meeting/edit-meeting-modal.js b/app/components/meeting/edit-meeting-modal.js index 6552eff015..2d69b7b19c 100644 --- a/app/components/meeting/edit-meeting-modal.js +++ b/app/components/meeting/edit-meeting-modal.js @@ -3,8 +3,6 @@ import { tracked } from '@glimmer/tracking'; import { inject as service } from '@ember/service'; import { action } from '@ember/object'; import { task } from 'ember-concurrency'; -import EmberObject from '@ember/object'; -import CONFIG from 'frontend-kaleidos/utils/config'; /** * @argument {meeting} @@ -15,7 +13,6 @@ export default class MeetingEditMeetingComponent extends Component { @service toaster; @tracked kind; - @tracked selectedKindUri; @tracked startDate; @tracked extraInfo; @tracked _meetingNumber; @@ -24,13 +21,9 @@ export default class MeetingEditMeetingComponent extends Component { constructor() { super(...arguments); + this.initializeKind.perform(); + this.meetingYear = this.args.meeting.plannedStart.getFullYear(); - this.selectedKindUri = this.args.meeting.kind; - this.kind = EmberObject.create( - CONFIG.MINISTERRAAD_TYPES.TYPES.find( - (minsterraad) => minsterraad.uri === this.selectedKindUri - ) - ); this.startDate = this.args.meeting.plannedStart; this.extraInfo = this.args.meeting.extraInfo; this.meetingNumber = this.args.meeting.number; @@ -57,13 +50,18 @@ export default class MeetingEditMeetingComponent extends Component { this._numberRepresentation = null; } + @task + *initializeKind() { + this.kind = yield this.args.meeting.kind; + } + @task({ drop: true }) *updateMeeting() { const now = new Date(); this.args.meeting.extraInfo = this.extraInfo; this.args.meeting.plannedStart = this.startDate || now; - this.args.meeting.kind = this.selectedKindUri; + this.args.meeting.kind = this.kind; this.args.meeting.number = this.meetingNumber; this.args.meeting.numberRepresentation = this.numberRepresentation; @@ -83,6 +81,6 @@ export default class MeetingEditMeetingComponent extends Component { @action setKind(kind) { - this.selectedKindUri = kind; + this.kind = kind; } } diff --git a/app/components/meeting/new-meeting-modal.hbs b/app/components/meeting/new-meeting-modal.hbs index 8c5b14ffa0..65a4a9b06d 100644 --- a/app/components/meeting/new-meeting-modal.hbs +++ b/app/components/meeting/new-meeting-modal.hbs @@ -7,7 +7,9 @@ {{#if this.isAnnexMeeting}}
@@ -16,12 +18,17 @@ + as |model| + > + {{kind-print-label model.kind}} + {{t "of"}} + {{moment-format model.plannedStart "DD-MM-YYYY"}} + ({{model.numberRepresentation}}) +
{{else}} diff --git a/app/components/meeting/new-meeting-modal.js b/app/components/meeting/new-meeting-modal.js index 60e41fe2bb..a3f5eaf947 100644 --- a/app/components/meeting/new-meeting-modal.js +++ b/app/components/meeting/new-meeting-modal.js @@ -1,16 +1,12 @@ import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; -import { dropTask } from 'ember-concurrency'; +import { task, dropTask } from 'ember-concurrency'; import { inject as service } from '@ember/service'; import { A } from '@ember/array'; import moment from 'moment'; import CONSTANTS from 'frontend-kaleidos/config/constants'; -import CONFIG from 'frontend-kaleidos/utils/config'; -import { - isAnnexMeetingKind, - fetchClosestMeetingAndAgendaId, -} from 'frontend-kaleidos/utils/meeting-utils'; +import { fetchClosestMeetingAndAgendaId } from 'frontend-kaleidos/utils/meeting-utils'; /** * @argument {didSave} @@ -21,8 +17,9 @@ export default class MeetingNewMeetingModal extends Component { @service newsletterService; @service toaster; + @tracked kind = null; @tracked selectedMainMeeting = null; - @tracked selectedKindUri = null; + @tracked isAnnexMeeting = false; @tracked isEditingFormattedMeetingIdentifier = false; @tracked _meetingNumber = null; @tracked _formattedMeetingIdentifier = null; @@ -32,11 +29,15 @@ export default class MeetingNewMeetingModal extends Component { constructor() { super(...arguments); + this.initializeKind.perform(); this.initializeMeetingNumber.perform(); } - get isAnnexMeeting() { - return isAnnexMeetingKind(this.selectedKindUri); + get meetingKindPostfix() { + if (this.kind?.uri === CONSTANTS.MEETING_KINDS.PVV) { + return 'VV'; + } + return ''; } get formattedMeetingIdentifier() { @@ -59,6 +60,13 @@ export default class MeetingNewMeetingModal extends Component { this._formattedMeetingIdentifier = null; } + @task + *initializeKind() { + this.kind = yield this.store.findRecordByUri('concept', CONSTANTS.MEETING_KINDS.MINISTERRAAD); + const broader = yield this.kind?.broader; + this.isAnnexMeeting = broader?.uri === CONSTANTS.MEETING_KINDS.ANNEX; + } + @dropTask *initializeMeetingNumber() { const meeting = yield this.store.queryOne('meeting', { @@ -85,7 +93,7 @@ export default class MeetingNewMeetingModal extends Component { extraInfo: this.extraInfo, isFinal: false, plannedStart: startDate, - kind: this.selectedKindUri ?? CONFIG.MINISTERRAAD_TYPES.DEFAULT, + kind: this.kind, mainMeeting: this.selectedMainMeeting, number: this.meetingNumber, numberRepresentation: this.formattedMeetingIdentifier, @@ -96,7 +104,7 @@ export default class MeetingNewMeetingModal extends Component { try { yield meeting.save(); const agenda = yield this.createAgenda(meeting, now); - if (!meeting.isAnnex && closestMeeting) { + if (!this.isAnnexMeeting && closestMeeting) { yield this.createAgendaitemToApproveMinutes( agenda, meeting, @@ -171,10 +179,7 @@ export default class MeetingNewMeetingModal extends Component { @action selectMainMeeting(mainMeeting) { - const kind = CONFIG.MINISTERRAAD_TYPES.TYPES.find( - (minsterraad) => minsterraad.uri === this.selectedKindUri - ); - const postfix = (kind && kind.postfix) || ''; + const postfix = this.meetingKindPostfix; this.selectedMainMeeting = mainMeeting; this.startDate = mainMeeting.plannedStart; this.meetingNumber = mainMeeting.number; @@ -188,8 +193,12 @@ export default class MeetingNewMeetingModal extends Component { } @action - setKind(kind) { - this.selectedKindUri = kind; + async setKind(kind) { + this.kind = kind; + + const broader = await this.kind?.broader; + this.isAnnexMeeting = broader?.uri === CONSTANTS.MEETING_KINDS.ANNEX; + if (!this.isAnnexMeeting) { this.selectedMainMeeting = null; this.initializeMeetingNumber.perform(); diff --git a/app/components/newsletter/newsletter-header-overview.hbs b/app/components/newsletter/newsletter-header-overview.hbs index 1a473dfe8e..0bb13e17d9 100644 --- a/app/components/newsletter/newsletter-header-overview.hbs +++ b/app/components/newsletter/newsletter-header-overview.hbs @@ -10,7 +10,7 @@ > {{t "newsletter-overview-pdf-name"}} - - {{@meeting.kindToShow.label}} + {{@meeting.kind.label}} {{moment-format @meeting.plannedStart "DD MMMM YYYY"}}
diff --git a/app/components/newsletter/newsletter-meeting.hbs b/app/components/newsletter/newsletter-meeting.hbs index 56b9e1b0a2..dfe9c79502 100644 --- a/app/components/newsletter/newsletter-meeting.hbs +++ b/app/components/newsletter/newsletter-meeting.hbs @@ -2,7 +2,7 @@ {{!-- template-lint-disable no-action --}}

- {{t "newsletter-overview-pdf-name"}} - {{this.meeting.kindToShow.altLabel}} {{t "of"}} {{moment-format this.meeting.plannedStart "dddd DD-MM-YYYY"}} + {{t "newsletter-overview-pdf-name"}} - {{kind-print-label this.meeting.kind}} {{t "of"}} {{moment-format this.meeting.plannedStart "dddd DD-MM-YYYY"}}

{{#if (and this.allowEditing this.currentSession.isEditor)}}
diff --git a/app/components/utils/kind-selector.hbs b/app/components/utils/kind-selector.hbs index 0c1b450048..69b3dbf530 100644 --- a/app/components/utils/kind-selector.hbs +++ b/app/components/utils/kind-selector.hbs @@ -1,22 +1,18 @@ -{{! TODO: octane-refactor }} -{{! template-lint-disable no-action }} -
- {{#if (not this.hideLabel)}} +{{#if this.isLoading}} +
+ {{t "please-be-patient"}} + +
+{{else}} +
{{t "kind"}} - {{/if}} - {{#if this.isLoading}} -
- {{t "please-be-patient"}} - -
- {{else}} {{option.label}} - {{/if}} -
\ No newline at end of file +
+{{/if}} \ No newline at end of file diff --git a/app/components/utils/kind-selector.js b/app/components/utils/kind-selector.js index bc3651fd8b..a0f39e01f3 100644 --- a/app/components/utils/kind-selector.js +++ b/app/components/utils/kind-selector.js @@ -1,29 +1,42 @@ -/* eslint-disable ember/no-arrow-function-computed-properties */ -// TODO: octane-refactor -// eslint-disable-next-line ember/no-classic-components -import Component from '@ember/component'; -import CONFIG from 'frontend-kaleidos/utils/config'; -import EmberObject, { computed } from '@ember/object'; +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { inject as service } from '@ember/service'; +import { task } from 'ember-concurrency'; +import CONSTANTS from '../../config/constants'; +import { PAGE_SIZE } from 'frontend-kaleidos/config/config'; -// TODO: octane-refactor -// eslint-disable-next-line ember/no-classic-classes, ember/require-tagless-components -export default Component.extend({ - classNames: ['auk-u-mb-2'], - isLoading: null, - hideLabel: null, +/** + * @argument {Concept} selectedKind The meeting kind to set the dropdown to + * @argument {function} onChange Action to perform once a meeting kind has been selected + * @argument {boolean} disabled + */ +export default class UtilsKindSelector extends Component { + @service store; - options: computed(() => CONFIG.MINISTERRAAD_TYPES.TYPES.map((meetingType) => EmberObject.create(meetingType))), + @tracked options; - selectedkind: computed('kind.uri', 'options', function() { - return this.options.find((kind) => this.kind && kind.uri === this.kind.uri) || this.options.get('firstObject'); - }), + constructor() { + super(...arguments); - // TODO: octane-refactor - // eslint-disable-next-line ember/no-actions-hash - actions: { - setAction(meetingType) { - this.set('selectedkind', meetingType); - this.setAction(meetingType.get('uri')); - }, - }, -}); + this.loadKinds.perform(); + } + + get isLoading() { + return this.args.isLoading || this.loadKinds.isRunning; + } + + @task + *loadKinds() { + this.options = yield this.store.query('concept', { + filter: { + 'concept-schemes': { + ':uri:': CONSTANTS.CONCEPT_SCHEMES.VERGADERACTIVITEIT, + }, + ':has-no:narrower': true, // Only the most specific concepts, i.e. the actual meeting kinds (so no "Annex") + }, + include: 'broader,narrower', + 'page[size]': PAGE_SIZE.CODE_LISTS, + sort: 'position', + }); + } +} diff --git a/app/config/config.js b/app/config/config.js index 98ae994c65..168cdd3a54 100644 --- a/app/config/config.js +++ b/app/config/config.js @@ -9,7 +9,6 @@ export const PAGE_SIZE = { PIECES: 500, ACTIVITIES: 500, CASES: 500, - SELECT: 10, }; diff --git a/app/config/constants.js b/app/config/constants.js index 086966ea25..9c6ef49c58 100644 --- a/app/config/constants.js +++ b/app/config/constants.js @@ -3,6 +3,7 @@ export default { CONCEPT_SCHEMES: { BELEIDSDOMEIN: 'http://themis.vlaanderen.be/id/concept-schema/f4981a92-8639-4da4-b1e3-0e1371feaa81', BELEIDSVELD: 'http://themis.vlaanderen.be/id/concept-schema/0012aad8-d6e5-49e2-af94-b1bebd484d5b', + VERGADERACTIVITEIT: 'http://kanselarij.vo.data.gift/id/concept-scheme/668f0c19-3864-4e96-9dd3-de806fd53357', // TODO: Replace with Themis URI }, ACCESS_LEVELS: { INTERN_REGERING: 'http://kanselarij.vo.data.gift/id/concept/toegangs-niveaus/d335f7e3-aefd-4f93-81a2-1629c2edafa3', @@ -90,5 +91,10 @@ export default { MB: 'http://themis.vlaanderen.be/id/concept/regelgeving-type/49bad4d9-745b-4a71-b6c6-0eac34e6bdd4', DECREET: 'http://themis.vlaanderen.be/id/concept/regelgeving-type/bf6101a9-d06b-44d4-b629-13965654c8c2', BVR: 'http://themis.vlaanderen.be/id/concept/regelgeving-type/ea7f5f79-f81c-459b-a0f7-d8e90e2d9b88', - } + }, + MEETING_KINDS: { // TODO: Replace with Themis URIs + MINISTERRAAD: 'http://kanselarij.vo.data.gift/id/concept/ministerraad-type-codes/A5D6B7A8-2F9C-44B6-B3BE-98D80B426254', + PVV: 'http://kanselarij.vo.data.gift/id/concept/ministerraad-type-codes/1d16cb70-0ae9-489e-bf97-c74897222e3c', + ANNEX: 'http://kanselarij.vo.data.gift/id/concept/ministerraad-type-codes/d36138a9-07f0-4df6-bbf0-abd51a24e4ce', + }, }; diff --git a/app/helpers/kind-print-label.js b/app/helpers/kind-print-label.js new file mode 100644 index 0000000000..c51a65bd33 --- /dev/null +++ b/app/helpers/kind-print-label.js @@ -0,0 +1,9 @@ +import { helper } from '@ember/component/helper'; + +export function kindPrintLabel(kind) { + return kind.get('altLabel') ?? kind.get('label') ?? ''; +} + +export default helper(([kind]) => { + return kindPrintLabel(kind); +}); diff --git a/app/models/concept.js b/app/models/concept.js index 0765e2f09b..c97b6174ab 100644 --- a/app/models/concept.js +++ b/app/models/concept.js @@ -1,8 +1,10 @@ import Model, { attr, hasMany, belongsTo } from '@ember-data/model'; export default class Concept extends Model { + @attr('string') uri; @attr('string') label; - @attr('string') scopeNote; @attr('string') altLabel; + @attr('string') scopeNote; + @attr('number') position; @hasMany('concept', { inverse: 'broader'}) narrower; // The idea behind also using broader is because ember was automatically connecting the broader parent under the narrower relation // Resulting in all concepts with 1 inverse narrower to break length == 0 checks on narrower diff --git a/app/models/meeting.js b/app/models/meeting.js index 1c894ac0b1..ac3a76a248 100644 --- a/app/models/meeting.js +++ b/app/models/meeting.js @@ -1,11 +1,8 @@ import Model, { belongsTo, hasMany, attr } from '@ember-data/model'; import { PromiseArray, PromiseObject } from '@ember-data/store/-private'; -import EmberObject, { computed } from '@ember/object'; +import { computed } from '@ember/object'; import { inject } from '@ember/service'; -import CONFIG from 'frontend-kaleidos/utils/config'; import { KALEIDOS_START_DATE } from 'frontend-kaleidos/config/config'; -import { isAnnexMeetingKind } from 'frontend-kaleidos/utils/meeting-utils'; -import moment from 'moment'; import { sortDocumentContainers } from 'frontend-kaleidos/utils/documents'; @@ -26,7 +23,6 @@ export default Model.extend({ numberRepresentation: attr('string'), isFinal: attr('boolean'), extraInfo: attr('string'), - kind: attr('string'), releasedDocuments: attr('datetime'), releasedDecisions: attr('datetime'), @@ -36,6 +32,7 @@ export default Model.extend({ requestedSubcases: hasMany('subcase'), pieces: hasMany('piece'), + kind: belongsTo('concept'), mainMeeting: belongsTo('meeting', { inverse: null, }), @@ -47,13 +44,6 @@ export default Model.extend({ themisPublicationActivities: hasMany('themis-publication-activity'), - label: computed('plannedStart', 'kind', 'numberRepresentation', function() { - const date = moment(this.plannedStart).format('DD-MM-YYYY'); - const kind = CONFIG.MINISTERRAAD_TYPES.TYPES.find((type) => type.uri === this.kind); - const kindLabel = kind ? kind.altLabel : ''; - return `${kindLabel} ${this.intl.t('of')} ${date} (${this.numberRepresentation})`; - }), - // This computed does not seem to be used anywhere documentContainers: computed('pieces.@each.name', 'id', 'store', function() { return PromiseArray.create({ @@ -108,21 +98,6 @@ export default Model.extend({ return await agenda.get('agendaName'); }), - kindToShow: computed('kind', function() { - const options = CONFIG.MINISTERRAAD_TYPES.TYPES; - const { - kind, - } = this; - const foundOption = options.find((kindOption) => kindOption.uri === kind); - - - return EmberObject.create(foundOption); - }), - - isAnnex: computed('kind', function() { - return isAnnexMeetingKind(this.kind); - }), - isPreKaleidos: computed('plannedStart', function () { return this.plannedStart < KALEIDOS_START_DATE; }), diff --git a/app/pods/agendas/overview/template.hbs b/app/pods/agendas/overview/template.hbs index 495d3649c7..0f151902b0 100644 --- a/app/pods/agendas/overview/template.hbs +++ b/app/pods/agendas/overview/template.hbs @@ -135,7 +135,7 @@ {{/if}} - {{meeting.kindToShow.label}} + {{meeting.kind.label}}