11import { observable } from 'mobx' ;
2+ import { toggle } from 'mobx-restful' ;
23import { Base , Searchable , SearchableFilter , StrapiListModel } from 'mobx-strapi' ;
3- import { changeMonth , countBy , formatDate , groupBy } from 'web-utility' ;
4+ import { countBy , groupBy } from 'web-utility' ;
45
56import { Organization } from '@open-source-bazaar/china-ngo-database' ;
67import { strapiClient } from './Base' ;
@@ -19,35 +20,33 @@ export class OrganizationModel extends Searchable<Organization & Base>(StrapiLis
1920 baseURI = 'organizations' ;
2021 client = strapiClient ;
2122
23+ sort = { establishedDate : 'asc' } as const ;
24+
25+ dateKeys = [ 'establishedDate' ] as const ;
26+
2227 searchKeys = [ 'name' , 'description' , 'coverageArea' ] as const ;
2328
2429 @observable
2530 accessor statistic = { } as OrganizationStatistic ;
2631
2732 @observable
28- accessor categoryMap : Record < string , Organization [ ] > = { } ;
29-
30- makeFilter (
31- pageIndex : number ,
32- pageSize : number ,
33- { keywords, ...filter } : SearchableFilter < Organization & Base > ,
34- ) {
35- if ( keywords ) return super . makeFilter ( pageIndex , pageSize , { keywords, ...filter } ) ;
36-
37- const meta = super . makeFilter ( pageIndex , pageSize , filter ) ;
38-
39- const { establishedDate } = filter ;
40-
41- const timeRangeFilter =
42- establishedDate ?. length === 4
43- ? { $gte : `${ establishedDate } -01-01` , $lt : `${ + establishedDate + 1 } -01-01` }
44- : establishedDate ?. length === 7
45- ? {
46- $gte : `${ establishedDate } -01` ,
47- $lte : `${ formatDate ( changeMonth ( establishedDate , 1 ) , 'YYYY-MM' ) } -01` ,
48- }
49- : { } ;
50- return { ...meta , filters : { ...meta . filters , establishedDate : timeRangeFilter } } ;
33+ accessor typeMap : Record < string , Organization [ ] > = { } ;
34+
35+ @toggle ( 'downloading' )
36+ async getYearRange ( ) {
37+ const now = Date . now ( ) ,
38+ organizationStore = new OrganizationModel ( ) ;
39+
40+ const [ { establishedDate : start } = { } ] = await organizationStore . getList ( { } , 1 , 1 ) ;
41+
42+ Object . assign ( organizationStore , { sort : { establishedDate : 'desc' } } ) ;
43+
44+ const [ { establishedDate : end } = { } ] = await organizationStore . getList ( { } , 1 , 1 ) ;
45+
46+ const startYear = new Date ( start || now ) . getFullYear ( ) ,
47+ endYear = new Date ( end || now ) . getFullYear ( ) ;
48+
49+ return [ startYear , endYear ] as const ;
5150 }
5251
5352 async getStatistic ( filter ?: SearchableFilter < Organization & Base > ) {
@@ -67,14 +66,10 @@ export class OrganizationModel extends Searchable<Organization & Base>(StrapiLis
6766 return ( this . statistic = { ...statistic , serviceCategory } as OrganizationStatistic ) ;
6867 }
6968
70- async groupAllByTags ( filter ?: SearchableFilter < Organization & Base > ) {
69+ async groupAllByType ( filter ?: SearchableFilter < Organization & Base > ) {
7170 const allData = await this . getAll ( filter ) ;
7271
73- return ( this . categoryMap = groupBy (
74- allData ,
75- ( { services } ) =>
76- services ?. map ( ( { serviceCategory } ) => serviceCategory ! ) . filter ( Boolean ) || [ ] ,
77- ) ) ;
72+ return ( this . typeMap = groupBy ( allData , 'entityType' ) ) ;
7873 }
7974}
8075export default new OrganizationModel ( ) ;
0 commit comments