|
1 | 1 | import m from 'mithril';
|
2 |
| -import { Pages } from '../models'; |
3 |
| -import { MeiosisComponent, t } from '../services'; |
4 |
| -import { Chips } from 'mithril-materialized'; |
5 |
| -import { ChipData } from 'materialize-css'; |
| 2 | +import { CrimeScriptFilter, Pages } from '../models'; |
| 3 | +import { I18N, MeiosisComponent, routingSvc, t } from '../services'; |
| 4 | +import { TextInput } from 'mithril-materialized'; |
| 5 | +import { FormAttributes, LayoutForm, UIForm } from 'mithril-ui-form'; |
| 6 | +import { attributeFilterFormFactory, crimeScriptFilterFormFactory } from '../models/forms'; |
6 | 7 |
|
7 | 8 | export const CasePage: MeiosisComponent = () => {
|
8 |
| - const tags: string[] = []; |
| 9 | + let crimeScriptFilterForm: UIForm<CrimeScriptFilter>; |
9 | 10 |
|
10 | 11 | return {
|
11 | 12 | oninit: ({
|
12 | 13 | attrs: {
|
| 14 | + state: { model }, |
13 | 15 | actions: { setPage },
|
14 | 16 | },
|
15 | 17 | }) => {
|
| 18 | + const { products = [], geoLocations = [], locations = [], cast = [], attributes = [], transports = [] } = model; |
| 19 | + crimeScriptFilterForm = [ |
| 20 | + ...crimeScriptFilterFormFactory(products, locations, geoLocations, 'search'), |
| 21 | + ...attributeFilterFormFactory(cast, attributes, transports, 'search'), |
| 22 | + ] as UIForm<CrimeScriptFilter>; |
16 | 23 | setPage(Pages.CASE);
|
17 | 24 | },
|
18 | 25 | view: ({ attrs: { state, actions } }) => {
|
19 |
| - const { caseTags = [], caseResults = [] } = state; |
| 26 | + const { caseResults = [], caseFilter, crimeScriptFilter = {} as CrimeScriptFilter, model } = state; |
20 | 27 | const { update } = actions;
|
21 |
| - const data: ChipData[] = caseTags.map((tag) => ({ tag })); |
22 | 28 |
|
23 |
| - return m('#case-page.row.case.page.markdown', [ |
| 29 | + return m('#case-page.row.case.page', [ |
| 30 | + m(LayoutForm, { |
| 31 | + form: crimeScriptFilterForm, |
| 32 | + obj: crimeScriptFilter, |
| 33 | + onchange: () => { |
| 34 | + actions.update({ crimeScriptFilter }); |
| 35 | + }, |
| 36 | + i18n: I18N, |
| 37 | + } as FormAttributes<CrimeScriptFilter>), |
24 | 38 | m('.col.s12', [
|
25 |
| - m(Chips, { |
26 |
| - data, |
| 39 | + m(TextInput, { |
27 | 40 | label: 'Aangetroffen zaken',
|
| 41 | + iconName: 'search', |
28 | 42 | className: 'center-align',
|
29 |
| - onchange: (tags) => { |
30 |
| - const caseTags = tags.map((tag) => tag.tag); |
31 |
| - update({ caseTags }); |
| 43 | + initialValue: caseFilter, |
| 44 | + onchange: (v) => { |
| 45 | + // const caseTags = tags.map((tag) => tag.tag); |
| 46 | + update({ caseFilter: v }); |
32 | 47 | },
|
33 | 48 | }),
|
34 | 49 | ]),
|
35 |
| - // caseResults.length > 0 && |
36 |
| - caseTags.length > 0 && m('.col.s12', m('h4', 'Meest waarschijnlijke acts')), |
37 |
| - caseTags.map((tag) => { |
38 |
| - return m('.col.s12', m('h5', tag)); |
39 |
| - }), |
| 50 | + caseResults && |
| 51 | + m('.col.s12', [ |
| 52 | + m('p', t('HITS', caseResults.length)), |
| 53 | + caseResults.length > 0 && [ |
| 54 | + m( |
| 55 | + 'ol', |
| 56 | + caseResults.map(({ crimeScriptIdx, totalScore, acts }) => |
| 57 | + m( |
| 58 | + 'li', |
| 59 | + `${model.crimeScripts[crimeScriptIdx].label} (score ${totalScore})`, |
| 60 | + m( |
| 61 | + 'ul.browser-default', |
| 62 | + acts.map(({ actIdx, phaseIdx, score }) => |
| 63 | + m( |
| 64 | + 'li', |
| 65 | + m( |
| 66 | + 'a.truncate', |
| 67 | + { |
| 68 | + style: { cursor: 'pointer' }, |
| 69 | + href: routingSvc.href(Pages.CRIME_SCRIPT, `id=${model.crimeScripts[crimeScriptIdx].id}`), |
| 70 | + onclick: () => { |
| 71 | + actions.setLocation(model.crimeScripts[crimeScriptIdx].id, actIdx, phaseIdx); |
| 72 | + }, |
| 73 | + }, |
| 74 | + `${actIdx >= 0 ? model.acts[actIdx].label : t('TEXT')} (score: ${score})` |
| 75 | + ) |
| 76 | + ) |
| 77 | + ) |
| 78 | + ) |
| 79 | + ) |
| 80 | + ) |
| 81 | + ), |
| 82 | + ], |
| 83 | + ]), |
40 | 84 | ]);
|
41 | 85 | },
|
42 | 86 | };
|
|
0 commit comments