Skip to content

Commit 9ec58fc

Browse files
committed
Started feed managing
1 parent e2950c0 commit 9ec58fc

File tree

7 files changed

+103
-28
lines changed

7 files changed

+103
-28
lines changed

client/src/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
export default {
66
created() {
77
this.$store.commit("initialize");
8-
this.$store.commit('occurencies/retrieve',1,2)
8+
this.$store.commit("occurencies/retrieve");
99
},
1010
data() {
1111
return {};

client/src/components/Main.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export default {
6565
selectedEventId: this.$route.params.eventId,
6666
selectedTypeIds: [],
6767
selectedCalendarIds: [],
68+
selectedEventIds:[],
6869
displayedEvents: [],
6970
};
7071
},

client/src/components/calendar.event.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@click.native="eventClick(event.id)"
66
:id="`event-${event.id}`"
77
:style="styleObj"
8+
v-cloak
89
></component>
910
</template>
1011

@@ -48,4 +49,8 @@ export default {
4849
};
4950
</script>
5051
<style >
52+
[v-cloak]{
53+
background: red;
54+
height: 100px;width: 100px;
55+
}
5156
</style>

client/src/components/events/anniversary/index.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
<time>{{ date }}
77
<small v-if="yearsCount > 0"
88
><label>In current year:</label>
9-
<span>{{ yearsCount }}</span></small
10-
>
9+
<span>{{ yearsCount }}</span></small>
1110
</time>
12-
1311
</fieldset>
1412
</template>
1513
</default-index>

client/src/components/feed.vue

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,76 @@
11
<template>
22
<div id="feed">
3-
<!-- <test-component/> -->
4-
<calendar-event
5-
v-for="event in events"
6-
:key="event.id"
7-
:event="event"
8-
v-show="event.isDisplayed"
9-
:class="[{ selected: event.id == selectedEventId }]">
10-
</calendar-event>
3+
<h6 class="date-label"
4+
>#no date<badge>{{ noDateEvents.length }}</badge></h6
5+
>
6+
<template v-for="event in events">
7+
<calendar-event
8+
:key="event.id"
9+
:event="event"
10+
:class="[{ selected: event.id == selectedEventId }]"
11+
>
12+
</calendar-event>
13+
</template>
1114
</div>
1215
</template>
1316

1417
<script>
1518
import calendarEvent from "./calendar.event.vue";
1619
import VueScrollTo from "vue-scrollto";
17-
20+
import Badge from "./ui/badge.vue";
1821
1922
export default {
23+
created() {
24+
this.events.forEach(this.addEvent);
25+
},
2026
props: {
21-
events: Array,
27+
displayedEvents: Array,
2228
selectedEventId: String,
2329
},
2430
components: {
2531
"calendar-event": calendarEvent,
26-
32+
Badge,
2733
},
2834
data() {
29-
return { };
35+
return {
36+
noDateEvents: [],
37+
};
38+
},
39+
computed: {
40+
events() {
41+
return this.$store.getters.events;
42+
},
43+
occurencies() {
44+
return this.$store.getters["occurencies/values"];
45+
},
3046
},
3147
methods: {
48+
removeFrom(array, ev) {
49+
const index = array.findIndex((x) => x.objectId == ev.objectId);
50+
if (index >= 0) this.$delete(array, index);
51+
},
52+
addEvent(ev) {
53+
this.noDateEvents.push(ev);
54+
},
55+
removeEvent(ev) {
56+
this.removeFrom(this.noDateEvents, ev);
57+
},
3258
},
3359
updated() {
34-
if(this.selectedEventId)
60+
if (this.selectedEventId)
3561
VueScrollTo.scrollTo(`#event-${this.selectedEventId}`, 500, {
3662
container: "#feed",
3763
duration: 2000,
3864
});
3965
},
66+
watch: {
67+
events(newEvents, oldEvents) {
68+
const addedEvents = newEvents.filter((e) => !oldEvents.includes(e));
69+
addedEvents.forEach(this.addEvent);
70+
const removedEvents = oldEvents.filter((e) => !newEvents.includes(e));
71+
removedEvents.forEach(this.removeEvent);
72+
},
73+
},
4074
};
4175
</script>
4276

@@ -57,4 +91,9 @@ export default {
5791
grid-column-end: -1;
5892
grid-row: span 12;
5993
}
94+
#feed .date-label {
95+
text-transform: lowercase;
96+
grid-column-start: 1;
97+
grid-column: span 2;
98+
}
6099
</style>

client/src/occurencies.js

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import axios from 'axios'
33
import dateAndTime from 'date-and-time'
44

55
const DEFAULT_DAYS_INTERVAL = 45;
6-
const START_DATE = dateAndTime.addDays(new Date(), - DEFAULT_DAYS_INTERVAL)
7-
const FINISH_DATE = dateAndTime.addDays(new Date(), DEFAULT_DAYS_INTERVAL)
6+
const today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0)
7+
const START_DATE = dateAndTime.addDays(today, - DEFAULT_DAYS_INTERVAL)
8+
const FINISH_DATE = dateAndTime.addDays(today, DEFAULT_DAYS_INTERVAL)
89
const format = (date) => dateAndTime.format(date, 'YYYY-MM-DD');
910

10-
1111
export default {
1212
namespaced: true,
1313
state: {
@@ -18,18 +18,47 @@ export default {
1818
},
1919
getters: {
2020
values: (state) => state.computed || [],
21+
dates: (state) => [...Array(dateAndTime.subtract(state.end, state.start).toDays() + 1).keys()]
22+
.map(x => dateAndTime.addDays(state.start, x)),
23+
byDates: (state, getters) => state.computed ? getters.dates.reduce((current, val) => {
24+
const key = format(val);
25+
current[key] = state.computed.filter(x => dateAndTime.isSameDay(val, new Date(x.dateTime.value)));
26+
return current;
27+
}, {}) : {}
2128
},
2229
mutations: {
2330
retrieve: (state, start, end) => {
31+
state.start = start || state.start;
32+
state.end = end || state.end;
2433
const req = endpoints.occurencies(format(state.start), format(state.end))
25-
state.loading = true;
26-
axios.get(req)
27-
.then(response => {
28-
state.computed = response.data
29-
console.log(state.computed)
30-
})
31-
.catch(err => console.error(`Retrieving occurencies error:`, err));
34+
getOccurencies(state, req);
35+
},
36+
retrievePrevious: (state, start) => {
37+
const reqRight = dateAndTime.addDays(state.start, -1);
38+
state.start = start || dateAndTime.addDays(state.start, -DEFAULT_DAYS_INTERVAL);
39+
const req = endpoints.occurencies(format(state.start), format(reqRight));
40+
getOccurencies(state, req, (state, data) => {
41+
state.unshift(...data);
42+
});
43+
},
44+
retrieveNext: (state, end) => {
45+
const reqLeft = dateAndTime.addDays(state.end, 1);
46+
state.end = end || dateAndTime.addDays(state.end, DEFAULT_DAYS_INTERVAL);
47+
const req = endpoints.occurencies(format(reqLeft), format(state.end));
48+
getOccurencies(state, req, (state, data) => {
49+
state.push(...data);
50+
});
3251
},
3352
clear: (state) => state.computed = null
3453
}
54+
}
55+
56+
function getOccurencies(state, req, transformState = (state, data) => { state.computed = data }) {
57+
state.loading = true;
58+
axios.get(req)
59+
.then(response => {
60+
transformState(state, response.data);
61+
state.loading = false;
62+
})
63+
.catch(err => console.error(`Retrieving occurencies error:`, err));
3564
}

server/controllers/occurencies.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ const computeOccurencies = require('../logic/occurencies.js');
44
const occurencies = async (req, res, next, start, end) => {
55
const objectsCollection = getCollection(req);
66
const values = await objectsCollection.find({ type: /\w*Event/i }).project({ id: true, dates: true, _id: false }).toArray();
7-
const occurencies = values.map(x => computeOccurencies(x.dates, start, end)).reduce((a, b) => a.concat(b), []);
7+
const occurencies = values
8+
.map(x => computeOccurencies(x.dates, start, end))
9+
.reduce((a, b) => a.concat(b), [])
10+
.sort((a, b) => a.dateTime.value - b.dateTime.value);
811
res.json(occurencies);
912
}
1013

0 commit comments

Comments
 (0)